如何仅在所有前置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
相关产品推荐
相关产品推荐

