GitHub Actionsで自作アクションや他のアクションでコードを書く場合(TypeScript)
@actions/github
のcontextに色々入っているのでそれを、参照して色々行うことが多いかと思う
単純にyamlファイルで定義する場合はイベントの情報は${{ github.event }}
で参照できるがそれをカスタムアクションでコードから参照するとき、さらにはworkflow_run
トリガーでの実行で直前に実行されたワークフローの情報を取得するにはどうすれば良いだろうということで調べてみた
イベント情報をコードから参照する
結論から言うと
@actions/github
のcontextのcontext.payload
の中に入っている
ソース読んだらわかった
この辺
toolkit/context.ts at main · actions/toolkit
実行環境上のenv.GITHUB_EVENT_PATH
にイベント情報のJSONファイルがあるのでそれをパースしてpayloadに格納している
また、ワークフローをトリガーするイベント - GitHub Docs
のサンプルコードようにactions/github-script
を使うと設定ファイル中にコードを書けるがそれを使う場合にも使える
actions/github-script: Write workflows scripting the GitHub API in JavaScript
workflow_runトリガーで取得できるイベントの内容
簡単な設定ファイルを用意し中身を見てみる
name: workflow run on: workflow_run: workflows: - cli types: - completed jobs: main: name: main runs-on: ubuntu-20.04 steps: - uses: actions/github-script@v6 with: script: | core.info(JSON.stringify(context.payload))
結果
{ "action": "completed", "repository": { "allow_forking": true, "archive_url": "https://api.github.com/repos/swfz/github-actions-sample/{archive_format}{/ref}", "archived": false, "assignees_url": "https://api.github.com/repos/swfz/github-actions-sample/assignees{/user}", "blobs_url": "https://api.github.com/repos/swfz/github-actions-sample/git/blobs{/sha}", "branches_url": "https://api.github.com/repos/swfz/github-actions-sample/branches{/branch}", "clone_url": "https://github.com/swfz/github-actions-sample.git", "collaborators_url": "https://api.github.com/repos/swfz/github-actions-sample/collaborators{/collaborator}", "comments_url": "https://api.github.com/repos/swfz/github-actions-sample/comments{/number}", "commits_url": "https://api.github.com/repos/swfz/github-actions-sample/commits{/sha}", "compare_url": "https://api.github.com/repos/swfz/github-actions-sample/compare/{base}...{head}", "contents_url": "https://api.github.com/repos/swfz/github-actions-sample/contents/{+path}", "contributors_url": "https://api.github.com/repos/swfz/github-actions-sample/contributors", "created_at": "2019-10-25T10:09:37Z", "default_branch": "master", "deployments_url": "https://api.github.com/repos/swfz/github-actions-sample/deployments", "description": null, "disabled": false, "downloads_url": "https://api.github.com/repos/swfz/github-actions-sample/downloads", "events_url": "https://api.github.com/repos/swfz/github-actions-sample/events", "fork": false, "forks": 0, "forks_count": 0, "forks_url": "https://api.github.com/repos/swfz/github-actions-sample/forks", "full_name": "swfz/github-actions-sample", "git_commits_url": "https://api.github.com/repos/swfz/github-actions-sample/git/commits{/sha}", "git_refs_url": "https://api.github.com/repos/swfz/github-actions-sample/git/refs{/sha}", "git_tags_url": "https://api.github.com/repos/swfz/github-actions-sample/git/tags{/sha}", "git_url": "git://github.com/swfz/github-actions-sample.git", "has_downloads": true, "has_issues": true, "has_pages": false, "has_projects": true, "has_wiki": true, "homepage": null, "hooks_url": "https://api.github.com/repos/swfz/github-actions-sample/hooks", "html_url": "https://github.com/swfz/github-actions-sample", "id": 217507074, "is_template": false, "issue_comment_url": "https://api.github.com/repos/swfz/github-actions-sample/issues/comments{/number}", "issue_events_url": "https://api.github.com/repos/swfz/github-actions-sample/issues/events{/number}", "issues_url": "https://api.github.com/repos/swfz/github-actions-sample/issues{/number}", "keys_url": "https://api.github.com/repos/swfz/github-actions-sample/keys{/key_id}", "labels_url": "https://api.github.com/repos/swfz/github-actions-sample/labels{/name}", "language": "JavaScript", "languages_url": "https://api.github.com/repos/swfz/github-actions-sample/languages", "license": null, "merges_url": "https://api.github.com/repos/swfz/github-actions-sample/merges", "milestones_url": "https://api.github.com/repos/swfz/github-actions-sample/milestones{/number}", "mirror_url": null, "name": "github-actions-sample", "node_id": "MDEwOlJlcG9zaXRvcnkyMTc1MDcwNzQ=", "notifications_url": "https://api.github.com/repos/swfz/github-actions-sample/notifications{?since,all,participating}", "open_issues": 15, "open_issues_count": 15, "owner": { "avatar_url": "https://avatars.githubusercontent.com/u/4104038?v=4", "events_url": "https://api.github.com/users/swfz/events{/privacy}", "followers_url": "https://api.github.com/users/swfz/followers", "following_url": "https://api.github.com/users/swfz/following{/other_user}", "gists_url": "https://api.github.com/users/swfz/gists{/gist_id}", "gravatar_id": "", "html_url": "https://github.com/swfz", "id": 4104038, "login": "swfz", "node_id": "MDQ6VXNlcjQxMDQwMzg=", "organizations_url": "https://api.github.com/users/swfz/orgs", "received_events_url": "https://api.github.com/users/swfz/received_events", "repos_url": "https://api.github.com/users/swfz/repos", "site_admin": false, "starred_url": "https://api.github.com/users/swfz/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/swfz/subscriptions", "type": "User", "url": "https://api.github.com/users/swfz" }, "private": true, "pulls_url": "https://api.github.com/repos/swfz/github-actions-sample/pulls{/number}", "pushed_at": "2022-04-24T08:51:08Z", "releases_url": "https://api.github.com/repos/swfz/github-actions-sample/releases{/id}", "size": 34, "ssh_url": "git@github.com:swfz/github-actions-sample.git", "stargazers_count": 0, "stargazers_url": "https://api.github.com/repos/swfz/github-actions-sample/stargazers", "statuses_url": "https://api.github.com/repos/swfz/github-actions-sample/statuses/{sha}", "subscribers_url": "https://api.github.com/repos/swfz/github-actions-sample/subscribers", "subscription_url": "https://api.github.com/repos/swfz/github-actions-sample/subscription", "svn_url": "https://github.com/swfz/github-actions-sample", "tags_url": "https://api.github.com/repos/swfz/github-actions-sample/tags", "teams_url": "https://api.github.com/repos/swfz/github-actions-sample/teams", "topics": [], "trees_url": "https://api.github.com/repos/swfz/github-actions-sample/git/trees{/sha}", "updated_at": "2022-01-13T17:31:57Z", "url": "https://api.github.com/repos/swfz/github-actions-sample", "visibility": "private", "watchers": 0, "watchers_count": 0 }, "sender": { "avatar_url": "https://avatars.githubusercontent.com/u/4104038?v=4", "events_url": "https://api.github.com/users/swfz/events{/privacy}", "followers_url": "https://api.github.com/users/swfz/followers", "following_url": "https://api.github.com/users/swfz/following{/other_user}", "gists_url": "https://api.github.com/users/swfz/gists{/gist_id}", "gravatar_id": "", "html_url": "https://github.com/swfz", "id": 4104038, "login": "swfz", "node_id": "MDQ6VXNlcjQxMDQwMzg=", "organizations_url": "https://api.github.com/users/swfz/orgs", "received_events_url": "https://api.github.com/users/swfz/received_events", "repos_url": "https://api.github.com/users/swfz/repos", "site_admin": false, "starred_url": "https://api.github.com/users/swfz/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/swfz/subscriptions", "type": "User", "url": "https://api.github.com/users/swfz" }, "workflow": { "badge_url": "https://github.com/swfz/github-actions-sample/workflows/cli/badge.svg", "created_at": "2022-01-13T17:31:54.000Z", "html_url": "https://github.com/swfz/github-actions-sample/blob/master/.github/workflows/gh.yml", "id": 17903024, "name": "cli", "node_id": "W_kwDODPblAs4BES2w", "path": ".github/workflows/gh.yml", "state": "active", "updated_at": "2022-01-13T17:32:28.000Z", "url": "https://api.github.com/repos/swfz/github-actions-sample/actions/workflows/17903024" }, "workflow_run": { "actor": { "avatar_url": "https://avatars.githubusercontent.com/u/4104038?v=4", "events_url": "https://api.github.com/users/swfz/events{/privacy}", "followers_url": "https://api.github.com/users/swfz/followers", "following_url": "https://api.github.com/users/swfz/following{/other_user}", "gists_url": "https://api.github.com/users/swfz/gists{/gist_id}", "gravatar_id": "", "html_url": "https://github.com/swfz", "id": 4104038, "login": "swfz", "node_id": "MDQ6VXNlcjQxMDQwMzg=", "organizations_url": "https://api.github.com/users/swfz/orgs", "received_events_url": "https://api.github.com/users/swfz/received_events", "repos_url": "https://api.github.com/users/swfz/repos", "site_admin": false, "starred_url": "https://api.github.com/users/swfz/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/swfz/subscriptions", "type": "User", "url": "https://api.github.com/users/swfz" }, "artifacts_url": "https://api.github.com/repos/swfz/github-actions-sample/actions/runs/2215055397/artifacts", "cancel_url": "https://api.github.com/repos/swfz/github-actions-sample/actions/runs/2215055397/cancel", "check_suite_id": 6236406723, "check_suite_node_id": "CS_kwDODPblAs8AAAABc7gDww", "check_suite_url": "https://api.github.com/repos/swfz/github-actions-sample/check-suites/6236406723", "conclusion": "success", "created_at": "2022-04-24T08:51:09Z", "event": "push", "head_branch": "master", "head_commit": { "author": { "email": "sawafuji.09@gmail.com", "name": "swfz" }, "committer": { "email": "sawafuji.09@gmail.com", "name": "swfz" }, "id": "5dbbec03481ebcdae3682153a2adf226d533a41d", "message": "fix: typo", "timestamp": "2022-04-24T08:51:04Z", "tree_id": "4dd711c2b5847553f9cb34069f53dab06ad9ee31" }, "head_repository": { "archive_url": "https://api.github.com/repos/swfz/github-actions-sample/{archive_format}{/ref}", "assignees_url": "https://api.github.com/repos/swfz/github-actions-sample/assignees{/user}", "blobs_url": "https://api.github.com/repos/swfz/github-actions-sample/git/blobs{/sha}", "branches_url": "https://api.github.com/repos/swfz/github-actions-sample/branches{/branch}", "collaborators_url": "https://api.github.com/repos/swfz/github-actions-sample/collaborators{/collaborator}", "comments_url": "https://api.github.com/repos/swfz/github-actions-sample/comments{/number}", "commits_url": "https://api.github.com/repos/swfz/github-actions-sample/commits{/sha}", "compare_url": "https://api.github.com/repos/swfz/github-actions-sample/compare/{base}...{head}", "contents_url": "https://api.github.com/repos/swfz/github-actions-sample/contents/{+path}", "contributors_url": "https://api.github.com/repos/swfz/github-actions-sample/contributors", "deployments_url": "https://api.github.com/repos/swfz/github-actions-sample/deployments", "description": null, "downloads_url": "https://api.github.com/repos/swfz/github-actions-sample/downloads", "events_url": "https://api.github.com/repos/swfz/github-actions-sample/events", "fork": false, "forks_url": "https://api.github.com/repos/swfz/github-actions-sample/forks", "full_name": "swfz/github-actions-sample", "git_commits_url": "https://api.github.com/repos/swfz/github-actions-sample/git/commits{/sha}", "git_refs_url": "https://api.github.com/repos/swfz/github-actions-sample/git/refs{/sha}", "git_tags_url": "https://api.github.com/repos/swfz/github-actions-sample/git/tags{/sha}", "hooks_url": "https://api.github.com/repos/swfz/github-actions-sample/hooks", "html_url": "https://github.com/swfz/github-actions-sample", "id": 217507074, "issue_comment_url": "https://api.github.com/repos/swfz/github-actions-sample/issues/comments{/number}", "issue_events_url": "https://api.github.com/repos/swfz/github-actions-sample/issues/events{/number}", "issues_url": "https://api.github.com/repos/swfz/github-actions-sample/issues{/number}", "keys_url": "https://api.github.com/repos/swfz/github-actions-sample/keys{/key_id}", "labels_url": "https://api.github.com/repos/swfz/github-actions-sample/labels{/name}", "languages_url": "https://api.github.com/repos/swfz/github-actions-sample/languages", "merges_url": "https://api.github.com/repos/swfz/github-actions-sample/merges", "milestones_url": "https://api.github.com/repos/swfz/github-actions-sample/milestones{/number}", "name": "github-actions-sample", "node_id": "MDEwOlJlcG9zaXRvcnkyMTc1MDcwNzQ=", "notifications_url": "https://api.github.com/repos/swfz/github-actions-sample/notifications{?since,all,participating}", "owner": { "avatar_url": "https://avatars.githubusercontent.com/u/4104038?v=4", "events_url": "https://api.github.com/users/swfz/events{/privacy}", "followers_url": "https://api.github.com/users/swfz/followers", "following_url": "https://api.github.com/users/swfz/following{/other_user}", "gists_url": "https://api.github.com/users/swfz/gists{/gist_id}", "gravatar_id": "", "html_url": "https://github.com/swfz", "id": 4104038, "login": "swfz", "node_id": "MDQ6VXNlcjQxMDQwMzg=", "organizations_url": "https://api.github.com/users/swfz/orgs", "received_events_url": "https://api.github.com/users/swfz/received_events", "repos_url": "https://api.github.com/users/swfz/repos", "site_admin": false, "starred_url": "https://api.github.com/users/swfz/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/swfz/subscriptions", "type": "User", "url": "https://api.github.com/users/swfz" }, "private": true, "pulls_url": "https://api.github.com/repos/swfz/github-actions-sample/pulls{/number}", "releases_url": "https://api.github.com/repos/swfz/github-actions-sample/releases{/id}", "stargazers_url": "https://api.github.com/repos/swfz/github-actions-sample/stargazers", "statuses_url": "https://api.github.com/repos/swfz/github-actions-sample/statuses/{sha}", "subscribers_url": "https://api.github.com/repos/swfz/github-actions-sample/subscribers", "subscription_url": "https://api.github.com/repos/swfz/github-actions-sample/subscription", "tags_url": "https://api.github.com/repos/swfz/github-actions-sample/tags", "teams_url": "https://api.github.com/repos/swfz/github-actions-sample/teams", "trees_url": "https://api.github.com/repos/swfz/github-actions-sample/git/trees{/sha}", "url": "https://api.github.com/repos/swfz/github-actions-sample" }, "head_sha": "5dbbec03481ebcdae3682153a2adf226d533a41d", "html_url": "https://github.com/swfz/github-actions-sample/actions/runs/2215055397", "id": 2215055397, "jobs_url": "https://api.github.com/repos/swfz/github-actions-sample/actions/runs/2215055397/jobs", "logs_url": "https://api.github.com/repos/swfz/github-actions-sample/actions/runs/2215055397/logs", "name": "cli", "node_id": "WFR_kwLODPblAs6EBxAl", "previous_attempt_url": null, "pull_requests": [], "repository": { "archive_url": "https://api.github.com/repos/swfz/github-actions-sample/{archive_format}{/ref}", "assignees_url": "https://api.github.com/repos/swfz/github-actions-sample/assignees{/user}", "blobs_url": "https://api.github.com/repos/swfz/github-actions-sample/git/blobs{/sha}", "branches_url": "https://api.github.com/repos/swfz/github-actions-sample/branches{/branch}", "collaborators_url": "https://api.github.com/repos/swfz/github-actions-sample/collaborators{/collaborator}", "comments_url": "https://api.github.com/repos/swfz/github-actions-sample/comments{/number}", "commits_url": "https://api.github.com/repos/swfz/github-actions-sample/commits{/sha}", "compare_url": "https://api.github.com/repos/swfz/github-actions-sample/compare/{base}...{head}", "contents_url": "https://api.github.com/repos/swfz/github-actions-sample/contents/{+path}", "contributors_url": "https://api.github.com/repos/swfz/github-actions-sample/contributors", "deployments_url": "https://api.github.com/repos/swfz/github-actions-sample/deployments", "description": null, "downloads_url": "https://api.github.com/repos/swfz/github-actions-sample/downloads", "events_url": "https://api.github.com/repos/swfz/github-actions-sample/events", "fork": false, "forks_url": "https://api.github.com/repos/swfz/github-actions-sample/forks", "full_name": "swfz/github-actions-sample", "git_commits_url": "https://api.github.com/repos/swfz/github-actions-sample/git/commits{/sha}", "git_refs_url": "https://api.github.com/repos/swfz/github-actions-sample/git/refs{/sha}", "git_tags_url": "https://api.github.com/repos/swfz/github-actions-sample/git/tags{/sha}", "hooks_url": "https://api.github.com/repos/swfz/github-actions-sample/hooks", "html_url": "https://github.com/swfz/github-actions-sample", "id": 217507074, "issue_comment_url": "https://api.github.com/repos/swfz/github-actions-sample/issues/comments{/number}", "issue_events_url": "https://api.github.com/repos/swfz/github-actions-sample/issues/events{/number}", "issues_url": "https://api.github.com/repos/swfz/github-actions-sample/issues{/number}", "keys_url": "https://api.github.com/repos/swfz/github-actions-sample/keys{/key_id}", "labels_url": "https://api.github.com/repos/swfz/github-actions-sample/labels{/name}", "languages_url": "https://api.github.com/repos/swfz/github-actions-sample/languages", "merges_url": "https://api.github.com/repos/swfz/github-actions-sample/merges", "milestones_url": "https://api.github.com/repos/swfz/github-actions-sample/milestones{/number}", "name": "github-actions-sample", "node_id": "MDEwOlJlcG9zaXRvcnkyMTc1MDcwNzQ=", "notifications_url": "https://api.github.com/repos/swfz/github-actions-sample/notifications{?since,all,participating}", "owner": { "avatar_url": "https://avatars.githubusercontent.com/u/4104038?v=4", "events_url": "https://api.github.com/users/swfz/events{/privacy}", "followers_url": "https://api.github.com/users/swfz/followers", "following_url": "https://api.github.com/users/swfz/following{/other_user}", "gists_url": "https://api.github.com/users/swfz/gists{/gist_id}", "gravatar_id": "", "html_url": "https://github.com/swfz", "id": 4104038, "login": "swfz", "node_id": "MDQ6VXNlcjQxMDQwMzg=", "organizations_url": "https://api.github.com/users/swfz/orgs", "received_events_url": "https://api.github.com/users/swfz/received_events", "repos_url": "https://api.github.com/users/swfz/repos", "site_admin": false, "starred_url": "https://api.github.com/users/swfz/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/swfz/subscriptions", "type": "User", "url": "https://api.github.com/users/swfz" }, "private": true, "pulls_url": "https://api.github.com/repos/swfz/github-actions-sample/pulls{/number}", "releases_url": "https://api.github.com/repos/swfz/github-actions-sample/releases{/id}", "stargazers_url": "https://api.github.com/repos/swfz/github-actions-sample/stargazers", "statuses_url": "https://api.github.com/repos/swfz/github-actions-sample/statuses/{sha}", "subscribers_url": "https://api.github.com/repos/swfz/github-actions-sample/subscribers", "subscription_url": "https://api.github.com/repos/swfz/github-actions-sample/subscription", "tags_url": "https://api.github.com/repos/swfz/github-actions-sample/tags", "teams_url": "https://api.github.com/repos/swfz/github-actions-sample/teams", "trees_url": "https://api.github.com/repos/swfz/github-actions-sample/git/trees{/sha}", "url": "https://api.github.com/repos/swfz/github-actions-sample" }, "rerun_url": "https://api.github.com/repos/swfz/github-actions-sample/actions/runs/2215055397/rerun", "run_attempt": 1, "run_number": 46, "run_started_at": "2022-04-24T08:51:09Z", "status": "completed", "triggering_actor": { "avatar_url": "https://avatars.githubusercontent.com/u/4104038?v=4", "events_url": "https://api.github.com/users/swfz/events{/privacy}", "followers_url": "https://api.github.com/users/swfz/followers", "following_url": "https://api.github.com/users/swfz/following{/other_user}", "gists_url": "https://api.github.com/users/swfz/gists{/gist_id}", "gravatar_id": "", "html_url": "https://github.com/swfz", "id": 4104038, "login": "swfz", "node_id": "MDQ6VXNlcjQxMDQwMzg=", "organizations_url": "https://api.github.com/users/swfz/orgs", "received_events_url": "https://api.github.com/users/swfz/received_events", "repos_url": "https://api.github.com/users/swfz/repos", "site_admin": false, "starred_url": "https://api.github.com/users/swfz/starred{/owner}{/repo}", "subscriptions_url": "https://api.github.com/users/swfz/subscriptions", "type": "User", "url": "https://api.github.com/users/swfz" }, "updated_at": "2022-04-24T08:51:25Z", "url": "https://api.github.com/repos/swfz/github-actions-sample/actions/runs/2215055397", "workflow_id": 17903024, "workflow_url": "https://api.github.com/repos/swfz/github-actions-sample/actions/workflows/17903024" } }
直前に実行されたworkflowの情報はworkflow_run
に入っていた(例だとcliという名前のworkflow)
なのでその情報を使って色々共通処理をよしなに記述できれば毎度どのworkflowでも行う処理は分離できる
たとえば直前に実行されたワークフローの
- イベント名
context.payload.workflow_run.event
例だとpush
- ワークフロー名
context.payload.workflow_run.name
例だとcli
- ワークフローのrun_id
context.payload.workflow_run.id
例だと2215055397
- ワークフローの成否
context.payload.workflow_run.conclusion
例だとsuccess
などが取得できる
他にもあるが必要に応じて上記のようにイベント情報を見ながら設定やコードを書いたりすればよいだろう
とりあえずSlack通知とかはまとめられそうかなーと感じているので今使っているActionsにPR投げて待っている
まとめ
- JavaScriptやTypeScriptで独自のアクションを書く場合、
@actions/github
のcontext.payload
の中にenv.GITHUB_EVENT_PATH
と同様の情報が入っている - workflow_runトリガーで直前のワークフローの情報(成否や名前など)を取得するにはイベント情報の
workflow_run
以下を参照すれば良い