summaryrefslogtreecommitdiffstats
path: root/modules
diff options
context:
space:
mode:
authorZettat123 <zettat123@gmail.com>2023-06-26 14:33:18 +0800
committerGitHub <noreply@github.com>2023-06-26 14:33:18 +0800
commit48e5a74f215d78813a816c57fc5a85a909a003d5 (patch)
treef0be66ae5111de6dc17ea7975e6a592a9b235f3c /modules
parente409e14bdfb56767c9048076f4e818757aab73b9 (diff)
downloadgitea-48e5a74f215d78813a816c57fc5a85a909a003d5.tar.gz
gitea-48e5a74f215d78813a816c57fc5a85a909a003d5.zip
Support `pull_request_target` event (#25229)
Fix #25088 This PR adds the support for [`pull_request_target`](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#pull_request_target) workflow trigger. `pull_request_target` is similar to `pull_request`, but the workflow triggered by the `pull_request_target` event runs in the context of the base branch of the pull request rather than the head branch. Since the workflow from the base is considered trusted, it can access the secrets and doesn't need approvals to run.
Diffstat (limited to 'modules')
-rw-r--r--modules/actions/github.go38
-rw-r--r--modules/actions/github_test.go26
-rw-r--r--modules/actions/workflows.go20
-rw-r--r--modules/actions/workflows_test.go22
4 files changed, 60 insertions, 46 deletions
diff --git a/modules/actions/github.go b/modules/actions/github.go
index f3cb335da9..71f81a8903 100644
--- a/modules/actions/github.go
+++ b/modules/actions/github.go
@@ -8,33 +8,33 @@ import (
)
const (
- githubEventPullRequest = "pull_request"
- githubEventPullRequestTarget = "pull_request_target"
- githubEventPullRequestReviewComment = "pull_request_review_comment"
- githubEventPullRequestReview = "pull_request_review"
- githubEventRegistryPackage = "registry_package"
- githubEventCreate = "create"
- githubEventDelete = "delete"
- githubEventFork = "fork"
- githubEventPush = "push"
- githubEventIssues = "issues"
- githubEventIssueComment = "issue_comment"
- githubEventRelease = "release"
- githubEventPullRequestComment = "pull_request_comment"
- githubEventGollum = "gollum"
+ GithubEventPullRequest = "pull_request"
+ GithubEventPullRequestTarget = "pull_request_target"
+ GithubEventPullRequestReviewComment = "pull_request_review_comment"
+ GithubEventPullRequestReview = "pull_request_review"
+ GithubEventRegistryPackage = "registry_package"
+ GithubEventCreate = "create"
+ GithubEventDelete = "delete"
+ GithubEventFork = "fork"
+ GithubEventPush = "push"
+ GithubEventIssues = "issues"
+ GithubEventIssueComment = "issue_comment"
+ GithubEventRelease = "release"
+ GithubEventPullRequestComment = "pull_request_comment"
+ GithubEventGollum = "gollum"
)
// canGithubEventMatch check if the input Github event can match any Gitea event.
func canGithubEventMatch(eventName string, triggedEvent webhook_module.HookEventType) bool {
switch eventName {
- case githubEventRegistryPackage:
+ case GithubEventRegistryPackage:
return triggedEvent == webhook_module.HookEventPackage
// See https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#gollum
- case githubEventGollum:
+ case GithubEventGollum:
return triggedEvent == webhook_module.HookEventWiki
- case githubEventIssues:
+ case GithubEventIssues:
switch triggedEvent {
case webhook_module.HookEventIssues,
webhook_module.HookEventIssueAssign,
@@ -46,7 +46,7 @@ func canGithubEventMatch(eventName string, triggedEvent webhook_module.HookEvent
return false
}
- case githubEventPullRequest, githubEventPullRequestTarget:
+ case GithubEventPullRequest, GithubEventPullRequestTarget:
switch triggedEvent {
case webhook_module.HookEventPullRequest,
webhook_module.HookEventPullRequestSync,
@@ -58,7 +58,7 @@ func canGithubEventMatch(eventName string, triggedEvent webhook_module.HookEvent
return false
}
- case githubEventPullRequestReview:
+ case GithubEventPullRequestReview:
switch triggedEvent {
case webhook_module.HookEventPullRequestReviewApproved,
webhook_module.HookEventPullRequestReviewComment,
diff --git a/modules/actions/github_test.go b/modules/actions/github_test.go
index e7f4158ae2..4bf55ae03f 100644
--- a/modules/actions/github_test.go
+++ b/modules/actions/github_test.go
@@ -21,85 +21,85 @@ func TestCanGithubEventMatch(t *testing.T) {
// registry_package event
{
"registry_package matches",
- githubEventRegistryPackage,
+ GithubEventRegistryPackage,
webhook_module.HookEventPackage,
true,
},
{
"registry_package cannot match",
- githubEventRegistryPackage,
+ GithubEventRegistryPackage,
webhook_module.HookEventPush,
false,
},
// issues event
{
"issue matches",
- githubEventIssues,
+ GithubEventIssues,
webhook_module.HookEventIssueLabel,
true,
},
{
"issue cannot match",
- githubEventIssues,
+ GithubEventIssues,
webhook_module.HookEventIssueComment,
false,
},
// issue_comment event
{
"issue_comment matches",
- githubEventIssueComment,
+ GithubEventIssueComment,
webhook_module.HookEventIssueComment,
true,
},
{
"issue_comment cannot match",
- githubEventIssueComment,
+ GithubEventIssueComment,
webhook_module.HookEventIssues,
false,
},
// pull_request event
{
"pull_request matches",
- githubEventPullRequest,
+ GithubEventPullRequest,
webhook_module.HookEventPullRequestSync,
true,
},
{
"pull_request cannot match",
- githubEventPullRequest,
+ GithubEventPullRequest,
webhook_module.HookEventPullRequestComment,
false,
},
// pull_request_target event
{
"pull_request_target matches",
- githubEventPullRequest,
+ GithubEventPullRequest,
webhook_module.HookEventPullRequest,
true,
},
{
"pull_request_target cannot match",
- githubEventPullRequest,
+ GithubEventPullRequest,
webhook_module.HookEventPullRequestComment,
false,
},
// pull_request_review event
{
"pull_request_review matches",
- githubEventPullRequestReview,
+ GithubEventPullRequestReview,
webhook_module.HookEventPullRequestReviewComment,
true,
},
{
"pull_request_review cannot match",
- githubEventPullRequestReview,
+ GithubEventPullRequestReview,
webhook_module.HookEventPullRequestComment,
false,
},
// other events
{
"create event",
- githubEventCreate,
+ GithubEventCreate,
webhook_module.HookEventCreate,
true,
},
diff --git a/modules/actions/workflows.go b/modules/actions/workflows.go
index d9459288b1..3786f2a274 100644
--- a/modules/actions/workflows.go
+++ b/modules/actions/workflows.go
@@ -20,6 +20,14 @@ import (
"gopkg.in/yaml.v3"
)
+type DetectedWorkflow struct {
+ EntryName string
+ TriggerEvent string
+ Commit *git.Commit
+ Ref string
+ Content []byte
+}
+
func init() {
model.OnDecodeNodeError = func(node yaml.Node, out interface{}, err error) {
// Log the error instead of panic or fatal.
@@ -89,13 +97,13 @@ func GetEventsFromContent(content []byte) ([]*jobparser.Event, error) {
return events, nil
}
-func DetectWorkflows(commit *git.Commit, triggedEvent webhook_module.HookEventType, payload api.Payloader) (map[string][]byte, error) {
+func DetectWorkflows(commit *git.Commit, triggedEvent webhook_module.HookEventType, payload api.Payloader) ([]*DetectedWorkflow, error) {
entries, err := ListWorkflows(commit)
if err != nil {
return nil, err
}
- workflows := make(map[string][]byte, len(entries))
+ workflows := make([]*DetectedWorkflow, 0, len(entries))
for _, entry := range entries {
content, err := GetContentFromEntry(entry)
if err != nil {
@@ -109,7 +117,13 @@ func DetectWorkflows(commit *git.Commit, triggedEvent webhook_module.HookEventTy
for _, evt := range events {
log.Trace("detect workflow %q for event %#v matching %q", entry.Name(), evt, triggedEvent)
if detectMatched(commit, triggedEvent, payload, evt) {
- workflows[entry.Name()] = content
+ dwf := &DetectedWorkflow{
+ EntryName: entry.Name(),
+ TriggerEvent: evt.Name,
+ Commit: commit,
+ Content: content,
+ }
+ workflows = append(workflows, dwf)
}
}
}
diff --git a/modules/actions/workflows_test.go b/modules/actions/workflows_test.go
index 6ef5d59942..2c374d2c0d 100644
--- a/modules/actions/workflows_test.go
+++ b/modules/actions/workflows_test.go
@@ -23,77 +23,77 @@ func TestDetectMatched(t *testing.T) {
expected bool
}{
{
- desc: "HookEventCreate(create) matches githubEventCreate(create)",
+ desc: "HookEventCreate(create) matches GithubEventCreate(create)",
triggedEvent: webhook_module.HookEventCreate,
payload: nil,
yamlOn: "on: create",
expected: true,
},
{
- desc: "HookEventIssues(issues) `opened` action matches githubEventIssues(issues)",
+ desc: "HookEventIssues(issues) `opened` action matches GithubEventIssues(issues)",
triggedEvent: webhook_module.HookEventIssues,
payload: &api.IssuePayload{Action: api.HookIssueOpened},
yamlOn: "on: issues",
expected: true,
},
{
- desc: "HookEventIssues(issues) `milestoned` action matches githubEventIssues(issues)",
+ desc: "HookEventIssues(issues) `milestoned` action matches GithubEventIssues(issues)",
triggedEvent: webhook_module.HookEventIssues,
payload: &api.IssuePayload{Action: api.HookIssueMilestoned},
yamlOn: "on: issues",
expected: true,
},
{
- desc: "HookEventPullRequestSync(pull_request_sync) matches githubEventPullRequest(pull_request)",
+ desc: "HookEventPullRequestSync(pull_request_sync) matches GithubEventPullRequest(pull_request)",
triggedEvent: webhook_module.HookEventPullRequestSync,
payload: &api.PullRequestPayload{Action: api.HookIssueSynchronized},
yamlOn: "on: pull_request",
expected: true,
},
{
- desc: "HookEventPullRequest(pull_request) `label_updated` action doesn't match githubEventPullRequest(pull_request) with no activity type",
+ desc: "HookEventPullRequest(pull_request) `label_updated` action doesn't match GithubEventPullRequest(pull_request) with no activity type",
triggedEvent: webhook_module.HookEventPullRequest,
payload: &api.PullRequestPayload{Action: api.HookIssueLabelUpdated},
yamlOn: "on: pull_request",
expected: false,
},
{
- desc: "HookEventPullRequest(pull_request) `label_updated` action matches githubEventPullRequest(pull_request) with `label` activity type",
+ desc: "HookEventPullRequest(pull_request) `label_updated` action matches GithubEventPullRequest(pull_request) with `label` activity type",
triggedEvent: webhook_module.HookEventPullRequest,
payload: &api.PullRequestPayload{Action: api.HookIssueLabelUpdated},
yamlOn: "on:\n pull_request:\n types: [labeled]",
expected: true,
},
{
- desc: "HookEventPullRequestReviewComment(pull_request_review_comment) matches githubEventPullRequestReviewComment(pull_request_review_comment)",
+ desc: "HookEventPullRequestReviewComment(pull_request_review_comment) matches GithubEventPullRequestReviewComment(pull_request_review_comment)",
triggedEvent: webhook_module.HookEventPullRequestReviewComment,
payload: &api.PullRequestPayload{Action: api.HookIssueReviewed},
yamlOn: "on:\n pull_request_review_comment:\n types: [created]",
expected: true,
},
{
- desc: "HookEventPullRequestReviewRejected(pull_request_review_rejected) doesn't match githubEventPullRequestReview(pull_request_review) with `dismissed` activity type (we don't support `dismissed` at present)",
+ desc: "HookEventPullRequestReviewRejected(pull_request_review_rejected) doesn't match GithubEventPullRequestReview(pull_request_review) with `dismissed` activity type (we don't support `dismissed` at present)",
triggedEvent: webhook_module.HookEventPullRequestReviewRejected,
payload: &api.PullRequestPayload{Action: api.HookIssueReviewed},
yamlOn: "on:\n pull_request_review:\n types: [dismissed]",
expected: false,
},
{
- desc: "HookEventRelease(release) `published` action matches githubEventRelease(release) with `published` activity type",
+ desc: "HookEventRelease(release) `published` action matches GithubEventRelease(release) with `published` activity type",
triggedEvent: webhook_module.HookEventRelease,
payload: &api.ReleasePayload{Action: api.HookReleasePublished},
yamlOn: "on:\n release:\n types: [published]",
expected: true,
},
{
- desc: "HookEventPackage(package) `created` action doesn't match githubEventRegistryPackage(registry_package) with `updated` activity type",
+ desc: "HookEventPackage(package) `created` action doesn't match GithubEventRegistryPackage(registry_package) with `updated` activity type",
triggedEvent: webhook_module.HookEventPackage,
payload: &api.PackagePayload{Action: api.HookPackageCreated},
yamlOn: "on:\n registry_package:\n types: [updated]",
expected: false,
},
{
- desc: "HookEventWiki(wiki) matches githubEventGollum(gollum)",
+ desc: "HookEventWiki(wiki) matches GithubEventGollum(gollum)",
triggedEvent: webhook_module.HookEventWiki,
payload: nil,
yamlOn: "on: gollum",