GitHub Actions中能否等待其他仓库工作流完成后再触发当前工作流?
GitHub Actions跨仓库依赖触发实现方案
完全可以实现该需求,核心逻辑是监听test、core两个仓库的工作流成功状态,确认二者均成功后触发actual仓库的工作流,以下是可直接落地的实现步骤:
前置准备
- 生成一个具有
repo全权限的个人访问令牌(PAT),将该令牌存入test、core、actual三个仓库的Actions Secrets中,命名为DEPLOY_PAT
步骤1:配置test、core仓库的工作流上报逻辑
在test、core两个仓库的工作流末尾添加状态上报步骤,工作流执行成功时会主动通知actual仓库:
# 仅工作流整体执行成功时运行该步骤 - name: 上报成功状态到actual仓库 if: ${{ success() }} run: | curl -L \ -X POST \ -H "Accept: application/vnd.github+json" \ -H "Authorization: Bearer ${{ secrets.DEPLOY_PAT }}" \ https://api.github.com/repos/替换为你的GitHub用户名/actual/dispatches \ -d '{"event_type":"pre-workflow-finish","client_payload":{"repo":"test","commit_sha":"${{ github.sha }}"}}'
注意:core仓库的上报步骤需要把
client_payload里的repo值改成core
步骤2:配置actual仓库的校验触发逻辑
在actual仓库中创建新的工作流文件,每次收到test或core的上报通知时,自动校验两个前置仓库的工作流状态,均成功时执行对应任务:
name: 前置工作流校验&任务执行 on: repository_dispatch: types: [pre-workflow-finish] jobs: check-and-trigger: runs-on: ubuntu-latest steps: - name: 校验test和core工作流状态 id: check run: | # 获取当前触发的提交SHA,确保校验的是同一次代码变更对应的工作流 TARGET_SHA=${{ github.event.client_payload.commit_sha }} # 查询test仓库对应SHA的工作流状态 TEST_RES=$(curl -L -H "Authorization: Bearer ${{ secrets.DEPLOY_PAT }}" "https://api.github.com/repos/替换为你的GitHub用户名/test/actions/runs?head_sha=$TARGET_SHA&status=completed" | jq -r '.workflow_runs[0].conclusion') # 查询core仓库对应SHA的工作流状态 CORE_RES=$(curl -L -H "Authorization: Bearer ${{ secrets.DEPLOY_PAT }}" "https://api.github.com/repos/替换为你的GitHub用户名/core/actions/runs?head_sha=$TARGET_SHA&status=completed" | jq -r '.workflow_runs[0].conclusion') if [ "$TEST_RES" = "success" ] && [ "$CORE_RES" = "success" ]; then echo "pass=true" >> $GITHUB_OUTPUT fi - name: 执行actual仓库对应工作流任务 if: steps.check.outputs.pass == 'true' run: | # 此处替换为你需要执行的actual仓库的业务逻辑 echo "test、core工作流均执行成功,开始运行当前任务"
可选优化点
- 如果不需要严格匹配同一次提交的工作流,可以去掉提交SHA的校验逻辑,直接校验两个仓库最近一次完成的工作流状态即可
- 可以添加失败告警逻辑,当其中任意一个前置工作流失败时发送通知
内容的提问来源于stack exchange,提问作者lakshmiravali rimmalapudi
相关产品推荐
相关产品推荐

