如何延迟触发GitHub Action直至所有前置工作流完成?
如何让GitHub Action等待多个前置工作流全部完成后再运行
你遇到的这个问题确实很常见——默认的workflow_run触发器会在每个指定的工作流完成后单独触发,而不是等全部都结束。不过有两种靠谱的方案可以解决这个需求:
方案一:用workflow_run结合GitHub API检查所有前置工作流状态
思路是让目标工作流依然被每个前置工作流触发,但在执行核心任务前,先通过GitHub API检查另外两个前置工作流是否已经成功完成(和当前触发的这个属于同一次提交/事件)。如果没全部完成,就直接跳过;如果都完成了,再继续执行。
这里是具体的配置示例:
name: 等待全部前置工作流完成后运行 on: workflow_run: workflows: ["Extrae usuario y repo","Nombre contenedor Docker","Crea artefacto con configuración"] types: [completed] jobs: check-and-run: runs-on: ubuntu-latest steps: - name: 检查所有前置工作流是否完成 id: check_workflows uses: actions/github-script@v6 with: script: | const requiredWorkflows = ["Extrae usuario y repo","Nombre contenedor Docker","Crea artefacto con configuración"]; const commitSha = context.payload.workflow_run.head_sha; const completedWorkflows = await Promise.all( requiredWorkflows.map(workflowName => github.rest.actions.listWorkflowRuns({ owner: context.repo.owner, repo: context.repo.repo, workflow_name: workflowName, head_sha: commitSha, status: "completed", conclusion: "success" }) ) ); const allCompleted = completedWorkflows.every(run => run.data.total_count > 0); core.setOutput("all_completed", allCompleted); - name: 执行核心任务(仅当全部前置工作流完成时) if: steps.check_workflows.outputs.all_completed == 'true' run: | echo "所有前置工作流都已完成,开始执行核心任务..." # 这里放你的实际任务代码
这个脚本会针对当前提交的SHA,检查三个指定工作流是否都有成功完成的运行记录。只有当全部都满足时,才会执行后续的核心任务。
方案二:通过检测所有前置工件是否存在来控制执行
如果你的三个前置工作流都会生成各自的工件(artifact),那可以在目标工作流里先尝试下载所有三个工件——如果某个工件不存在,说明对应的前置工作流还没跑完,这时就跳过任务;如果都能下载成功,再继续执行。
示例配置如下:
name: 检测工件后运行 on: workflow_run: workflows: ["Extrae usuario y repo","Nombre contenedor Docker","Crea artefacto con configuración"] types: [completed] jobs: check-artifacts-and-run: runs-on: ubuntu-latest steps: - name: 尝试下载所有前置工件 id: download_artifacts continue-on-error: true uses: actions/download-artifact@v4 with: pattern: "工件1,工件2,工件3" # 替换成你三个前置工作流生成的工件名称 path: ./artifacts github-token: ${{ secrets.GITHUB_TOKEN }} run-id: ${{ github.event.workflow_run.id }} - name: 检查工件是否全部下载成功 id: check_artifacts run: | # 检查每个工件目录是否存在 if [ -d "./artifacts/工件1" ] && [ -d "./artifacts/工件2" ] && [ -d "./artifacts/工件3" ]; then echo "all_artifacts_present=true" >> $GITHUB_OUTPUT else echo "all_artifacts_present=false" >> $GITHUB_OUTPUT fi - name: 执行核心任务(仅当全部工件存在时) if: steps.check_artifacts.outputs.all_artifacts_present == 'true' run: | echo "所有前置工件都已准备好,开始执行核心任务..." # 这里放你的实际任务代码
注意要把pattern里的工件名称替换成你实际的工件名,而且这个方法依赖于每个前置工作流都稳定生成对应的工件。
两种方案各有优劣:方案一更直接检查工作流状态,适合不依赖工件的场景;方案二更简单,适合本身就需要用到前置工件的任务。你可以根据自己的实际情况选择~
内容的提问来源于stack exchange,提问作者jjmerelo
相关产品推荐
相关产品推荐

