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 }}