在GitHub Actions中如何让所有步骤执行但任一失败则任务失败?
解决方案:实现CI步骤续跑且最终任务按需失败
针对你需要在单个任务中完成lint、类型检查、单元测试,同时满足「前序步骤失败仍继续执行」和「任意步骤失败则任务最终失败」的需求,不需要用continue-on-error,可以通过捕获每个步骤的退出码,最后统一判断的方式实现,具体方案如下:
核心思路
- 关闭shell的 errexit 选项(
set +e),让单个命令失败时不中断当前步骤的脚本执行 - 每个步骤执行后,将命令的退出码保存为步骤输出变量
- 最后添加一个汇总步骤,检查所有步骤的退出码,只要有非0值就触发任务失败
完整配置示例(以GitHub Actions为例)
jobs: full-check: runs-on: ubuntu-latest steps: - name: 拉取代码 uses: actions/checkout@v4 - name: 配置运行环境 run: | # 这里替换成你的环境初始化命令,比如安装依赖 npm install - name: 执行Lint检查 id: lint-step run: | set +e npm run lint # 将退出码写入步骤输出 echo "exit_code=$?" >> "$GITHUB_OUTPUT" - name: 执行类型检查 id: type-check-step run: | set +e npm run type-check echo "exit_code=$?" >> "$GITHUB_OUTPUT" - name: 执行单元测试 id: unit-test-step run: | set +e npm run test:unit echo "exit_code=$?" >> "$GITHUB_OUTPUT" - name: 汇总检查结果 run: | # 读取各步骤的退出码 LINT_CODE=${{ steps.lint-step.outputs.exit_code }} TYPE_CODE=${{ steps.type-check-step.outputs.exit_code }} TEST_CODE=${{ steps.unit-test-step.outputs.exit_code }} # 判断是否有步骤失败 if [ "$LINT_CODE" -ne 0 ] || [ "$TYPE_CODE" -ne 0 ] || [ "$TEST_CODE" -ne 0 ]; then echo "⚠️ 存在失败的检查步骤,任务标记为失败" exit 1 fi
方案说明
- 步骤续跑:
set +e让每个步骤里的lint/类型检查/测试命令失败后,脚本仍会执行到保存退出码的逻辑,不会中断后续步骤的运行,你能看到所有步骤的完整错误输出 - 任务最终失败:最后一步汇总所有步骤的退出码,只要有任意一个非0,就执行
exit 1,让整个任务标记为失败,符合你需要的最终结果判断逻辑 - 避免重复配置:所有步骤都在同一个任务里,环境只需要初始化一次,不需要拆分多个任务重复配置
内容的提问来源于stack exchange,提问作者Shoreline
相关产品推荐
相关产品推荐

