diff --git a/modules/webhook/type.go b/modules/webhook/type.go index 244dc423c1..fa1a4c07b3 100644 --- a/modules/webhook/type.go +++ b/modules/webhook/type.go @@ -8,31 +8,33 @@ type HookEventType string // Types of hook events const ( - HookEventCreate HookEventType = "create" - HookEventDelete HookEventType = "delete" - HookEventFork HookEventType = "fork" - HookEventPush HookEventType = "push" - HookEventIssues HookEventType = "issues" - HookEventIssueAssign HookEventType = "issue_assign" - HookEventIssueLabel HookEventType = "issue_label" - HookEventIssueMilestone HookEventType = "issue_milestone" - HookEventIssueComment HookEventType = "issue_comment" - HookEventPullRequest HookEventType = "pull_request" - HookEventPullRequestAssign HookEventType = "pull_request_assign" - HookEventPullRequestLabel HookEventType = "pull_request_label" - HookEventPullRequestMilestone HookEventType = "pull_request_milestone" - HookEventPullRequestComment HookEventType = "pull_request_comment" - HookEventPullRequestReviewApproved HookEventType = "pull_request_review_approved" - HookEventPullRequestReviewRejected HookEventType = "pull_request_review_rejected" - HookEventPullRequestReviewComment HookEventType = "pull_request_review_comment" - HookEventPullRequestSync HookEventType = "pull_request_sync" - HookEventPullRequestReviewRequest HookEventType = "pull_request_review_request" - HookEventWiki HookEventType = "wiki" - HookEventRepository HookEventType = "repository" - HookEventRelease HookEventType = "release" - HookEventPackage HookEventType = "package" - HookEventSchedule HookEventType = "schedule" - HookEventWorkflowDispatch HookEventType = "workflow_dispatch" + HookEventCreate HookEventType = "create" + HookEventDelete HookEventType = "delete" + HookEventFork HookEventType = "fork" + HookEventPush HookEventType = "push" + HookEventIssues HookEventType = "issues" + HookEventIssueAssign HookEventType = "issue_assign" + HookEventIssueLabel HookEventType = "issue_label" + HookEventIssueMilestone HookEventType = "issue_milestone" + HookEventIssueComment HookEventType = "issue_comment" + HookEventPullRequest HookEventType = "pull_request" + HookEventPullRequestAssign HookEventType = "pull_request_assign" + HookEventPullRequestLabel HookEventType = "pull_request_label" + HookEventPullRequestMilestone HookEventType = "pull_request_milestone" + HookEventPullRequestComment HookEventType = "pull_request_comment" + HookEventPullRequestReviewApproved HookEventType = "pull_request_review_approved" + HookEventPullRequestReviewRejected HookEventType = "pull_request_review_rejected" + HookEventPullRequestReviewComment HookEventType = "pull_request_review_comment" + HookEventPullRequestSync HookEventType = "pull_request_sync" + HookEventPullRequestReviewRequest HookEventType = "pull_request_review_request" + HookEventWiki HookEventType = "wiki" + HookEventRepository HookEventType = "repository" + HookEventRelease HookEventType = "release" + HookEventPackage HookEventType = "package" + HookEventSchedule HookEventType = "schedule" + HookEventWorkflowDispatch HookEventType = "workflow_dispatch" + HookEventActionRunSuccessAfterFailure HookEventType = "action_run_success_after_failur" + HookEventActionRunFailure HookEventType = "action_run_hook_event_failure" ) // Event returns the HookEventType as an event string @@ -65,6 +67,10 @@ func (h HookEventType) Event() string { return "repository" case HookEventRelease: return "release" + case HookEventActionRunSuccessAfterFailure: + return "action_run_success_after_failur" + case HookEventActionRunFailure: + return "action_run_hook_event_failure" } return "" } diff --git a/services/webhook/notifier.go b/services/webhook/notifier.go index e9fd52c940..0f8c68a6c7 100644 --- a/services/webhook/notifier.go +++ b/services/webhook/notifier.go @@ -6,6 +6,7 @@ package webhook import ( "context" + actions_model "forgejo.org/models/actions" issues_model "forgejo.org/models/issues" packages_model "forgejo.org/models/packages" "forgejo.org/models/perm" @@ -887,6 +888,27 @@ func (m *webhookNotifier) PackageDelete(ctx context.Context, doer *user_model.Us notifyPackage(ctx, doer, pd, api.HookPackageDeleted) } +func (m *webhookNotifier) ActionRunNowDone(ctx context.Context, run *actions_model.ActionRun, priorStatus actions_model.Status, lastRun *actions_model.ActionRun) { + source := EventSource{ + Repository: run.Repo, + Owner: run.TriggerUser, + } + + if run.Status.IsSuccess() { + if lastRun.Status.IsSuccess() { + return + } + + if err := PrepareWebhooks(ctx, source, webhook_module.HookEventActionRunSuccessAfterFailure, &api.PackagePayload{}); err != nil { + log.Error("PrepareWebhooks: %v", err) + } + } else { + if err := PrepareWebhooks(ctx, source, webhook_module.HookEventActionRunFailure, &api.PackagePayload{}); err != nil { + log.Error("PrepareWebhooks: %v", err) + } + } +} + func notifyPackage(ctx context.Context, sender *user_model.User, pd *packages_model.PackageDescriptor, action api.HookPackageAction) { source := EventSource{ Repository: pd.Repository, diff --git a/services/webhook/shared/payloader.go b/services/webhook/shared/payloader.go index 0a6535eddb..9251960ffc 100644 --- a/services/webhook/shared/payloader.go +++ b/services/webhook/shared/payloader.go @@ -36,6 +36,7 @@ type PayloadConvertor[T any] interface { Release(*api.ReleasePayload) (T, error) Wiki(*api.WikiPayload) (T, error) Package(*api.PackagePayload) (T, error) + Action(*api.PackagePayload) (T, error) } func convertUnmarshalledJSON[T, P any](convert func(P) (T, error), data []byte) (T, error) { @@ -86,6 +87,8 @@ func NewPayload[T any](rc PayloadConvertor[T], data []byte, event webhook_module return convertUnmarshalledJSON(rc.Wiki, data) case webhook_module.HookEventPackage: return convertUnmarshalledJSON(rc.Package, data) + case webhook_module.HookEventActionRunSuccessAfterFailure, webhook_module.HookEventActionRunFailure: + return convertUnmarshalledJSON(rc.Action, data) } var t T return t, fmt.Errorf("newPayload unsupported event: %s", event) diff --git a/services/webhook/slack.go b/services/webhook/slack.go index e854f89c6c..475ac336de 100644 --- a/services/webhook/slack.go +++ b/services/webhook/slack.go @@ -142,6 +142,7 @@ func SlackLinkToRef(repoURL, ref string) string { return SlackLinkFormatter(url, refName) } +// TODO: fix spelling to Converter // Create implements payloadConvertor Create method func (s slackConvertor) Create(p *api.CreatePayload) (SlackPayload, error) { refLink := SlackLinkToRef(p.Repo.HTMLURL, p.Ref) diff --git a/services/webhook/webhook.go b/services/webhook/webhook.go index 989b535564..ecbbfcfbd6 100644 --- a/services/webhook/webhook.go +++ b/services/webhook/webhook.go @@ -103,7 +103,7 @@ type EventSource struct { Owner *user_model.User } -// handle delivers hook tasks +// handler delivers hook tasks func handler(items ...int64) []int64 { ctx := graceful.GetManager().HammerContext()