3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GitHub Actionsにおける複数ジョブの基本の基本

Posted at

概要

  • GithubActionsをいじる機会が多くなってきたが、知見がないため覚書
    • かなり基本的な内容です。もし間違ってたらご指摘ください🙇‍♂
    • 「こんなやり方もあるよー」などのご意見もありましたらぜひいただけると大変嬉しいです🙇‍♂
  • この記事の内容
    1. 複数ジョブの並列実行のやり方(ジョブの基本)
    2. 複数ジョブの逐次実行のやり方
    3. 複数ジョブ間のデータ共有のやり方

ジョブの基本

  • 単一のワークフローから、複数のジョブが起動できる
  • 複数ジョブを起動すると、デフォルトでは並列実行される
    • なので、適切にジョブ分割するとワークフロー全体の実行時間を短縮できる

ジョブの並列実行

  • まず、デフォルトで「複数ジョブは並列実行される」ということを確認

お試し用ワークフローファイルを作成

name: Tests Workflow
on: push

jobs:
  job1:
    runs-on: ubuntu-latest
    steps:
      - run: sleep 10 && echo "job1"
  job2:
    runs-on: ubuntu-latest
    steps:
      - run: sleep 10 && echo "job2"
  job3:
    runs-on: ubuntu-latest
    steps:
      - run: sleep 10 && echo "job3"
  • 【結果】pushしてワークフローを発火させると、以下のように並列で回っていることを確認
    image.png

ジョブの逐次実行

  • ジョブ間で依存関係がある場合など、逐次実行したい際はneedsを使用する
    • needs: [実行前に終了させたいジョブIDを指定]
    • needsは配列形式で複数指定が可能
name: Tests Workflow
on: push

jobs:
  job1: # 最初に実行
    runs-on: ubuntu-latest
    steps:
      - run: sleep 10 && echo "job1"
  job2: # job1が終了した後に実行
    runs-on: ubuntu-latest
    needs: [job1]
    steps:
      - run: sleep 10 && echo "job2"
  job3: # job2が終了した後に実行
    runs-on: ubuntu-latest
    needs: [job2]
    steps:
      - run: sleep 10 && echo "job3"

逐次実行されていることを確認
image.png

複数指定した場合

name: Tests Workflow
on: push

jobs:
  job1: # 最初に実行
    runs-on: ubuntu-latest
    steps:
      - run: sleep 10 && echo "job1"
  job2: # 最初に実行
    runs-on: ubuntu-latest
    steps:
      - run: sleep 10 && echo "job2"
  job3: # job1とjob2が終了した後に実行
    runs-on: ubuntu-latest
    needs: [job1, job2]
    steps:
      - run: sleep 10 && echo "job3"

job1とjob2が終了したあとにjob3が実行されていることを確認
image.png

ジョブ間のデータ共有

  • GitHub Actionsでは各ジョブごとに別々のランナー(実行環境)で実行されるので、何かしらの値を別ジョブに渡したいときは少々工夫が必要
  • 主にoutputsGITHUB_OUTPUTを使用する
  • 以前は::save-outputを使用してデータ共有ができたが現在は非推奨
    • echo “::set-output name={name}::{value}” → echo “{name}={value}” >> $GITHUB_OUTPUT

公式が出していたset-outputのサンプル

name: Tests Workflow
on: push

jobs:
  job1:
    runs-on: ubuntu-latest
    # Map a step output to a job output
    outputs:
      output1: ${{ steps.step1.outputs.test }}
      output2: ${{ steps.step2.outputs.test }}
    steps:
    - id: step1
      run: echo "::set-output name=test::hello"
    - id: step2
      run: echo "::set-output name=test::world"
  job2:
    runs-on: ubuntu-latest
    needs: job1
    steps:
    - run: echo ${{needs.job1.outputs.output1}} ${{needs.job1.outputs.output2}}

一応まだ使用できる
image.png

だがしかしがっつり警告が出ている(ので使用はやめよう)
image.png

$GITHUB_OUTPUToutputs使用して変数の値を受け渡し

構文
steps:
  - id: <ステップID>
    run: echo "<key>=<value>" >> "${GITHUB_OUTPUT}
outputs:
  <アウトプット名>: ${{ steps.<ステップID>.outputs.<key> }}

ポイント

  • 主に使用するコンテキスト
    • needs, id(ステップID), outputsが必要
  • 変数の形式
    • GITHUB_OUTPUT環境変数へはkey=value形式で値を書き出す
    • GITHUB_OUTPUTは、ステップの出力パラメータの設定に使う環境ファイル
      • そのためリダイレクトで追記するという形式になっている
  • 別jobに変数の値を渡すまでの流れ
    • ステップ内でidを定義し、他のステップやoutputsキーで$GITHUB_OUTPUT内の値が受け取れるようにする(before_jobからafter_jobに渡す)
      • ちなみにbefore_jobにoutputsキーを定義することで、before_job内の複数ステップ内で値を参照できるようになる(用途としてはGITHUB_ENV使う時と同様)
        • ${{ steps.<step-id>.outputs.<key> }}
    • after_job側でneedsを用いることで、before_jobで定義したoutputsの値を受け取れるようにできる
      • ${{ needs.<ジョブID>.outputs.<アウトプット名> }}
name: Tests Workflow
on: push

jobs:
  before_job: # 最初に実行
    runs-on: ubuntu-latest
    steps:
      - id: generate # ステップID
        run: echo "result=HELLO" >> "${GITHUB_OUTPUT}"
    outputs:
      ghop_result: ${{ steps.generate.outputs.result }} # GITHUB_OUTPUTのresultを参照
  after_job:
    runs-on: ubuntu-latest
    needs: before_job # before_jobが先に終了するように依存関係を作成
    steps:
      - env:
          RESULT: ${{ needs.before_job.outputs.ghop_result }} # 依存関係ジョブのoutputsを参照
        run: echo $RESULT

  • ちなみに受け取った値を環境変数に入れず、直接run: echo "${{ needs.before_job.outputs.ghop_result }}"みたいにするのはアンチパターンのためNG

image.png

値がafter_jobに渡っていることを確認
image.png

参考

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?