マトリックス戦略を使うと、単一のジョブ定義中で変数を使って、変数の組み合わせに基づく複数のジョブの実行を自動的に生成できます。 たとえばマトリックス戦略を使って、コードを言語の複数のバージョンや、複数のオペレーティングシステムでテストできます。
name: 'Dynamic Build Matrix Actions'
on:
workflow_dispatch:
inputs:
zeus:
description: 'zeus'
type: boolean
required: true
default: false
athena:
description: 'athena'
type: boolean
required: true
default: false
hades:
description: 'hades'
type: boolean
required: true
default: false
jobs:
setup:
runs-on: ubuntu-latest
timeout-minutes: 3
outputs:
targets: ${{ steps.build-matrix.outputs.targets }}
steps:
- name: Setup Dynamic Build Matrix
id: build-matrix
run: |
TARGETS=()
if [ "${{ github.event.inputs.zeus }}" = "true" ]; then
TARGETS+=("zeus")
fi
if [ "${{ github.event.inputs.athena }}" = "true" ]; then
TARGETS+=("athena")
fi
if [ "${{ github.event.inputs.hades }}" = "true" ]; then
TARGETS+=("hades")
fi
targets=$(printf '%s\n' "${TARGETS[@]}" | jq -R . | jq -s -c .)
echo "::set-output name=targets::$targets"
execute:
runs-on: ubuntu-latest
timeout-minutes: 5
needs:
- setup
strategy:
fail-fast: true
max-parallel: 3
matrix:
targets: ${{ fromJSON(needs.setup.outputs.targets) }}
steps:
- uses: actions/checkout@v3
- name: Install Figlet
run: sudo apt-get install -y figlet
- name: Execute Script
working-directory: scripts
run: ./${{ matrix.targets }}.sh
workflow_dispatch
なワークフローを定義し、入力値として実行するスクリプトのon / offを選択させるsetup
ジョブでワークフローの入力値からビルドマトリクスに必要な値を動的に生成し、ジョブの outputs
に出力するfromJSON()
を使い、ビルドマトリクスとして定義するworkflow_dispatch
なワークフローの定義type: boolean
とすることでチェックボックスの入力項目が定義出来る。true
、OFFであれば false
となる。echo "::setoutput name=xxx::$yyy"
でステップの結果として出力、さらにジョブの outputs
に伝搬させることでジョブ間での値の共有を図る。setup:
runs-on: ubuntu-latest
timeout-minutes: 3
outputs:
targets: ${{ steps.build-matrix.outputs.targets }}
steps:
- name: Setup Dynamic Build Matrix
id: build-matrix
run: |
TARGETS=()
if [ "${{ github.event.inputs.zeus }}" = "true" ]; then
TARGETS+=("zeus")
fi
if [ "${{ github.event.inputs.athena }}" = "true" ]; then
TARGETS+=("athena")
fi
if [ "${{ github.event.inputs.hades }}" = "true" ]; then
TARGETS+=("hades")
fi
targets=$(printf '%s\n' "${TARGETS[@]}" | jq -R . | jq -s -c .)
echo "::set-output name=targets::$targets"
needs
でジョブの依存関係を定義し、さらに先行ジョブである setup
の出力値をGitHub Actionsの組み込み関数である fromJSON()
に食わせることでJSON配列の出力値から動的にビルドマトリクスが設定される。${{ matrix.targets }}
を必要な箇所で使えばジョブが並列実行される。execute:
runs-on: ubuntu-latest
timeout-minutes: 5
needs:
- setup
strategy:
fail-fast: true
max-parallel: 3
matrix:
targets: ${{ fromJSON(needs.setup.outputs.targets) }}
steps:
- uses: actions/checkout@v3
- name: Install Figlet
run: sudo apt-get install -y figlet
- name: Execute Script
working-directory: scripts
run: ./${{ matrix.targets }}.sh
athena
/ hades
/ zeus
の全てをチェックしてワークフローを実行した場合。