🍣

GitHub Actions における always の挙動

2025/02/16に公開

はじめに

GitHub Actions で workflow を利用するにあたって、always を if での制御に利用したときの挙動について知っているようで、ちゃんと認識できていなかったかもと思い、検証してみました。

リポジトリはこちら↓

https://github.com/Wataru-Toriumi/github-actions-always-test

やったこと

composition action として、 always や input と組み合わせた step を定義する。

name: "Composite IF Action"
description: "Composite Action で always() と input による if 条件の挙動確認サンプル"
inputs:
  conditionFlag:
    description: "true を指定すると条件付きステップが実行されます"
    required: false
    default: "false"
runs:
  using: "composite"
  steps:
    - name: "ステップ: 常に実行 (always())"
      if: ${{ always() }}
      shell: bash
      run: echo "このステップは常に実行されます。"

    - name: "ステップ: input に基づく条件実行"
      if: ${{ inputs.conditionFlag == 'true' }}
      shell: bash
      run: echo "conditionFlag が true なので、このステップが実行されました。"

    - name: "ステップ: always() と input の組み合わせ"
      if: ${{ always() && inputs.conditionFlag == 'true' }}
      shell: bash
      run: echo "常に評価される always() と、conditionFlag のチェックの組み合わせです。"

上で定義した action を input を変えながら、実行してみる。

"Test Composite IF Action"

on:
  push:
    branches: [main]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: "Composite Action 実行 (conditionFlag=false)"
        uses: ./.github/actions/composite-if-action
        with:
          conditionFlag: "false"
      - name: "Composite Action 実行 (conditionFlag=true)"
        uses: ./.github/actions/composite-if-action
        with:
          conditionFlag: "true"
  failure:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: "失敗ステップ"
        run: |
          echo "このステップは常に失敗します。"
          exit 1
  failure-test:
    runs-on: ubuntu-latest
    needs: failure
    steps:
      - uses: actions/checkout@v3
      - name: "Composite Action 実行 (conditionFlag=false)"
        uses: ./.github/actions/composite-if-action
        with:
          conditionFlag: "false"
      - name: "Composite Action 実行 (conditionFlag=true)"
        uses: ./.github/actions/composite-if-action
        with:
          conditionFlag: "true"

結果

こんな感じで、前段の job で失敗するとキャンセルされる形になりますね。

成功したjobの方はどのような挙動なのだろう。

こんな感じになったので、always は常に true を返して、input の値によって、挙動が変わっていることがわかりますね。

追加検証

composition action 内で失敗した場合だと、always は動いてくれるのだろうか?というところが気になったので、追加検証。

name: "Composite IF Failure Action"
description: "Composite Action で always() と input による if 条件の挙動確認サンプル"
inputs:
  conditionFlag:
    description: "true を指定すると条件付きステップが実行されます"
    required: false
    default: "false"
runs:
  using: "composite"
  steps:
    - name: "失敗ステップ"
      shell: bash
      run: |
        echo "このステップは常に失敗します。"
        exit 1
    - name: "ステップ: 常に実行 (always())"
      if: ${{ always() }}
      shell: bash
      run: echo "このステップは常に実行されます。"

    - name: "ステップ: input に基づく条件実行"
      if: ${{ inputs.conditionFlag == 'true' }}
      shell: bash
      run: echo "conditionFlag が true なので、このステップが実行されました。"

    - name: "ステップ: always() と input の組み合わせ"
      if: ${{ always() && inputs.conditionFlag == 'true' }}
      shell: bash
      run: echo "常に評価される always() と、conditionFlag のチェックの組み合わせです。"

追加検証の結果

こんな感じになりましたね。一応、always の部分はちゃんと実行してくれる感じで、このステップ自体は fail になるという挙動ですね。そのため、後続の処理がスキップされるという。

こういうところを考えると、composition action 内の失敗かどうかやその後の steps が存在しているかを気にしながらやっていくと想定通りの挙動を実現できそうだなー。

まとめ

composition action を使いながら、always のあるジョブ・ステップの挙動を確認してみましたが、composition action で共通化する際は、ここら辺の挙動を気にしながら進めていきたいですね。

Discussion