GitHub Actions如何仅在release发布时待test通过后运行publish工作流
问题原因
你当前配置的错误点在于把workflow_run设为了publish工作流的触发事件。workflow_run的触发规则是:只要你指定的test工作流执行完成,不管test是被什么事件触发的(推送代码、PR、手动触发等),都会立刻触发publish工作流,这就是你往main分支推代码后,test跑完就误触发publish的根本原因。workflow_run本身是独立的触发机制,没法直接实现“仅在release发布时触发,同时等待test工作流成功”的需求,必须调整触发和执行逻辑。
修改方案
- 删掉触发配置里的整个
workflow_run块,只保留release published作为publish的唯一触发源,从根源上避免其他场景误触发。 - 在publish工作流里加前置校验步骤,轮询检查当前release对应提交上的test工作流运行状态,确认test跑成功了再执行后续发布逻辑。
修改后的完整工作流配置如下:
name: publish on: release: types: [published] permissions: actions: read contents: read jobs: wait-for-test: runs-on: ubuntu-latest steps: - name: Check test workflow status uses: actions/github-script@v7 with: script: | const checkInterval = 30000 // 每30秒轮询一次 const maxWaitTime = 3600000 // 最长等待1小时 const startTime = Date.now() while (Date.now() - startTime < maxWaitTime) { const runs = await github.rest.actions.listWorkflowRuns({ owner: context.repo.owner, repo: context.repo.repo, workflow_id: 'test.yml', // 替换为你test工作流的实际文件名 head_sha: context.sha, }) const targetRun = runs.data.workflow_runs.find(run => run.head_sha === context.sha) if (targetRun) { if (targetRun.conclusion === 'success') { console.log('Test workflow passed, start publish process') return } if (['failure', 'cancelled', 'timed_out'].includes(targetRun.conclusion)) { throw new Error(`Test workflow ended with status: ${targetRun.conclusion}, publish aborted`) } } console.log('Test workflow still running, waiting...') await new Promise(resolve => setTimeout(resolve, checkInterval)) } throw new Error('Wait for test workflow timeout, publish aborted') publish: needs: wait-for-test runs-on: ubuntu-latest steps: # 在此处补充你的实际发布步骤,比如拉取代码、构建、上传制品、发布到包管理平台等 - run: echo 'Start publishing release assets'
配置说明
- 触发逻辑上彻底移除了
workflow_run,publish工作流只会在版本正式发布时触发,不会再响应代码推送、PR等其他场景关联的test工作流完成事件。 - 前置
wait-for-test任务会绑定当前release对应的commit哈希检查test运行状态,不会误判其他分支/提交上的test结果。 - 轮询逻辑会在test成功后自动进入发布流程,test异常或等待超时会直接终止工作流,避免发布未经过测试验证的版本。
- 你只需要把
workflow_id字段替换为自己test工作流的实际文件名,再补充publish任务下的发布步骤即可正常使用。
内容的提问来源于stack exchange,提问作者Shalom Alecheim
相关产品推荐
相关产品推荐

