GitHub Actionsで全てのジョブの実行を強制する方法

背景

GitHub Actions便利ですね。 着々とMSの資金力に囲われている気がしますが、便利なものには乗っかってしまった方がいいのが事実。

困っていたのはmatrixで複数バージョンのテストを走らせたときに、ひとつ失敗するとまだ終わってないジョブが強制的にキャンセルされてしまうこと。 (実際のActions)

この例だとバージョンの違いでCIが失敗することが分かりますが、その境界が分かりません。これは困る。

ドキュメントを良く見ると、この動作を変える方法が載ってたので紹介する次第です。

方法

ドキュメントの該当箇所は 「Workflow syntax for GitHub Actions - jobs.<job_id>.strategy.fail-fast」です。

strategy.fail-fast-false を指定するだけです。全体はこんな感じ。(実際のActions)

name: Main workflow
on:
  push: {branches: [master]}
  pull_request: {branches: [master]}

jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v1
    - uses: purcell/setup-emacs@master
      with:
        version: '26.3'
    - uses: conao3/setup-keg@master
    - name: Run lint
      run: 'make lint'

  test:
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        emacs_version:
          - '24.1'
          - '24.2'
          - '24.3'
          - '24.4'
          - '24.5'
          - '25.1'
          - '25.2'
          - '25.3'
          - '26.1'
          - '26.2'
          - '26.3'
          - 'snapshot'
        include:
          - emacs_version: 'snapshot'
            allow_failure: true
    steps:
    - uses: actions/checkout@v1
    - uses: purcell/setup-emacs@master
      with:
        version: ${{ matrix.emacs_version }}
    - uses: conao3/setup-keg@master

    - name: Run tests
      if: matrix.allow_failure != true
      run: 'make test'

    - name: Run tests (allow failure)
      if: matrix.allow_failure == true
      run: 'make test || true'

この設定をすることで以下の結果を得ることができました。 境界はEmacs-24.3とEmacs-24.4の間でしたね。

まとめ

マシンを貸し出す側からしたらさっさとジョブを中止したいのだと思いますが、 ユーザーからすると strategy.fail-fastfalse に設定するのは必須かもしれません。

パブリックレポジトリでのActionsは無料なのでどんどん使ってバグをmasterに入れないようにしましょう!

参考