You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在GitHub Actions中如何让所有步骤执行但任一失败则任务失败?

解决方案:实现CI步骤续跑且最终任务按需失败

针对你需要在单个任务中完成lint、类型检查、单元测试,同时满足「前序步骤失败仍继续执行」和「任意步骤失败则任务最终失败」的需求,不需要用continue-on-error,可以通过捕获每个步骤的退出码,最后统一判断的方式实现,具体方案如下:

核心思路

  1. 关闭shell的 errexit 选项(set +e),让单个命令失败时不中断当前步骤的脚本执行
  2. 每个步骤执行后,将命令的退出码保存为步骤输出变量
  3. 最后添加一个汇总步骤,检查所有步骤的退出码,只要有非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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 18:32:40