You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

actions_trigger_test.go 10KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  1. // Copyright 2023 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package integration
  4. import (
  5. "net/url"
  6. "strings"
  7. "testing"
  8. "time"
  9. actions_model "code.gitea.io/gitea/models/actions"
  10. "code.gitea.io/gitea/models/db"
  11. git_model "code.gitea.io/gitea/models/git"
  12. issues_model "code.gitea.io/gitea/models/issues"
  13. repo_model "code.gitea.io/gitea/models/repo"
  14. unit_model "code.gitea.io/gitea/models/unit"
  15. "code.gitea.io/gitea/models/unittest"
  16. user_model "code.gitea.io/gitea/models/user"
  17. actions_module "code.gitea.io/gitea/modules/actions"
  18. "code.gitea.io/gitea/modules/git"
  19. pull_service "code.gitea.io/gitea/services/pull"
  20. release_service "code.gitea.io/gitea/services/release"
  21. repo_service "code.gitea.io/gitea/services/repository"
  22. files_service "code.gitea.io/gitea/services/repository/files"
  23. "github.com/stretchr/testify/assert"
  24. )
  25. func TestPullRequestTargetEvent(t *testing.T) {
  26. onGiteaRun(t, func(t *testing.T, u *url.URL) {
  27. user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2}) // owner of the base repo
  28. org3 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 3}) // owner of the forked repo
  29. // create the base repo
  30. baseRepo, err := repo_service.CreateRepository(db.DefaultContext, user2, user2, repo_service.CreateRepoOptions{
  31. Name: "repo-pull-request-target",
  32. Description: "test pull-request-target event",
  33. AutoInit: true,
  34. Gitignores: "Go",
  35. License: "MIT",
  36. Readme: "Default",
  37. DefaultBranch: "main",
  38. IsPrivate: false,
  39. })
  40. assert.NoError(t, err)
  41. assert.NotEmpty(t, baseRepo)
  42. // enable actions
  43. err = repo_service.UpdateRepositoryUnits(db.DefaultContext, baseRepo, []repo_model.RepoUnit{{
  44. RepoID: baseRepo.ID,
  45. Type: unit_model.TypeActions,
  46. }}, nil)
  47. assert.NoError(t, err)
  48. // create the forked repo
  49. forkedRepo, err := repo_service.ForkRepository(git.DefaultContext, user2, org3, repo_service.ForkRepoOptions{
  50. BaseRepo: baseRepo,
  51. Name: "forked-repo-pull-request-target",
  52. Description: "test pull-request-target event",
  53. })
  54. assert.NoError(t, err)
  55. assert.NotEmpty(t, forkedRepo)
  56. // add workflow file to the base repo
  57. addWorkflowToBaseResp, err := files_service.ChangeRepoFiles(git.DefaultContext, baseRepo, user2, &files_service.ChangeRepoFilesOptions{
  58. Files: []*files_service.ChangeRepoFile{
  59. {
  60. Operation: "create",
  61. TreePath: ".gitea/workflows/pr.yml",
  62. ContentReader: strings.NewReader("name: test\non:\n pull_request_target:\n paths:\n - 'file_*.txt'\njobs:\n test:\n runs-on: ubuntu-latest\n steps:\n - run: echo helloworld\n"),
  63. },
  64. },
  65. Message: "add workflow",
  66. OldBranch: "main",
  67. NewBranch: "main",
  68. Author: &files_service.IdentityOptions{
  69. Name: user2.Name,
  70. Email: user2.Email,
  71. },
  72. Committer: &files_service.IdentityOptions{
  73. Name: user2.Name,
  74. Email: user2.Email,
  75. },
  76. Dates: &files_service.CommitDateOptions{
  77. Author: time.Now(),
  78. Committer: time.Now(),
  79. },
  80. })
  81. assert.NoError(t, err)
  82. assert.NotEmpty(t, addWorkflowToBaseResp)
  83. // add a new file to the forked repo
  84. addFileToForkedResp, err := files_service.ChangeRepoFiles(git.DefaultContext, forkedRepo, org3, &files_service.ChangeRepoFilesOptions{
  85. Files: []*files_service.ChangeRepoFile{
  86. {
  87. Operation: "create",
  88. TreePath: "file_1.txt",
  89. ContentReader: strings.NewReader("file1"),
  90. },
  91. },
  92. Message: "add file1",
  93. OldBranch: "main",
  94. NewBranch: "fork-branch-1",
  95. Author: &files_service.IdentityOptions{
  96. Name: org3.Name,
  97. Email: org3.Email,
  98. },
  99. Committer: &files_service.IdentityOptions{
  100. Name: org3.Name,
  101. Email: org3.Email,
  102. },
  103. Dates: &files_service.CommitDateOptions{
  104. Author: time.Now(),
  105. Committer: time.Now(),
  106. },
  107. })
  108. assert.NoError(t, err)
  109. assert.NotEmpty(t, addFileToForkedResp)
  110. // create Pull
  111. pullIssue := &issues_model.Issue{
  112. RepoID: baseRepo.ID,
  113. Title: "Test pull-request-target-event",
  114. PosterID: org3.ID,
  115. Poster: org3,
  116. IsPull: true,
  117. }
  118. pullRequest := &issues_model.PullRequest{
  119. HeadRepoID: forkedRepo.ID,
  120. BaseRepoID: baseRepo.ID,
  121. HeadBranch: "fork-branch-1",
  122. BaseBranch: "main",
  123. HeadRepo: forkedRepo,
  124. BaseRepo: baseRepo,
  125. Type: issues_model.PullRequestGitea,
  126. }
  127. err = pull_service.NewPullRequest(git.DefaultContext, baseRepo, pullIssue, nil, nil, pullRequest, nil)
  128. assert.NoError(t, err)
  129. // load and compare ActionRun
  130. assert.Equal(t, 1, unittest.GetCount(t, &actions_model.ActionRun{RepoID: baseRepo.ID}))
  131. actionRun := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRun{RepoID: baseRepo.ID})
  132. assert.Equal(t, addFileToForkedResp.Commit.SHA, actionRun.CommitSHA)
  133. assert.Equal(t, actions_module.GithubEventPullRequestTarget, actionRun.TriggerEvent)
  134. // add another file whose name cannot match the specified path
  135. addFileToForkedResp, err = files_service.ChangeRepoFiles(git.DefaultContext, forkedRepo, org3, &files_service.ChangeRepoFilesOptions{
  136. Files: []*files_service.ChangeRepoFile{
  137. {
  138. Operation: "create",
  139. TreePath: "foo.txt",
  140. ContentReader: strings.NewReader("foo"),
  141. },
  142. },
  143. Message: "add foo.txt",
  144. OldBranch: "main",
  145. NewBranch: "fork-branch-2",
  146. Author: &files_service.IdentityOptions{
  147. Name: org3.Name,
  148. Email: org3.Email,
  149. },
  150. Committer: &files_service.IdentityOptions{
  151. Name: org3.Name,
  152. Email: org3.Email,
  153. },
  154. Dates: &files_service.CommitDateOptions{
  155. Author: time.Now(),
  156. Committer: time.Now(),
  157. },
  158. })
  159. assert.NoError(t, err)
  160. assert.NotEmpty(t, addFileToForkedResp)
  161. // create Pull
  162. pullIssue = &issues_model.Issue{
  163. RepoID: baseRepo.ID,
  164. Title: "A mismatched path cannot trigger pull-request-target-event",
  165. PosterID: org3.ID,
  166. Poster: org3,
  167. IsPull: true,
  168. }
  169. pullRequest = &issues_model.PullRequest{
  170. HeadRepoID: forkedRepo.ID,
  171. BaseRepoID: baseRepo.ID,
  172. HeadBranch: "fork-branch-2",
  173. BaseBranch: "main",
  174. HeadRepo: forkedRepo,
  175. BaseRepo: baseRepo,
  176. Type: issues_model.PullRequestGitea,
  177. }
  178. err = pull_service.NewPullRequest(git.DefaultContext, baseRepo, pullIssue, nil, nil, pullRequest, nil)
  179. assert.NoError(t, err)
  180. // the new pull request cannot trigger actions, so there is still only 1 record
  181. assert.Equal(t, 1, unittest.GetCount(t, &actions_model.ActionRun{RepoID: baseRepo.ID}))
  182. })
  183. }
  184. func TestCreateDeleteRefEvent(t *testing.T) {
  185. onGiteaRun(t, func(t *testing.T, u *url.URL) {
  186. user2 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 2})
  187. // create the repo
  188. repo, err := repo_service.CreateRepository(db.DefaultContext, user2, user2, repo_service.CreateRepoOptions{
  189. Name: "create-delete-ref-event",
  190. Description: "test create delete ref ci event",
  191. AutoInit: true,
  192. Gitignores: "Go",
  193. License: "MIT",
  194. Readme: "Default",
  195. DefaultBranch: "main",
  196. IsPrivate: false,
  197. })
  198. assert.NoError(t, err)
  199. assert.NotEmpty(t, repo)
  200. // enable actions
  201. err = repo_service.UpdateRepositoryUnits(db.DefaultContext, repo, []repo_model.RepoUnit{{
  202. RepoID: repo.ID,
  203. Type: unit_model.TypeActions,
  204. }}, nil)
  205. assert.NoError(t, err)
  206. // reload units
  207. repo.Units = nil
  208. assert.NoError(t, repo.LoadUnits(db.DefaultContext))
  209. // add workflow file to the repo
  210. addWorkflowToBaseResp, err := files_service.ChangeRepoFiles(git.DefaultContext, repo, user2, &files_service.ChangeRepoFilesOptions{
  211. Files: []*files_service.ChangeRepoFile{
  212. {
  213. Operation: "create",
  214. TreePath: ".gitea/workflows/createdelete.yml",
  215. ContentReader: strings.NewReader("name: test\non:\n [create,delete]\njobs:\n test:\n runs-on: ubuntu-latest\n steps:\n - run: echo helloworld\n"),
  216. },
  217. },
  218. Message: "add workflow",
  219. OldBranch: "main",
  220. NewBranch: "main",
  221. Author: &files_service.IdentityOptions{
  222. Name: user2.Name,
  223. Email: user2.Email,
  224. },
  225. Committer: &files_service.IdentityOptions{
  226. Name: user2.Name,
  227. Email: user2.Email,
  228. },
  229. Dates: &files_service.CommitDateOptions{
  230. Author: time.Now(),
  231. Committer: time.Now(),
  232. },
  233. })
  234. assert.NoError(t, err)
  235. assert.NotEmpty(t, addWorkflowToBaseResp)
  236. // Get the commit ID of the default branch
  237. gitRepo, err := git.OpenRepository(git.DefaultContext, repo_model.RepoPath(user2.Name, repo.Name))
  238. assert.NoError(t, err)
  239. defer gitRepo.Close()
  240. branch, err := git_model.GetBranch(db.DefaultContext, repo.ID, repo.DefaultBranch)
  241. assert.NoError(t, err)
  242. // create a branch
  243. err = repo_service.CreateNewBranchFromCommit(db.DefaultContext, user2, repo, gitRepo, branch.CommitID, "test-create-branch")
  244. assert.NoError(t, err)
  245. run := unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRun{
  246. Title: "add workflow",
  247. RepoID: repo.ID,
  248. Event: "create",
  249. Ref: "refs/heads/test-create-branch",
  250. WorkflowID: "createdelete.yml",
  251. CommitSHA: branch.CommitID,
  252. })
  253. assert.NotNil(t, run)
  254. // create a tag
  255. err = release_service.CreateNewTag(db.DefaultContext, user2, repo, branch.CommitID, "test-create-tag", "test create tag event")
  256. assert.NoError(t, err)
  257. run = unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRun{
  258. Title: "add workflow",
  259. RepoID: repo.ID,
  260. Event: "create",
  261. Ref: "refs/tags/test-create-tag",
  262. WorkflowID: "createdelete.yml",
  263. CommitSHA: branch.CommitID,
  264. })
  265. assert.NotNil(t, run)
  266. // delete the branch
  267. err = repo_service.DeleteBranch(db.DefaultContext, user2, repo, gitRepo, "test-create-branch")
  268. assert.NoError(t, err)
  269. run = unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRun{
  270. Title: "add workflow",
  271. RepoID: repo.ID,
  272. Event: "delete",
  273. Ref: "main",
  274. WorkflowID: "createdelete.yml",
  275. CommitSHA: branch.CommitID,
  276. })
  277. assert.NotNil(t, run)
  278. // delete the tag
  279. tag, err := repo_model.GetRelease(db.DefaultContext, repo.ID, "test-create-tag")
  280. assert.NoError(t, err)
  281. err = release_service.DeleteReleaseByID(db.DefaultContext, repo, tag, user2, true)
  282. assert.NoError(t, err)
  283. run = unittest.AssertExistsAndLoadBean(t, &actions_model.ActionRun{
  284. Title: "add workflow",
  285. RepoID: repo.ID,
  286. Event: "delete",
  287. Ref: "main",
  288. WorkflowID: "createdelete.yml",
  289. CommitSHA: branch.CommitID,
  290. })
  291. assert.NotNil(t, run)
  292. })
  293. }