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}}
おわりに
随時便利そうなものがあれば追加いたします。