notebook

都内でWEB系エンジニアやってます。

GitHub Actionsのworkflow_runトリガーで、直前に実行されたワークフローの情報を取得する

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

github.com

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/githubcontext.payloadの中にenv.GITHUB_EVENT_PATHと同様の情報が入っている
  • workflow_runトリガーで直前のワークフローの情報(成否や名前など)を取得するにはイベント情報のworkflow_run以下を参照すれば良い