Github Actions入門その4-環境変数/スクリプト/Artifactsを使う

Git,GitHub,Github Actions

はじめに

以下のエントリに引き続き、Github Actions を学習して学んだことをまとめて見ました。

このエントリでは、カスタマイズのテクニックについて触れていきます。
変数の使用方法、スクリプトの実行方法、ジョブとジョブの間をつなぐための方法により、カスタマイズが可能です。

ワークフローの中で変数を使う

Github Actions では、ワークフローが実行されるたびに 割り当てられるデフォルトの環境変数 があります。
デフォルトの環境変数だけで不十分であれば、独自に環境変数を追加することも可能です。
ワークフローの YAML 設定ファイルに定義することでこれを実現できます。

サンプルコードを見ていきましょう。
以下のサンプルコードでは、 POSTGRES_HOSTPOSTGRES_PORT という 2 つの環境変数を作成しています。
環境変数は node client.js の中で参照可能です( Github Actions のなかでは、 Node.js はデフォルトで利用可能みたいです )。

---
name: use-environment-variables
run-name: use-environment-variables
on:
  - push
jobs:
  use-environment-variables:
    runs-on: ubuntu-22.04
    steps:
      - uses: actions/checkout@v3
      - run: node .github/scripts/use_environment_variables.js
        env:
          POSTGRES_HOST: postgres_host
          POSTGRES_PORT: 5432

呼び出している JavaScript のコードは以下のようになっています。

$ cat .github/scripts/use_environment_variables.js
#!/usr/bin/env node

console.log("START------");
// デフォルトの環境変数
console.log(process.env.GITHUB_ACTOR);
// 独自の環境変数
console.log(process.env.POSTGRES_HOST);
console.log(process.env.POSTGRES_PORT);
console.log("END------");

実行結果を gh run list で確認すると以下のようになりました。

$ gh run view --log 4840935837
...
use-environment-variables       Run node .github/scripts/use_environment_variables.js   2023-04-29T23:20:30.5370003Z ##[group]Run node .github/scripts/use_environment_variables.js
use-environment-variables       Run node .github/scripts/use_environment_variables.js   2023-04-29T23:20:30.5370525Z node .github/scripts/use_environment_variables.js
use-environment-variables       Run node .github/scripts/use_environment_variables.js   2023-04-29T23:20:30.5427717Z shell: /usr/bin/bash -e {0}
use-environment-variables       Run node .github/scripts/use_environment_variables.js   2023-04-29T23:20:30.5428101Z env:
use-environment-variables       Run node .github/scripts/use_environment_variables.js   2023-04-29T23:20:30.5428391Z   POSTGRES_HOST: postgres_host
use-environment-variables       Run node .github/scripts/use_environment_variables.js   2023-04-29T23:20:30.5428649Z   POSTGRES_PORT: 5432
use-environment-variables       Run node .github/scripts/use_environment_variables.js   2023-04-29T23:20:30.5428940Z ##[endgroup]
use-environment-variables       Run node .github/scripts/use_environment_variables.js   2023-04-29T23:20:30.7089290Z START------
use-environment-variables       Run node .github/scripts/use_environment_variables.js   2023-04-29T23:20:30.7095077Z genzouw
use-environment-variables       Run node .github/scripts/use_environment_variables.js   2023-04-29T23:20:30.7095402Z postgres_host
use-environment-variables       Run node .github/scripts/use_environment_variables.js   2023-04-29T23:20:30.7095682Z 5432
use-environment-variables       Run node .github/scripts/use_environment_variables.js   2023-04-29T23:20:30.7095977Z END------
...
use-environment-variables       Complete job    2023-04-29T21:51:14.3371069Z Cleaning up orphan processes

設定した環境変数が JavaScript のコードから参照できていることがわかります。

ワークフローの中でスクリプトを使う

アクションの中でスクリプトやシェルコマンドを実行できます。
実行される環境は runs-on 属性で設定した仮想環境上となります。
( runs-on: ubuntu-22.04 の場合、 Ubuntu 22.04 上で実行されます )

先程の「ワークフローの中で変数を使う」のところで見たように、ステップ内の run フィールドにはシェルコマンドを記述できます。
run に記述したシェルコマンドは仮想環境 Ubuntu 22.04 上で実行されます。

Github Actions のドキュメントのサンプルコードには、ワークフロー内でのみ利用するスクリプトは .github/scripts/ ディレクトリに配置されていますし、先の例でも同じ場所に配置してみました。
特に好みがなければここに配置するのが良いでしょう。

スクリプト実行時の「シェル」を指定できます。

jobs:
  example-job:
    steps:
      - name: Run build script
        run: ./.github/scripts/build.sh
        shell: bash

ここでは ./.github/scripts/build.sh ファイルを Bash で実行するようにしています。
ただし、 bash ./.github/scripts/build.sh のようにrun フィールドに明示してもいいと思いますし、シバン ( シェルスクリプトの1行目に記述する #!/usr/bin/env bash )を記述しておけば、利用されるシェルを明示できます。

利用するシーンとしては、以下のようにシェルコマンドを実行させるシェルを明示したい場合でしょう。

jobs:
  example-job:
    steps:
      - shell: bash
        run: |
          expr 1 + 1

ジョブ間でデータを共有する

ワークフロー内で定義したしたジョブが他のジョブと共有するためのファイルをいくつか生成したとします。
あるいは他の目的でも構いませんが、後ほど参照するためにファイルを保存しておきたいとします。

その場合には Github 内に Artifacts として保存しておくのが良いでしょう。

Artifacts はビルドやテストのタイミングで生成されたファイルの総称です。
例えば、ビルド時に生成された実行ファイルが考えられます。
テストの実行結果、スクリーンショット、ログなども考えられます。

Articles は、それらを生成したワークフローと紐付けられており、同じワークフロー内の他のジョブから参照できます。

サンプルコードを見ていきましょう。
以下のサンプルコードでは、 output.log というログファイルを Artifacts としてアップロードしています。

Artifacts のアップロードのためには、 actions/upload-artifact@v3 アクションを利用します。

---
name: upload-artifacts
run-name: upload-artifacts
on:
  - push
jobs:
  upload-artifacts:
    runs-on: ubuntu-22.04
    steps:
      - shell: bash
        run: |
          expr 2 + 1 > output.log
      - name: Upload output file
        uses: actions/upload-artifact@v3
        with:
          name: output-log-file
          path: output.log

実行が成功すれば、 実行結果フローの下に Artifacts の一覧が表示されます。
アップロードした output-log-file が確認できます。

Artifacts のダウンロードのためには、 actions/download-artifact@v3 アクションを利用します。

ジョブコードを抜粋すると以下のようになります。

---
jobs:
  upload-artifacts:
    #...
  download-artifacts:
    needs: [upload-artifacts]
    steps:
      - name: Download a single artifact
        uses: actions/download-artifact@v3
        with:
          name: output-log-file

upload-artifacts ジョブが終了しファイルがアップロードされている必要があるため、 needs フィールドで実行順序を制御しています。

ひとこと

Artifacts はどのぐらいの容量までアップロードできるんだろう?

以下のページを見ると、無料アカウントの場合は 500MB までのようですが。