🎡

GitHub Actionsで特定のエラーメッセージによるエラーのみを無視する

2023/06/13に公開

git-pr-release がリリースすべきPRが1つもないときにエラーになるのをCIでは無視したくて、標準エラー出力が No pull requests to be released を含む場合のみエラーを無視する、という対応をしたのですが、えらい苦労したのでやり方をメモしておきます🙄

2023/06/28 追記

この記事で解説している方法では、「git-pr-releaseがリリースすべきPRが1つもないときにエラーになる」件についてはどうやら完全には解決できないようだと判明しました😓

リリースすべきPRが1つもないとき(=mainブランチに直接コミットしたとき)には確かにエラーを無視できるのですが、その後PRをmainブランチにマージしてgit-pr-releaseが実行されたときに、エラーメッセージなしでエラーステータスで終了してしまう(PRは正常に作成または更新される)という挙動になるようです。(厳密には、To use retry middleware with Faraday v2.0+, install `faraday-retry` gem というエラーになり、これを回避すべく gem install faraday-retry するように変更したところ、エラーメッセージなしでエラーステータスで終了してしまいました)

特定のエラーメッセージによるエラーのみを無視する、というユースケースに対応できることは確かですが、ことgit-pr-releaseの No pull requests to be released に関してはこの方法で対処しても解決できないので、ご注意ください🙏

最終的な設定内容

# .github/workflows/ci.yaml

name: CI

on: push

jobs:
  test:
    # 略

  git-pr-release:
    if: ${{ github.ref == 'refs/heads/main' }}
    needs: test
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
        with:
          fetch-depth: 0
      - uses: ruby/setup-ruby@v1
        with:
          ruby-version: 3.1
      - run: gem install -N git-pr-release
      - id: git-pr-release
        env:
          GIT_PR_RELEASE_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          GIT_PR_RELEASE_BRANCH_PRODUCTION: release
          GIT_PR_RELEASE_BRANCH_STAGING: main
        run: |
          EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64)
          echo "error<<$EOF" >> $GITHUB_OUTPUT
          git-pr-release --no-fetch 2>> $GITHUB_OUTPUT || true
          echo "$EOF" >> $GITHUB_OUTPUT
        continue-on-error: true
      - if: ${{ steps.git-pr-release.outputs.error != '' && !contains(steps.git-pr-release.outputs.error, 'No pull requests to be released') }}
        run: |
          echo '::error ::git-pr-release failed with "${{ steps.git-pr-release.outputs.error }}"'
          exit 1

こんな感じでできました。

run: |
  EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64)
  echo "error<<$EOF" >> $GITHUB_OUTPUT
  git-pr-release --no-fetch 2>> $GITHUB_OUTPUT || true
  echo "$EOF" >> $GITHUB_OUTPUT

で、git-pr-release --no-fetch の標準エラー出力を 改行文字も含めて $GITHUB_OUTPUT に渡しています。

continue-on-error: true

によって、git-pr-release --no-fetch の終了ステータスがエラーであってもジョブを続行するようにしています。

その上で、

- if: ${{ steps.git-pr-release.outputs.error != '' && !contains(steps.git-pr-release.outputs.error, 'No pull requests to be released') }}
  run: |
    echo '::error ::git-pr-release failed with "${{ steps.git-pr-release.outputs.error }}"'
    exit 1

で、標準エラー出力の内容が空でなく、かつ No pull requests to be released を含む場合のみ エラーメッセージを吐いてCIをfailさせています。

参考

GitHubで編集を提案

Discussion