Github Actions を手動実行するための workflow_dispatch イベント

create
2020年11月13日
update
2020年11月19日

はじめに

やりたいこと💭

orphan ブランチの更新に合わせて main ブランチのワークフローを実行させたい。

やりたいことのイメージ
Figure 1. やりたいことのイメージ

やったこと💪

doit

簡単にできた😊。

方法について🍣

ワークフローの手動実行

ここでの手動実行とは、GitHub 上から実行したり REST API から実行したりすること。
今回は他ワークフローを呼び出したいので、REST API から実行することを目指す。

ワークフロー・イベントを次のどちらかに指定しておけば REST API からそのイベントを受信できる。

Table 1. 手動実行が可能となるイベント
イベント 特徴

workflow_dispatch

特定(単一)のワークフローを実行する
ブランチやタグの指定も可能

repository_dispatch

複数のワークフローを実行する
カスタムイベントやイベント型を作成可能

他のワークフローを呼び出す目的には workflow_dispatch イベントが必要十分。

workflow_dispatch イベント

特定のワークフローを実行するために使われるイベント。
イベント発行時にブランチやタグの指定が可能。

デフォルト入力値やプロパティの定義は github.event.inputs コンテキストで設定可能。

REST API から呼び出される ワークフローがこのイベントをトリガーとするように指定する(今回だと main ブランチのワークフローに設定)。

Example 1. mainブランチのワークフロー例
.github/workflows/main.yaml
on:
  push:
    branches:
      - main
  workflow_dispatch:  (1)
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-18.04
    steps:
      - run: ...
1 workflow_dispatch イベントをトリガー

REST API からイベント発行

上記で編集したワークフローが手動実行できるかどうか、ローカルのシェルから試してみる。

ローカル端末からワークフローを実行
curl -X POST \
  -H "Authorization: token ${GITHUB_TOKEN}" \
  -H "Accept: application/vnd.github.v3+json" \
  https://api.github.com/repos/${owner}/${repo}/actions/workflows/${workflow_id}/dispatches \
  -d '{"ref": "main"}'
プロパティ 説明

GITHUB_TOKEN

個人アクセストークン(Personal Access Token)。
repo スコープ(プライベートリポジトリを含む)ないし
public_repo スコープの許可が必要。

owner

リポジトリの所有者名

repo

リポジトリ名

workflow_id

イベント送信先の ワークフローID または
ワークフローの拡張子つきファイル名(例えば main.yaml

{"ref": "…​"}

ブランチやタグを指定する

ワークフローIDは REST API から取得する必要があるため、ファイル名を指定するほうが簡単。
個人アクセストークンは直書きせず、環境変数やパスワードマネージャーで設定する。

個人アクセストークン( Personal Access Token )の作成

REST API を使うために作成。
以前に作成して Secrets 登録したやつがあったのでそれを使った。

新規作成する場合は、下記ドキュメントを参考にする。

  1. 個人アクセストークンを使用する を参考に作成

    • repo または public_repo スコープを許可する

  2. 作成したトークンは 暗号化されたシークレット を参考にリポジトリの Secrets に登録

登録した Secrets はワークフローにおいて ${{ secrets.XXX }} という形で参照できる。

別ワークフローからイベント発行

上記の curl コマンドをワークフロー内で実行すればいい。

Example 2. orphan ブランチのワークフロー例
.github/workflows/orphan.yaml
on:
  push:
    branches:
      - orphan-branch

env:  (1)
  WORKFLOW_ID: main.yml
  DISPATCH_API: https://api.github.com/repos/$GITHUB_REPOSITORY/actions/workflows/$WORKFLOW_ID/dispatches

jobs:
  trigger:
    runs-on: ubuntu-18.04
    steps:
      - name: logger
        run: echo "::debug::POST to ${{ env.DISPATCH_API }}"

      - name: publish the event  (2)
        run: |
          curl -X POST \
            -H "Authorization: token ${{ secrets.PERSONAL_TOKEN }}" \
            -H "Accept: application/vnd.github.v3+json" \
            ${{ env.DISPATCH_API }} \
            -d '{"ref": "main"}'
1 環境変数としてURLを設定
2 REST API から workflow_dispatch イベントを発行
GITHUB_REPOSITORY はデフォルト環境変数で、 オーナー名/リポジトリ名 が設定されている。
env の変数で他の環境変数を使った場合に steps 内で参照するときは、
${{ env.XXX }} としないとうまく環境変数を展開してくれなかった。

おわりに😎

以上で orphan ブランチを更新すれば main ブランチの GitHub Actions が実行するようにできた。

これで Nuxt プログラムコードと記事ソースのブランチを分けて、記事だけを更新しても自動的にデプロイ用ワークフローを実行してくれるようにできた。
おかげでブログ更新も捗る……といいな!🙄進捗どうですか