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

如何仅在所有前置Job成功时运行GitHub Action的第4个Job?

解决GitHub Action中仅当前置Job全部成功时才运行后续Job的问题

你的问题出在前置Job设置了continue-on-error: true——这个配置会让Job即使内部步骤失败,整个Job的结果依然被标记为success,所以你之前写的if条件判断完全起不到作用,不管前置步骤实际有没有失败,run-debug-tests.result这类值始终是success,导致build_job总会触发。

下面给你两种解决方案,根据你的实际需求选择:

方案一:移除continue-on-error: true(推荐,如果你不需要前置Job失败后仍标记为成功)

默认情况下,needs指定的前置Job必须全部成功,后续Job才会运行。只要去掉三个前置Job的continue-on-error: true配置,原有的needs就能满足你的需求:

name: Test and Build
on:
  push:

jobs:
  run-debug-tests:
    name: Unit tests
    runs-on: ubuntu-latest

  run-ui-tests:
    name: Android Tests
    runs-on: macos-latest

  lint:
    name: Lint check
    runs-on: ubuntu-latest

  build_job:
    name: Building the APK
    runs-on: ubuntu-latest
    needs: [run-debug-tests, run-ui-tests, lint]

方案二:保留continue-on-error: true时的处理(如果必须让前置Job失败不影响Workflow整体状态)

如果一定要保留continue-on-error: true,那不能通过Job的result判断,得通过步骤的输出变量来识别前置Job的实际执行状态:

name: Test and Build
on:
  push:

jobs:
  run-debug-tests:
    name: Unit tests
    runs-on: ubuntu-latest
    continue-on-error: true
    outputs:
      passed: ${{ steps.check_pass.outputs.passed }}
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
      # 替换成你的实际单元测试命令
      - name: Run unit tests
        run: ./gradlew testDebug
      - name: Mark as passed
        id: check_pass
        if: success()
        run: echo "passed=true" >> $GITHUB_OUTPUT

  run-ui-tests:
    name: Android Tests
    runs-on: macos-latest
    continue-on-error: true
    outputs:
      passed: ${{ steps.check_pass.outputs.passed }}
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
      # 替换成你的实际UI测试命令
      - name: Run UI tests
        run: ./gradlew connectedDebugAndroidTest
      - name: Mark as passed
        id: check_pass
        if: success()
        run: echo "passed=true" >> $GITHUB_OUTPUT

  lint:
    name: Lint check
    runs-on: ubuntu-latest
    continue-on-error: true
    outputs:
      passed: ${{ steps.check_pass.outputs.passed }}
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
      # 替换成你的实际lint命令
      - name: Run lint check
        run: ./gradlew lintDebug
      - name: Mark as passed
        id: check_pass
        if: success()
        run: echo "passed=true" >> $GITHUB_OUTPUT

  build_job:
    name: Building the APK
    runs-on: ubuntu-latest
    needs: [run-debug-tests, run-ui-tests, lint]
    if: needs.run-debug-tests.outputs.passed == 'true' && needs.run-ui-tests.outputs.passed == 'true' && needs.lint.outputs.passed == 'true'
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
      # 替换成你的实际构建命令
      - name: Build APK
        run: ./gradlew assembleDebug

方案二逻辑说明:

每个前置Job中,只有当所有步骤都成功时,才会执行Mark as passed步骤并输出passed=true;如果前置Job的步骤失败,continue-on-error: true会让Job继续执行,但Mark as passed步骤不会触发,输出变量passed为空。build_job通过判断三个前置Job的passed输出都为true,才会启动构建流程。

内容的提问来源于stack exchange,提问作者Alex20280

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 02:37:24