GitHub Actionsで特定のエラーメッセージによるエラーのみを無視する
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させています。
参考
- Workflow syntax for GitHub Actions - GitHub Docs
#jobsjob_idstepscontinue-on-error
- How to fail a job in Github Actions? - Stack Overflow
#answer-74229789
- Workflow commands for GitHub Actions - GitHub Docs
#example-creating-an-annotation-for-an-error
- Capture stderr in GitHub Actions - Stack Overflow
#answer-65044849
- GitHub Actions で複数行の文字列を output にセットする方法 | gotohayato.com
#方法-b-区切り文字を使う
- Workflow commands for GitHub Actions - GitHub Docs
#example-of-a-multiline-string
Discussion