1 つのワークフローには複数のジョブを持てます。
並行実行
以下の例はjob1
とjob2
という 2 つのジョブを設定してます。
jobs:
job1: # ...
job2: # ...
何かしらのトリガーを弾いた時、これらは並行に実行されます。
順次実行
<job>.needs
値を設定すると順次実行できます。
例えば、job2
をjob1
が完了後実行させたいならneeds: job1
と設定します。これは配列で複数指定することもできます。
jobs:
# ...
job1: # ...
job2:
needs:
- job1
# - 他にもあるなら
steps: # ...
以前のジョブの出力値を使う
各ジョブにはoutputs
に Map 値が設定できます。これは依存関係となっている他のジョブに向けての出力で、以降のジョブはここから出力されている値を好きにジョブ内で使うことができます。outputs
の各キーの値は、そのジョブが完了した時のコンテキストの値を設定できます。つまり、例えばあるステップの値を設定するには以下のようにします。
jobs:
job1:
runs-on: ubuntu-18.04
outputs:
foo: ${{ steps.foo.outputs.value }}
steps:
- id: foo
run: echo "::set-output name=value::foo"
job2: # ...
set-output
ワークフローコマンドを使いsteps.foo.outputs.value
値を設定し、それをoutputs
で再度登録します。( JavaScript でいうexport
、 Rust でいう pub
のような感じ)
このようにするとjob2
ではneeds
コンテキストから、needs.<job-id>.outputs.<output-name>
という書き方を使うと、job1
のoutputs
値を取得できます。
jobs:
job1: # ...
job2:
runs-on: ubuntu-18.04
needs:
- job1
steps:
- run: echo ${{ needs.job1.outputs.foo }}
needs.job1.outputs.foo
が取得してる箇所です。この部分は${{ }}
により値が展開され、foo
という文字に置き換わります。よってjob2
の結果は、echo foo
というコマンドを実行して終わります。
すべて展開したものが以下になります。
on: push
jobs:
job1:
runs-on: ubuntu-18.04
outputs:
foo: ${{ steps.foo.outputs.value }}
steps:
- id: foo
run: echo "::set-output name=value::foo"
job2:
runs-on: ubuntu-18.04
needs:
- job1
steps:
- run: echo ${{ needs.job1.outputs.foo }}