GitHub Actions ワークフローでは、複数のジョブを順次実行・並列実行・条件実行することができます。各ジョブは異なるマシン(Runner) もしくは コンテナイメージで実行されます。
順次実行
何も指定しなければ、ジョブは並列に実行されます。順次実行するには、needs
キーワードで、先行のジョブを指定します。
name: Sequential Jobs on: push: jobs: Build1: runs-on: ubuntu-latest steps: - run: echo Build1 Build2: runs-on: ubuntu-latest needs: Build1 steps: - run: echo Build2
実行結果
並列実行 (フォーク)
ジョブを実行後に複数のジョブを並列実行するには、各ジョブの needs
に分岐元のジョブを指定します。
name: Fork Jobs on: push: jobs: Setup: runs-on: ubuntu-latest steps: - run: echo Setup Build1: runs-on: ubuntu-latest needs: Setup steps: - run: echo Build1 Build2: runs-on: ubuntu-latest needs: Setup steps: - run: echo Build2
実行結果
並列実行 (ジョイン)
並列ジョブをジョインして最終の処理を行うには needs
にジョインしたいジョブを列挙します。
name: Join Jobs on: push: jobs: Build1: runs-on: ubuntu-latest steps: - run: echo Build1 Build2: runs-on: ubuntu-latest steps: - run: echo Build2 Teardown: runs-on: ubuntu-latest needs: [Build1, Build2] steps: - run: echo Teardown
実行結果
フォークとジョインの組合せ
CI でビルド後に複数のテストを並列実行して成功したらデプロイするような例です。
name: Deploy on: push: paths: - .github/workflows/deploy.yml jobs: Build: runs-on: ubuntu-latest steps: - run: echo Build TestA: runs-on: ubuntu-latest needs: Build steps: - run: echo Test A TestB: runs-on: ubuntu-latest needs: Build name: Run Test B steps: - run: echo Test B Deploy: runs-on: ubuntu-latest needs: [TestA, TestB] steps: - run: echo Deploy
実行結果
条件実行 (ワークフローの最後に結果を通知)
GitHub Actions ではワークフローの状態は内包するジョブの失敗・成功に依存します。1つでもジョブが失敗していれば、ワークフローの状態は失敗です。ワークフローの状態は success / failure などの関数で取得できるため、ジョブに if
条件文で実行条件を指定します。
Deploy: runs-on: ubuntu-latest needs: [TestA, TestB] steps: - name: Deploy run: echo Deploy Notify_succeed: if: ${{ success() }} runs-on: ubuntu-latest needs: Deploy steps: - name: Notify to Slack channel uses: rtCamp/action-slack-notify@v2 env: SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }} SLACK_USERNAME: GitHUb Actions SLACK_TITLE: Workflow Succeeded SLACK_ICON: https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png SLACK_MESSAGE: 'Run number : #${{ github.run_number }}' Notify_failure: if: ${{ failure() }} runs-on: ubuntu-latest needs: Deploy steps: - name: Notify to Slack channel uses: rtCamp/action-slack-notify@v2 env: SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }} SLACK_USERNAME: GitHUb Actions SLACK_TITLE: Workflow failed SLACK_ICON: https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png SLACK_COLOR: danger SLACK_MESSAGE: 'Run number : #${{ github.run_number }}'
Slack への通知に、以下の Action を利用しました。
失敗時の実行結果
通知の例
成功時の実行結果
通知の例