複数のジョブ

1 つのワークフローには複数のジョブを持てます。

並行実行

以下の例はjob1job2という 2 つのジョブを設定してます。

jobs:
  job1: # ...
  job2: # ...

何かしらのトリガーを弾いた時、これらは並行に実行されます。

順次実行

<job>.needs値を設定すると順次実行できます。

例えば、job2job1が完了後実行させたいなら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>という書き方を使うと、job1outputs値を取得できます。

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