如何在当前GitHub Action运行中获取上一次任务执行结果
复用GitHub工作流上一次运行的stageA成功结果,跳过重复执行
针对你的场景,要实现跳过已成功的stageA、仅重跑失败的stageB,核心是记录并校验当前PR HEAD提交对应的stageA是否已成功执行过,具体实现如下:
实现步骤
- 添加前置校验Job:检查上一次运行是否已经为当前提交成功执行过stageA
- 修改stageA的运行条件:仅在校验不通过时才执行
- 存储stageA成功标记:stageA成功后,上传包含当前提交SHA的标识文件,供后续校验使用
修改后的完整工作流代码
name: CI Deployment on: pull_request: types: [opened, synchronize, reopened] concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} cancel-in-progress: true jobs: # 校验上一次运行是否已成功执行当前提交的stageA check_previous_run: runs-on: ubuntu-latest outputs: needs_stageA: ${{ steps.check.outputs.needs_stageA }} steps: - name: 获取当前PR的HEAD提交SHA id: get_sha run: echo "sha=${{ github.event.pull_request.head.sha }}" >> $GITHUB_OUTPUT - name: 尝试下载上一次stageA成功的标记文件 uses: actions/download-artifact@v4 id: download with: name: pr-${{ github.event.pull_request.number }}-stageA-success path: ./stageA-check ignore-missing: true # 没有artifact时不报错 - name: 判断是否需要重新执行stageA id: check run: | if [ -f ./stageA-check/success-sha.txt ] && [ "$(cat ./stageA-check/success-sha.txt)" == "${{ steps.get_sha.outputs.sha }}" ]; then echo "needs_stageA=false" >> $GITHUB_OUTPUT else echo "needs_stageA=true" >> $GITHUB_OUTPUT fi # 仅在校验不通过时执行stageA stageA: needs: check_previous_run if: needs.check_previous_run.outputs.needs_stageA == 'true' runs-on: ubuntu-latest steps: - name: 执行stageA逻辑 run: echo "pass" - name: 生成成功标记文件 run: echo "${{ github.event.pull_request.head.sha }}" > success-sha.txt - name: 上传成功标记到artifact uses: actions/upload-artifact@v4 with: name: pr-${{ github.event.pull_request.number }}-stageA-success path: success-sha.txt overwrite: true # 覆盖旧的标记文件 # 无论stageA是否执行,都运行stageB(实现重跑失败任务的逻辑) stageB: needs: [check_previous_run, stageA] if: always() runs-on: ubuntu-latest steps: - name: 执行stageB逻辑 run: | echo "fail" exit 1
关键逻辑说明
- PR绑定的标记文件:artifact命名包含PR编号,确保不同PR的标记不会混淆
- SHA校验:只有当当前提交的SHA与已成功执行的SHA完全匹配时,才跳过stageA,避免新提交复用旧结果
- 强制运行stageB:使用
if: always()确保即使stageA被跳过,stageB依然会执行,满足重跑失败任务的需求 - 自动更新标记:如果PR有新提交,SHA变化会触发重新执行stageA,并更新标记文件
内容的提问来源于stack exchange,提问作者gamechanger17
相关产品推荐
相关产品推荐

