-
-
Notifications
You must be signed in to change notification settings - Fork 5.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add workflow_job webhook #33694
base: main
Are you sure you want to change the base?
Add workflow_job webhook #33694
Conversation
fixup initial working draft Add more fields More Complete
BTW, I might need help write tests these for webhooks. This can get complex for me. Example Webhooks (two jobs, one depends on the other){
"action": "queued",
"workflow_job": {
"id": 344,
"run_id": 825,
"run_url": "http://localhost:3000/test/private-repo/actions/runs/10",
"name": "download",
"labels": [
"ephemeral"
],
"run_attempt": 2,
"head_sha": "a33e70fae58cce6ddf3a3e4c33e7be4fe5ea1533",
"head_branch": "ephemeral",
"runner_id": 0,
"runner_name": "",
"steps": null,
"created_at": "2025-02-23T14:51:50Z",
"started_at": "1970-01-01T00:00:00Z",
"completed_at": "1970-01-01T00:00:00Z"
},
"repository": {
"id": 65,
"owner": {
"id": 43,
"login": "test",
"login_name": "",
"source_id": 0,
"full_name": "",
"email": "test@test.com",
"avatar_url": "http://localhost:3000/avatars/b642b4217b34b1e8d3bd915fc65c4452",
"html_url": "http://localhost:3000/test",
"language": "",
"is_admin": false,
"last_login": "0001-01-01T00:00:00Z",
"created": "2025-02-10T13:25:00+01:00",
"restricted": false,
"active": false,
"prohibit_login": false,
"location": "",
"website": "",
"description": "",
"visibility": "public",
"followers_count": 0,
"following_count": 0,
"starred_repos_count": 0,
"username": "test"
},
"name": "private-repo",
"full_name": "test/private-repo",
"description": "",
"empty": false,
"private": true,
"fork": false,
"template": false,
"parent": null,
"mirror": false,
"size": 33,
"language": "",
"languages_url": "http://localhost:3000/api/v1/repos/test/private-repo/languages",
"html_url": "http://localhost:3000/test/private-repo",
"url": "http://localhost:3000/api/v1/repos/test/private-repo",
"link": "",
"ssh_url": "christopher@localhost:test/private-repo.git",
"clone_url": "http://localhost:3000/test/private-repo.git",
"original_url": "",
"website": "",
"stars_count": 0,
"forks_count": 0,
"watchers_count": 1,
"open_issues_count": 0,
"open_pr_counter": 0,
"release_counter": 0,
"default_branch": "main",
"archived": false,
"created_at": "2025-02-10T20:40:44+01:00",
"updated_at": "2025-02-23T19:37:50+01:00",
"archived_at": "1970-01-01T01:00:00+01:00",
"permissions": {
"admin": true,
"push": true,
"pull": true
},
"has_issues": true,
"internal_tracker": {
"enable_time_tracker": true,
"allow_only_contributors_to_track_time": true,
"enable_issue_dependencies": true
},
"has_wiki": true,
"has_pull_requests": true,
"has_projects": true,
"projects_mode": "all",
"has_releases": true,
"has_packages": true,
"has_actions": true,
"ignore_whitespace_conflicts": false,
"allow_merge_commits": true,
"allow_rebase": true,
"allow_rebase_explicit": true,
"allow_squash_merge": true,
"allow_fast_forward_only_merge": true,
"allow_rebase_update": true,
"default_delete_branch_after_merge": false,
"default_merge_style": "merge",
"default_allow_maintainer_edit": false,
"avatar_url": "",
"internal": false,
"mirror_interval": "",
"object_format_name": "sha1",
"mirror_updated": "0001-01-01T00:00:00Z",
"repo_transfer": null,
"topics": [],
"licenses": null
},
"sender": {
"id": 43,
"login": "test",
"login_name": "",
"source_id": 0,
"full_name": "",
"email": "test@noreply.localhost",
"avatar_url": "http://localhost:3000/avatars/b642b4217b34b1e8d3bd915fc65c4452",
"html_url": "http://localhost:3000/test",
"language": "",
"is_admin": false,
"last_login": "0001-01-01T00:00:00Z",
"created": "2025-02-10T13:25:00+01:00",
"restricted": false,
"active": false,
"prohibit_login": false,
"location": "",
"website": "",
"description": "",
"visibility": "public",
"followers_count": 0,
"following_count": 0,
"starred_repos_count": 0,
"username": "test"
}
} {
"action": "completed",
"workflow_job": {
"id": 343,
"run_id": 825,
"run_url": "http://localhost:3000/test/private-repo/actions/runs/10",
"name": "_",
"labels": [
"ephemeral"
],
"run_attempt": 3,
"head_sha": "a33e70fae58cce6ddf3a3e4c33e7be4fe5ea1533",
"head_branch": "ephemeral",
"conclusion": "success",
"runner_id": 194,
"runner_name": "",
"steps": [
{
"name": "christopherhx/gitea-upload-artifact@v4",
"number": 0,
"conclusion": "success",
"started_at": "2025-02-23T18:37:48Z",
"completed_at": "2025-02-23T18:37:49Z"
}
],
"created_at": "2025-02-23T14:51:50Z",
"started_at": "2025-02-23T18:37:48Z",
"completed_at": "2025-02-23T18:37:49Z"
},
"repository": {
"id": 65,
"owner": {
"id": 43,
"login": "test",
"login_name": "",
"source_id": 0,
"full_name": "",
"email": "test@test.com",
"avatar_url": "http://localhost:3000/avatars/b642b4217b34b1e8d3bd915fc65c4452",
"html_url": "http://localhost:3000/test",
"language": "",
"is_admin": false,
"last_login": "0001-01-01T00:00:00Z",
"created": "2025-02-10T13:25:00+01:00",
"restricted": false,
"active": false,
"prohibit_login": false,
"location": "",
"website": "",
"description": "",
"visibility": "public",
"followers_count": 0,
"following_count": 0,
"starred_repos_count": 0,
"username": "test"
},
"name": "private-repo",
"full_name": "test/private-repo",
"description": "",
"empty": false,
"private": true,
"fork": false,
"template": false,
"parent": null,
"mirror": false,
"size": 33,
"language": "",
"languages_url": "http://localhost:3000/api/v1/repos/test/private-repo/languages",
"html_url": "http://localhost:3000/test/private-repo",
"url": "http://localhost:3000/api/v1/repos/test/private-repo",
"link": "",
"ssh_url": "christopher@localhost:test/private-repo.git",
"clone_url": "http://localhost:3000/test/private-repo.git",
"original_url": "",
"website": "",
"stars_count": 0,
"forks_count": 0,
"watchers_count": 1,
"open_issues_count": 0,
"open_pr_counter": 0,
"release_counter": 0,
"default_branch": "main",
"archived": false,
"created_at": "2025-02-10T20:40:44+01:00",
"updated_at": "2025-02-23T19:37:49+01:00",
"archived_at": "1970-01-01T01:00:00+01:00",
"permissions": {
"admin": true,
"push": true,
"pull": true
},
"has_issues": true,
"internal_tracker": {
"enable_time_tracker": true,
"allow_only_contributors_to_track_time": true,
"enable_issue_dependencies": true
},
"has_wiki": true,
"has_pull_requests": true,
"has_projects": true,
"projects_mode": "all",
"has_releases": true,
"has_packages": true,
"has_actions": true,
"ignore_whitespace_conflicts": false,
"allow_merge_commits": true,
"allow_rebase": true,
"allow_rebase_explicit": true,
"allow_squash_merge": true,
"allow_fast_forward_only_merge": true,
"allow_rebase_update": true,
"default_delete_branch_after_merge": false,
"default_merge_style": "merge",
"default_allow_maintainer_edit": false,
"avatar_url": "",
"internal": false,
"mirror_interval": "",
"object_format_name": "sha1",
"mirror_updated": "0001-01-01T00:00:00Z",
"repo_transfer": null,
"topics": [],
"licenses": null
},
"sender": {
"id": 43,
"login": "test",
"login_name": "",
"source_id": 0,
"full_name": "",
"email": "test@noreply.localhost",
"avatar_url": "http://localhost:3000/avatars/b642b4217b34b1e8d3bd915fc65c4452",
"html_url": "http://localhost:3000/test",
"language": "",
"is_admin": false,
"last_login": "0001-01-01T00:00:00Z",
"created": "2025-02-10T13:25:00+01:00",
"restricted": false,
"active": false,
"prohibit_login": false,
"location": "",
"website": "",
"description": "",
"visibility": "public",
"followers_count": 0,
"following_count": 0,
"starred_repos_count": 0,
"username": "test"
}
} {
"action": "in_progress",
"workflow_job": {
"id": 343,
"run_id": 825,
"run_url": "http://localhost:3000/test/private-repo/actions/runs/10",
"name": "_",
"labels": [
"ephemeral"
],
"run_attempt": 3,
"head_sha": "a33e70fae58cce6ddf3a3e4c33e7be4fe5ea1533",
"head_branch": "ephemeral",
"runner_id": 194,
"runner_name": "",
"steps": [
{
"name": "christopherhx/gitea-upload-artifact@v4",
"number": 0,
"started_at": "1970-01-01T00:00:00Z",
"completed_at": "1970-01-01T00:00:00Z"
}
],
"created_at": "2025-02-23T14:51:50Z",
"started_at": "2025-02-23T18:37:48Z",
"completed_at": "1970-01-01T00:00:00Z"
},
"repository": {
"id": 65,
"owner": {
"id": 43,
"login": "test",
"login_name": "",
"source_id": 0,
"full_name": "",
"email": "test@test.com",
"avatar_url": "http://localhost:3000/avatars/b642b4217b34b1e8d3bd915fc65c4452",
"html_url": "http://localhost:3000/test",
"language": "",
"is_admin": false,
"last_login": "0001-01-01T00:00:00Z",
"created": "2025-02-10T13:25:00+01:00",
"restricted": false,
"active": false,
"prohibit_login": false,
"location": "",
"website": "",
"description": "",
"visibility": "public",
"followers_count": 0,
"following_count": 0,
"starred_repos_count": 0,
"username": "test"
},
"name": "private-repo",
"full_name": "test/private-repo",
"description": "",
"empty": false,
"private": true,
"fork": false,
"template": false,
"parent": null,
"mirror": false,
"size": 33,
"language": "",
"languages_url": "http://localhost:3000/api/v1/repos/test/private-repo/languages",
"html_url": "http://localhost:3000/test/private-repo",
"url": "http://localhost:3000/api/v1/repos/test/private-repo",
"link": "",
"ssh_url": "christopher@localhost:test/private-repo.git",
"clone_url": "http://localhost:3000/test/private-repo.git",
"original_url": "",
"website": "",
"stars_count": 0,
"forks_count": 0,
"watchers_count": 1,
"open_issues_count": 0,
"open_pr_counter": 0,
"release_counter": 0,
"default_branch": "main",
"archived": false,
"created_at": "2025-02-10T20:40:44+01:00",
"updated_at": "2025-02-23T19:37:46+01:00",
"archived_at": "1970-01-01T01:00:00+01:00",
"permissions": {
"admin": true,
"push": true,
"pull": true
},
"has_issues": true,
"internal_tracker": {
"enable_time_tracker": true,
"allow_only_contributors_to_track_time": true,
"enable_issue_dependencies": true
},
"has_wiki": true,
"has_pull_requests": true,
"has_projects": true,
"projects_mode": "all",
"has_releases": true,
"has_packages": true,
"has_actions": true,
"ignore_whitespace_conflicts": false,
"allow_merge_commits": true,
"allow_rebase": true,
"allow_rebase_explicit": true,
"allow_squash_merge": true,
"allow_fast_forward_only_merge": true,
"allow_rebase_update": true,
"default_delete_branch_after_merge": false,
"default_merge_style": "merge",
"default_allow_maintainer_edit": false,
"avatar_url": "",
"internal": false,
"mirror_interval": "",
"object_format_name": "sha1",
"mirror_updated": "0001-01-01T00:00:00Z",
"repo_transfer": null,
"topics": [],
"licenses": null
},
"sender": {
"id": 43,
"login": "test",
"login_name": "",
"source_id": 0,
"full_name": "",
"email": "test@noreply.localhost",
"avatar_url": "http://localhost:3000/avatars/b642b4217b34b1e8d3bd915fc65c4452",
"html_url": "http://localhost:3000/test",
"language": "",
"is_admin": false,
"last_login": "0001-01-01T00:00:00Z",
"created": "2025-02-10T13:25:00+01:00",
"restricted": false,
"active": false,
"prohibit_login": false,
"location": "",
"website": "",
"description": "",
"visibility": "public",
"followers_count": 0,
"following_count": 0,
"starred_repos_count": 0,
"username": "test"
}
} {
"action": "waiting",
"workflow_job": {
"id": 344,
"run_id": 825,
"run_url": "http://localhost:3000/test/private-repo/actions/runs/10",
"name": "download",
"labels": [
"ephemeral"
],
"run_attempt": 2,
"head_sha": "a33e70fae58cce6ddf3a3e4c33e7be4fe5ea1533",
"head_branch": "ephemeral",
"runner_id": 0,
"runner_name": "",
"steps": null,
"created_at": "2025-02-23T14:51:50Z",
"started_at": "1970-01-01T00:00:00Z",
"completed_at": "1970-01-01T00:00:00Z"
},
"repository": {
"id": 65,
"owner": {
"id": 43,
"login": "test",
"login_name": "",
"source_id": 0,
"full_name": "",
"email": "test@test.com",
"avatar_url": "http://localhost:3000/avatars/b642b4217b34b1e8d3bd915fc65c4452",
"html_url": "http://localhost:3000/test",
"language": "",
"is_admin": false,
"last_login": "0001-01-01T00:00:00Z",
"created": "2025-02-10T13:25:00+01:00",
"restricted": false,
"active": false,
"prohibit_login": false,
"location": "",
"website": "",
"description": "",
"visibility": "public",
"followers_count": 0,
"following_count": 0,
"starred_repos_count": 0,
"username": "test"
},
"name": "private-repo",
"full_name": "test/private-repo",
"description": "",
"empty": false,
"private": true,
"fork": false,
"template": false,
"parent": null,
"mirror": false,
"size": 33,
"language": "",
"languages_url": "http://localhost:3000/api/v1/repos/test/private-repo/languages",
"html_url": "http://localhost:3000/test/private-repo",
"url": "http://localhost:3000/api/v1/repos/test/private-repo",
"link": "",
"ssh_url": "christopher@localhost:test/private-repo.git",
"clone_url": "http://localhost:3000/test/private-repo.git",
"original_url": "",
"website": "",
"stars_count": 0,
"forks_count": 0,
"watchers_count": 1,
"open_issues_count": 0,
"open_pr_counter": 0,
"release_counter": 0,
"default_branch": "main",
"archived": false,
"created_at": "2025-02-10T20:40:44+01:00",
"updated_at": "2025-02-23T16:38:21+01:00",
"archived_at": "1970-01-01T01:00:00+01:00",
"permissions": {
"admin": true,
"push": true,
"pull": true
},
"has_issues": true,
"internal_tracker": {
"enable_time_tracker": true,
"allow_only_contributors_to_track_time": true,
"enable_issue_dependencies": true
},
"has_wiki": true,
"has_pull_requests": true,
"has_projects": true,
"projects_mode": "all",
"has_releases": true,
"has_packages": true,
"has_actions": true,
"ignore_whitespace_conflicts": false,
"allow_merge_commits": true,
"allow_rebase": true,
"allow_rebase_explicit": true,
"allow_squash_merge": true,
"allow_fast_forward_only_merge": true,
"allow_rebase_update": true,
"default_delete_branch_after_merge": false,
"default_merge_style": "merge",
"default_allow_maintainer_edit": false,
"avatar_url": "",
"internal": false,
"mirror_interval": "",
"object_format_name": "sha1",
"mirror_updated": "0001-01-01T00:00:00Z",
"repo_transfer": null,
"topics": [],
"licenses": null
},
"sender": {
"id": 43,
"login": "test",
"login_name": "",
"source_id": 0,
"full_name": "",
"email": "test@noreply.localhost",
"avatar_url": "http://localhost:3000/avatars/b642b4217b34b1e8d3bd915fc65c4452",
"html_url": "http://localhost:3000/test",
"language": "",
"is_admin": false,
"last_login": "0001-01-01T00:00:00Z",
"created": "2025-02-10T13:25:00+01:00",
"restricted": false,
"active": false,
"prohibit_login": false,
"location": "",
"website": "",
"description": "",
"visibility": "public",
"followers_count": 0,
"following_count": 0,
"starred_repos_count": 0,
"username": "test"
}
} {
"action": "queued",
"workflow_job": {
"id": 343,
"run_id": 825,
"run_url": "http://localhost:3000/test/private-repo/actions/runs/10",
"name": "_",
"labels": [
"ephemeral"
],
"run_attempt": 2,
"head_sha": "a33e70fae58cce6ddf3a3e4c33e7be4fe5ea1533",
"head_branch": "ephemeral",
"runner_id": 0,
"runner_name": "",
"steps": null,
"created_at": "2025-02-23T14:51:50Z",
"started_at": "1970-01-01T00:00:00Z",
"completed_at": "1970-01-01T00:00:00Z"
},
"repository": {
"id": 65,
"owner": {
"id": 43,
"login": "test",
"login_name": "",
"source_id": 0,
"full_name": "",
"email": "test@test.com",
"avatar_url": "http://localhost:3000/avatars/b642b4217b34b1e8d3bd915fc65c4452",
"html_url": "http://localhost:3000/test",
"language": "",
"is_admin": false,
"last_login": "0001-01-01T00:00:00Z",
"created": "2025-02-10T13:25:00+01:00",
"restricted": false,
"active": false,
"prohibit_login": false,
"location": "",
"website": "",
"description": "",
"visibility": "public",
"followers_count": 0,
"following_count": 0,
"starred_repos_count": 0,
"username": "test"
},
"name": "private-repo",
"full_name": "test/private-repo",
"description": "",
"empty": false,
"private": true,
"fork": false,
"template": false,
"parent": null,
"mirror": false,
"size": 33,
"language": "",
"languages_url": "http://localhost:3000/api/v1/repos/test/private-repo/languages",
"html_url": "http://localhost:3000/test/private-repo",
"url": "http://localhost:3000/api/v1/repos/test/private-repo",
"link": "",
"ssh_url": "christopher@localhost:test/private-repo.git",
"clone_url": "http://localhost:3000/test/private-repo.git",
"original_url": "",
"website": "",
"stars_count": 0,
"forks_count": 0,
"watchers_count": 1,
"open_issues_count": 0,
"open_pr_counter": 0,
"release_counter": 0,
"default_branch": "main",
"archived": false,
"created_at": "2025-02-10T20:40:44+01:00",
"updated_at": "2025-02-23T16:38:21+01:00",
"archived_at": "1970-01-01T01:00:00+01:00",
"permissions": {
"admin": true,
"push": true,
"pull": true
},
"has_issues": true,
"internal_tracker": {
"enable_time_tracker": true,
"allow_only_contributors_to_track_time": true,
"enable_issue_dependencies": true
},
"has_wiki": true,
"has_pull_requests": true,
"has_projects": true,
"projects_mode": "all",
"has_releases": true,
"has_packages": true,
"has_actions": true,
"ignore_whitespace_conflicts": false,
"allow_merge_commits": true,
"allow_rebase": true,
"allow_rebase_explicit": true,
"allow_squash_merge": true,
"allow_fast_forward_only_merge": true,
"allow_rebase_update": true,
"default_delete_branch_after_merge": false,
"default_merge_style": "merge",
"default_allow_maintainer_edit": false,
"avatar_url": "",
"internal": false,
"mirror_interval": "",
"object_format_name": "sha1",
"mirror_updated": "0001-01-01T00:00:00Z",
"repo_transfer": null,
"topics": [],
"licenses": null
},
"sender": {
"id": 43,
"login": "test",
"login_name": "",
"source_id": 0,
"full_name": "",
"email": "test@noreply.localhost",
"avatar_url": "http://localhost:3000/avatars/b642b4217b34b1e8d3bd915fc65c4452",
"html_url": "http://localhost:3000/test",
"language": "",
"is_admin": false,
"last_login": "0001-01-01T00:00:00Z",
"created": "2025-02-10T13:25:00+01:00",
"restricted": false,
"active": false,
"prohibit_login": false,
"location": "",
"website": "",
"description": "",
"visibility": "public",
"followers_count": 0,
"following_count": 0,
"starred_repos_count": 0,
"username": "test"
}
} |
There are some examples in |
* add URL field * add HTMLURL field * fix run_url to return api url instead of html url
Notice for myself: Possible missing completed event for scenario: CancelPreviousJobs Hmm, adding code to this method creates an import cycle if I call the webhook not so easy than I expected. |
@@ -941,3 +944,114 @@ func notifyPackage(ctx context.Context, sender *user_model.User, pd *packages_mo | |||
log.Error("PrepareWebhooks: %v", err) | |||
} | |||
} | |||
|
|||
func (*webhookNotifier) WorkflowJobStatusUpdate(ctx context.Context, repo *repo_model.Repository, sender *user_model.User, job *actions_model.ActionRunJob, task *actions_model.ActionTask) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Can this webhook be customized from the UI?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
No, the UI can only subscribe / unsubscribe.
However testing this new webhook manually seems to do nothing / broken.
Do you mean webhooks like discord etc. that write text messages, then my codebase knowledge just ended here as I never used these
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes and more. So that users cannot cancel to receive this kind of webhook messages. Maybe some people want to do that. I leant from commit status webhook that many people want to avoid to receive that webhook.
Provide external Integration information about the Queue lossly based on https://docs.github.com/en/webhooks/webhook-events-and-payloads?actionType=completed#workflow_job
Naming conflicts between GitHub & Gitea are here, Blocked => Waiting, Waiting => Queued
Rationale Enhancement for ephemeral runners management #33570