PR分支中首个Workflow执行成功后,第二个Workflow未触发的问题求助
PR分支中首个Workflow执行成功后,第二个Workflow未触发的问题求助
兄弟我太懂你这种拆分完CI/CD却卡触发的糟心了!之前我把一个大Workflow拆成3个的时候,也踩过PR分支触发后续流程的坑,咱们一步步排查解决~
首先,核心问题基本绕不开GitHub Actions在PR上下文里的权限限制和触发事件配置不对这两个点,咱们一个个来捋:
1. 先检查第二个Workflow的触发配置
假设你的第二个处理发布的Workflow叫release.yml,你得先确保它能接收到第一个Workflow的完成信号。比如这样配置:
# release.yml name: Handle release on: # 先开个手动触发,方便你测试 workflow_dispatch: # 监听第一个Workflow的完成事件 workflow_run: workflows: ["Run build and unit tests"] # 这里必须和你第一个Workflow的name完全一致,多一个空格都不行! types: - completed branches: ["**"] # 确保覆盖你的PR分支
另外,在这个Workflow的job里,记得加个条件,只在第一个Workflow成功时才运行:
jobs: release: runs-on: ubuntu-latest # 只在第一个Workflow成功完成时才启动 if: ${{ github.event.workflow_run.conclusion == 'success' }} steps: - name: 拉取代码 uses: actions/checkout@v4 # 这里放你的发布相关步骤
2. 给第一个Workflow加足够的权限
PR分支里跑的Workflow,默认的GITHUB_TOKEN权限非常有限,连触发其他Workflow的权限都没有!所以你得在第一个validate.yml里明确加上权限:
# validate.yml name: Run build and unit tests on: push: branches: ["**"] pull_request: branches: ["**"] jobs: build-test: runs-on: ubuntu-latest # 必须加这行权限配置,不然触发不了后续Workflow permissions: contents: read workflows: write steps: - name: 拉取代码 uses: actions/checkout@v4 # 这里放你的构建、单元测试步骤...
3. 如果你是用主动触发(不是workflow_run监听)的方式
要是你是在第一个Workflow的最后一步主动调用第二个,那得用actions/github-script来触发,还要注意PR分支的ref问题:
比如在validate.yml的测试步骤后加:
- name: 触发发布Workflow if: ${{ success() }} # 只有测试成功才触发 uses: actions/github-script@v6 with: script: | await github.rest.actions.createWorkflowDispatch({ owner: context.repo.owner, repo: context.repo.repo, workflow_id: 'release.yml', # 填第二个Workflow的文件名 ref: context.head_ref # 这里用head_ref才是PR的源分支,别用ref(那是合并后的分支) })
4. 最后排查PR的特殊情况
- 如果是同一个仓库内的PR分支:上面的配置基本就能解决,要是还不行,去第一个Workflow的日志里找触发步骤的报错,大概率是权限没开对。
- 如果是fork过来的PR分支:那GitHub的安全限制更严,默认的
GITHUB_TOKEN完全没权限触发原仓库的Workflow,这种情况要么你得用存在仓库Secrets里的个人访问令牌(PAT)(只给workflow权限就行),要么就只能等PR合并到主分支后再触发发布流程。
对了,测试的时候可以先手动触发第二个Workflow,确认它本身能正常跑,再去看第一个Workflow的触发逻辑,这样能快速排除是第二个Workflow本身的问题还是触发的问题~




