はじめに
やりたいこと💭
orphan
ブランチの更新に合わせて main
ブランチのワークフローを実行させたい。
やったこと💪
簡単にできた😊。
方法について🍣
ワークフローの手動実行
ここでの手動実行とは、GitHub 上から実行したり REST API から実行したりすること。
今回は他ワークフローを呼び出したいので、REST API から実行することを目指す。
ワークフロー・イベントを次のどちらかに指定しておけば REST API からそのイベントを受信できる。
イベント | 特徴 |
---|---|
|
特定(単一)のワークフローを実行する |
|
複数のワークフローを実行する |
他のワークフローを呼び出す目的には workflow_dispatch
イベントが必要十分。
workflow_dispatch
イベント
特定のワークフローを実行するために使われるイベント。
イベント発行時にブランチやタグの指定が可能。
デフォルト入力値やプロパティの定義は github.event.inputs
コンテキストで設定可能。
REST API から呼び出される ワークフローがこのイベントをトリガーとするように指定する(今回だと main
ブランチのワークフローに設定)。
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)。 |
owner |
リポジトリの所有者名 |
repo |
リポジトリ名 |
workflow_id |
イベント送信先の ワークフローID または |
{"ref": "…"} |
ブランチやタグを指定する |
ワークフローIDは REST API から取得する必要があるため、ファイル名を指定するほうが簡単。 |
個人アクセストークンは直書きせず、環境変数やパスワードマネージャーで設定する。 |
個人アクセストークン( Personal Access Token )の作成
REST API を使うために作成。
以前に作成して Secrets 登録したやつがあったのでそれを使った。
新規作成する場合は、下記ドキュメントを参考にする。
-
個人アクセストークンを使用する を参考に作成
-
repo
またはpublic_repo
スコープを許可する
-
-
作成したトークンは 暗号化されたシークレット を参考にリポジトリの Secrets に登録
登録した Secrets はワークフローにおいて ${{ secrets.XXX }}
という形で参照できる。
別ワークフローからイベント発行
上記の curl
コマンドをワークフロー内で実行すればいい。
orphan
ブランチのワークフロー例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 プログラムコードと記事ソースのブランチを分けて、記事だけを更新しても自動的にデプロイ用ワークフローを実行してくれるようにできた。
おかげでブログ更新も捗る……といいな!🙄進捗どうですか。