GitHub Actions でワークフローを作った際に、github-script が便利だったので備忘録として残しておきます。
github-script
は JavaScript でスクリプトを記述することができ、GitHub の REST API を実行したり actions/toolkit のいくつかのパッケージをスクリプト内で使用することができます。
例えば、
- 文字列操作を行いたいけど、JavaScript ではすぐ書けるのにシェルスクリプトでどう書いたらいいかわからない
- GitHub の REST API を実行したいけど、シェルスクリプトで curl コマンド書くのが面倒
のような状況では非常に便利に使えます。
使い方
基本
jobs:
script-test:
runs-on: ubuntu-latest
steps:
- uses: actions/github-script@v3
with:
script: console.log(context)
-
uses
にactions/github-script@v3
を指定する(バージョンは適宜変更する) -
script
に JavaScript で処理を書く- ここに記述するのは非同期呼び出しされた関数の中身なので
await
なども使うことができる -
script
内では以下の変数が使用できる(詳細は ドキュメント 参照)github
context
core
glob
io
- ここに記述するのは非同期呼び出しされた関数の中身なので
スクリプトの結果を次のステップで使いたい場合
steps:
- uses: actions/github-script@v3
id: my-script
with:
script: return "Hello world!"
result-encoding: string
- name: Dump result
run: echo "${{ steps.my-script.outputs.result }}"
-
script
でreturn
で結果を返した場合に、その結果を次のステップでも使うことができる -
result-encoding
で結果のエンコード方式を変更できる-
json
(デフォルト) :return
した結果をJSON.stringify()
したもの -
string
:return
した結果の文字列
-
前のステップからの結果などをスクリプトで使いたい場合
スクリプト内で使いたい値を環境変数として登録することで、スクリプト内でその値を使うことができます。
steps:
- name: Add reviewer
run: |
echo "REVIEWER=XXX" >> $GITHUB_ENV
- uses: actions/github-script@v3
env:
ASSIGNEE: ZZZ
with:
script: |
const { REVIEWER, ASSIGNEE } = process.env;
console.log(`REVIEWER = ${REVIEWER}`);
console.log(`ASSIGNEE = ${ASSIGNEE}`);
GitHub の REST API を使いたい場合
例えばプルリクエストが作られた際に、Review me!
ラベルを付け、特定のユーザーをアサインする場合は以下のように書けます。
使える API については こちら から参照できます。
on:
pull_request:
types:
- 'opened'
jobs:
review-action:
runs-on: ubuntu-latest
steps:
- uses: actions/github-script@v3
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const issue_number = context.issue.number;
const addLabels = github.issues.addLabels({...context.repo, issue_number, labels: ['Review me!']});
const requestReviewers = github.pulls.requestReviewers({...context.repo, pull_number: issue_number, reviewers: ["watabee"]});
await Promise.allSettled([addLabels, requestReviewers]);
上記で context
変数を使っていますが こちら を参照すると使える値がわかるかと思います。
その他
私は試していないですが、上記以外にもドキュメントを見ると以下のようなことができるようです。