【Github】Github Actions ~ ワークフロー制御 ~

■ はじめに

今回は、Github Actions の ワークフロー実行
の行う・行わないを制御するために必要な扱う。

目次

【1】needs
 1)needs.<job_id>.result
 2)needs.<job_id>.outputs.<output name>
【2】if
 1)if の指定の種類
 2)if に指定する主なイベント
【3】on
 1)push
 2)workflow_run / workflow_call
 3)workflow_dispatch
 4)schedule

【1】needs

* Job依存を指定できる
 => 指定した Job の後に実行される

https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idneeds

jobs:
  job1:
    runs-on: ubuntu-latest
    steps:
      - run: ./job1.sh
  job2:
    needs: job1
    # job2 needs job1
    # => この job2 は、 job1 が必要です
    # => job2実行は、job1 実行後に行われる
    runs-on: ubuntu-latest
    steps:
      - run: ./job2.sh

1)needs.<job_id>.result

* 依存Jobの処理結果を保持
* 取りうる値は、success, failure, cancelled, skipped.

https://docs.github.com/en/actions/learn-github-actions/contexts#needs-context

job-main:
  name: Sample Job
  runs-on: ubuntu-latest
  needs: [sub-job1, sub-job2, sub-job3]
  if: |
    always() &&
    needs.sub-job1.result == 'success' && # ★注目★
    (needs.sub-job2.result == 'success' || needs.sub-job2.result == 'skipped') &&
    (needs.sub-job3c.result == 'success' || needs.sub-job3.result == 'skipped')

2)needs.<job_id>.outputs.

* 依存Jobのoutputsの各Outputを保持

【2】if

* if [条件] で、[条件] が真になった場合に実行する

https://docs.github.com/ja/actions/learn-github-actions/expressions#status-check-functions

1)if の指定の種類

* if には、それぞれ「Job」と「Step」に対するものの2種類ある

[1] jobs.<job_id>.if
https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idif

* Job に対して指定する

https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#example-only-run-job-for-specific-repository

name: example-workflow
on: [push]
jobs:
  production-deploy:
    if: github.repository == 'octo-org/octo-repo-prod'
    runs-on: ubuntu-latest

[2] jobs.<job_id>.steps[*].if
https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsif

* Step に対して指定する

https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#example-using-status-check-functions

steps:
  - name: My first step
    uses: octo-org/action-name@main
  - name: My backup step
    if: ${{ failure() }} # 失敗した時に実行
    uses: actions/heroku@1.0.0

2)if に指定する主なイベント

[1] 成功 - success()

* これまでの手順がすべて成功した場合は true を返す

https://docs.github.com/ja/actions/learn-github-actions/expressions#success

if: ${{ success() }}

[2] 失敗 - failure()

* 失敗時

https://docs.github.com/ja/actions/learn-github-actions/expressions#failure

steps:
  ...
  - name: Failing step
    id: demo
    run: exit 1
  - name: The demo step has failed
    if: ${{ failure() && steps.demo.conclusion == 'failure' }}

[3] 取り消し - cancelled()

* ユーザ・キャンセル時

https://docs.github.com/ja/actions/learn-github-actions/expressions#cancelled

[4] 常時 - always()

* ステップが常に実行され、キャンセルされた場合でも true を返す

https://docs.github.com/ja/actions/learn-github-actions/expressions#always

if: ${{ always() }}

使用上の注意
https://docs.github.com/ja/actions/learn-github-actions/expressions#always

より抜粋
~~~~~~~~~
警告:
成功または失敗に関係なくジョブまたはステップを実行する場合は、
推奨される代替手段 if: ${{ !cancelled() }} を使用してください
~~~~~~~~~

【3】on

* Githubイベント(push/pull_request etc)をハンドリングしてくれる
* 大きく分けて、以下の4種類。
 [1] Githubイベント
 [2] 時刻指定
 [3] 手動実行
 [4] ワークフロー依存

主なGithubイベント
https://docs.github.com/ja/actions/using-workflows/events-that-trigger-workflows

イベント 説明 memo
push リモートリポジトリへpush時 特定のbranch/path/tagなどを指定することも可能
pull_request プルリクエスト作成時
deployment デプロイ時
release リリース時
workflow_run ワークフローの実行時 前ワークフローの完了後に次のワークフローが開始
workflow_call ワークフロー呼び出し時
workflow_dispatch ワークフロー手動実行
schedule cronによる定期実行

1)push

主なプロパティ

* path : 対象パスのみ実行
* paths-ignore : 対象パスは除外(無視)

https://docs.github.com/ja/actions/using-workflows/workflow-syntax-for-github-actions#onpushpull_requestpull_request_targetpathspaths-ignore

例:path / paths-ignore

on:
  push:
    paths:
      # JavaScript ファイル (.js) をプッシュするたびに実行
      - '**.js'
    paths-ignore:
      # 以下は除外
      - 'docs/**'
      - '.github/workflows/**'

2)workflow_run / workflow_call

* 詳細は、以下の関連記事を参照のこと

Github Actions ~ workflow_run / workflow_call ~
https://dk521123.hatenablog.com/entry/2024/02/14/232546

on:
  workflow_run:
    workflows: [Build] # Build という名前のワークフローが実行
    types: [completed] # completed (完了したら)
    branches: [canary] # 名前が canary のブランチ

3)workflow_dispatch

* ワークフロー手動実行
* GitHubのブラウザ上からマニュアル実行できる
* inputs により入力値の指定も可能

https://docs.github.com/ja/actions/using-workflows/events-that-trigger-workflows#workflow_dispatch

使用上の注意

* デフォルトブランチではないと、Githubの画面上に
 実行ボタンが出てこない

https://dev.classmethod.jp/articles/github-actions-workflow-dispatch-default-branch/
https://dev.classmethod.jp/articles/github-actions-running-a-workflow-for-a-workflowdispatch-trigger-that-is-not-on-the-default-branch/
https://jousys-force.deepapex.com/blogs/run-github-actions-workflow

例:入力パラメータ付き手動実行

on:
  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:
    inputs:
      chosen-hello-world:
        required: true
        type: choice
        options:
        - Hello
        - World

jobs:
  sample-job:
    runs-on: ubuntu-latest
    steps:
      - name: Run a one-line script
        run: echo Hello, world! - ${{ inputs.chosen-hello-world }}

4)schedule

* 時刻指定
* cronによる定期実行

関連記事

Github ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2019/07/18/234652
Github Actions ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2021/11/04/142835
Github Actions ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2022/06/16/151443
Github Actions ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2023/12/22/195715
Github Actions ~ workflow_run / workflow_call ~
https://dk521123.hatenablog.com/entry/2024/02/14/232546
Github Actions ~ あれこれ編 ~
https://dk521123.hatenablog.com/entry/2023/12/21/155224
Github Actions ~ 外部シェルスクリプト実行 ~
https://dk521123.hatenablog.com/entry/2024/01/19/003044
Github Actions ~ 設定値を切り替えることを考える ~
https://dk521123.hatenablog.com/entry/2024/02/18/232926
GitHub CLI ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2024/02/17/233836