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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 21:33:28