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

如何在当前GitHub Action运行中获取上一次任务执行结果

复用GitHub工作流上一次运行的stageA成功结果,跳过重复执行

针对你的场景,要实现跳过已成功的stageA、仅重跑失败的stageB,核心是记录并校验当前PR HEAD提交对应的stageA是否已成功执行过,具体实现如下:

实现步骤

  1. 添加前置校验Job:检查上一次运行是否已经为当前提交成功执行过stageA
  2. 修改stageA的运行条件:仅在校验不通过时才执行
  3. 存储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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 03:54:15