GitHub Actions工作流如何排除指定退出码对最终状态的影响
解决方案
需求完全可以实现,先说明当前工作流标记失败的原因:
GitHub Actions工作流的最终状态由所有未被跳过的job状态聚合生成,只要存在任意一个未跳过的失败job,整体状态就会被标记为失败。你当前配置中build job执行失败且未被跳过,因此即便后续reformat job执行成功,工作流整体状态仍为失败。
方案一:合并为单job处理(更适配你的场景,配置更简单)
将格式检查和自动修复逻辑放在同一个job中,给检查步骤添加continue-on-error: true避免步骤失败直接导致job失败,后续根据检查步骤的执行结果判断是否需要执行修复逻辑,只要最终修复步骤执行成功,整个job就会标记为成功,对应工作流状态也为成功。
修改后的完整配置如下:
name: autoblack on: [pull_request, push] jobs: autoblack: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2.3.4 - name: Set up Python 3.8 uses: actions/setup-python@v2.2.2 with: python-version: 3.8 - name: Install Black run: pip3 install git+git://github.com/psf/black - name: Run black --check . id: black-check continue-on-error: true run: black --check . - name: If needed, commit black changes to the pull request if: steps.black-check.outcome == 'failure' run: | black --fast . git config --global user.name 'autoblack' git config --global user.email 'signorrayan@users.noreply.github.com' git remote set-url origin https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/$GITHUB_REPOSITORY git checkout $GITHUB_HEAD_REF git commit -am "fixup: Format Python code with Black" git push
方案二:保留多job结构,新增最终状态校验job
如果你需要保留原有多job的拆分逻辑,可以新增一个最终校验job,该job的状态作为工作流的最终判定基准:
- 最终job依赖原有的
build和reformat两个job,配置if: always()确保不管前置job状态如何都会执行 - 在最终job中判断:只要
build成功 或者reformat修复成功,就返回成功退出码,否则返回失败退出码 - 如果你配置了分支保护规则,需要将原有要求
buildjob通过的规则,修改为要求新增的最终校验job通过
新增的job配置示例如下:
# 原有build、reformat job配置保持不变 final-status-check: runs-on: ubuntu-latest needs: [build, reformat] if: always() steps: - name: Check overall status run: | if [[ "${{ needs.build.result }}" == "success" ]] || [[ "${{ needs.reformat.result }}" == "success" ]]; then exit 0 else exit 1 fi
内容的提问来源于stack exchange,提问作者Signor
相关产品推荐
相关产品推荐

