LoginSignup
8
4

More than 3 years have passed since last update.

[GitHub Actions]github-scriptを使ってJavaScriptでスクリプトを記述する

Posted at

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)
  • usesactions/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 }}"
  • scriptreturn で結果を返した場合に、その結果を次のステップでも使うことができる
  • 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 変数を使っていますが こちら を参照すると使える値がわかるかと思います。

その他

私は試していないですが、上記以外にもドキュメントを見ると以下のようなことができるようです。

8
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
4