GitHub Actions ハロワの記事も書いているので、よかったらご覧ください。
基本的にはドキュメントがしっかりしているのでそちらで足りるかと思うのですが、個人的に何度も調べてるものはこちらにまとめておきます。
[目次]
注: 以下は 2022/10/22 現在の情報となります。
うまくいかない場合は、公式のドキュメントをご覧ください。
トリガー
何を契機に jobs を走らせるかを指定します。
(Events that trigger workflows)
手動実行できるようにする
on
に workflow_dispatch:
を追加する。
on: # 手動実行できるようにする! workflow_dispatch:
定期実行
スケジュール実行(定期実行)を行う方法について。
(schedule について)
on
に schedule:
を追加する。
デフォルトでは UTC なので注意(日本は UTC+9)。
また、正確な時間ではないのでその辺許してあげてください。
(そのため、12 時ぴったりに処理が走らないと困る、という場合には適してないです。)
on: schedule: # 日本時間23時00分ごろの指定 # 毎日 23 時 17-20 分ごろに - cron: "0 14 * * *"
特定のパス/拡張子の時は実行させない
on: pull_request: paths-ignore: # docs フォルダ配下の、全ファイル。 - "docs/**" # 全ディレクトリの md ファイル。 - "**.md"
複数条件実行
基本的には matrix をうまく使います。
複数バージョンで走らせる
jobs: test: runs-on: ${{ matrix.os }} strategy: matrix: go: ["1.16", "1.18"] steps: - name: Setup go uses: actions/setup-go@v3 with: go-version: ${{ matrix.go }} - name: checkout uses: actions/checkout@v3 - name: Testing run: go test ./...
複数マシン(OS)で走らせる
runs-on
に指定します
jobs: test: runs-on: ${{ matrix.os }} strategy: matrix: os: - ubuntu-latest - macOS-latest - windows-latest steps: ...
CI ファイルを分割する
jobs 部分が長くなってくると、各ステップでやってることが把握しにくくなり、保守性が下がってくるという問題が発生します。
そういう時は、ファイルを分割しメインファイルから呼んであげることができます。
また、他リポジトリにあるファイルも呼び出せるため、使い回しが可能になります。
reusable-workflows を使います。
reusable 側(呼び出される側)
呼び出し条件 (on:
) を workflow_call
で定義します。
name: Local test on: workflow_call: secrets: ENCODED_RELEASE_KEYSTORE: required: true jobs: deploy: runs-on: ubuntu-20.04 timeout-minutes: 10 environment: production steps: - ...
使う側(呼び出す側)
marketplace から job を使うように uses
で使用できます。
jobs: call-workflow-passing-data: uses: octo-org/example-repo/.github/workflows/reusable-workflow.yml@main with: username: mona secrets: envPAT: ${{ secrets.envPAT }}
そのほか
job の実行順序を制御
基本的には job は並列で進んでいくのですが、『リントやビルドが通った場合のみ単体テストを走らせたい』など、順番を調整したい場合があります。
そんな時は need
を使います。
jobs: build: uses: kokoichi206/xxx lint: uses: kokoichi206/yyy local-test: # この job を走らせるには、build, lint の終了が必要 needs: [build, lint] uses: kokoichi206/zzz android-emulator-test: # この job を走らせるには、build, lint の終了が必要 needs: [version-check, build, lint] uses: kokoichi206/xyz
step 間で値を共有する [非推奨]
注: set-output
は非推奨になったようです!!
jobs: checker: runs-on: ubuntu-20.04 steps: - name: Get version of BASE_REF id: id-version run: | echo "::set-output name=version::1.0.0" - name: Get version of HEAD_REF run: | base="${{ steps.id-version.outputs.version }}" echo "${base}"
step や job の間で値を共有する
上の方法は 2022/10/18 に非推奨になっているので、今後は『Passing values between steps and jobs in a workflow』に従って値を共有することになります。
step 間
(実行例)
steps: - name: Set the value run: | echo "test_value=pien" >> $GITHUB_ENV - name: Use the value run: | # This will output 'pien' echo "${{ env.test_value }}"
job 間
(実行例)
jobs: # outputs で共有 Between-jobs-1: runs-on: ubuntu-latest # Map a step output to a job output outputs: output1: ${{ steps.step1.outputs.test_value }} steps: - id: step1 run: | echo "test_value=hello" >> $GITHUB_OUTPUT Between-jobs-2: runs-on: ubuntu-latest needs: job1 steps: - run: echo ${{needs.Between-jobs-1.outputs.output1}}
おわりに
随時便利そうなものがあれば追加いたします。