Github Action:release.yml触发失败,如何触发并等待main.yml完成?
问题解决:修复Github Actions Release工作流跳过问题并实现依赖等待
问题根源分析
- Release工作流被跳过的直接原因:
release.yml中两个Job的if: ${{ github.ref == 'refs/heads/master' }}条件完全错误。推送标签时,github.ref的值格式为refs/tags/vx.x.x,永远不会等于分支引用refs/heads/master,导致所有Job直接被跳过。 - 额外执行错误:
npm-publishJob中使用了未定义的matrix.node变量,会导致执行阶段报错。 - 顺序依赖缺失:当前
main.yml和release.yml是独立触发的,无法保证Release流程在CI构建完成后执行。
解决方案步骤
第一步:修复Release工作流的触发与执行错误
修改release.yml,移除错误条件并修复Node版本配置:
name: Release new version on: push: tags: - "v*" jobs: npm-publish: name: NPM Release runs-on: ubuntu-latest steps: - name: Checkout repo uses: actions/checkout@v2 - name: Use Node 14.x uses: actions/setup-node@v1 with: node-version: '14.x' # 直接指定稳定版本,也可添加matrix多版本测试 registry-url: 'https://registry.npmjs.org/' # 明确指定npm源 - name: Install deps and build (with cache) uses: bahmutov/npm-install@v1 - name: Publish run: npm publish env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} # setup-node官方推荐使用该变量名 github-release: name: Github Release needs: [npm-publish] runs-on: ubuntu-latest steps: - uses: "marvinpinto/action-automatic-releases@latest" with: repo_token: "${{ secrets.GITHUB_TOKEN }}" prerelease: false
第二步:实现Release工作流等待CI完成
推荐采用更简洁的方式B,通过调整CI触发条件+工作流依赖实现顺序控制:
1. 修改main.yml,让CI在分支推送和标签推送时都触发
name: Node Continous Integration on: push: branches: [master] tags: ["v*"] # 添加标签触发规则,确保打标签时也执行CI构建 jobs: build: name: Build on Node ${{ matrix.node }} and ${{ matrix.os }} runs-on: ${{ matrix.os }} strategy: matrix: node: ['10.x', '12.x', '14.x'] os: [ubuntu-latest, windows-latest, macOS-latest] steps: - name: Checkout repo uses: actions/checkout@v2 - name: Use Node ${{ matrix.node }} uses: actions/setup-node@v1 with: node-version: ${{ matrix.node }} - name: Install deps and build (with cache) uses: bahmutov/npm-install@v1 - name: Build run: npm run build
2. 修改release.yml,仅在CI成功完成且触发源是标签时执行
name: Release new version on: workflow_run: workflows: ["Node Continous Integration"] # 对应CI工作流的名称 types: - completed branches: [master] jobs: check-release-trigger: runs-on: ubuntu-latest outputs: is_tag_release: ${{ steps.check.outputs.is_tag_release }} steps: - id: check run: | # 验证原工作流的触发源是否为标签推送 HEAD_REF="${{ github.event.workflow_run.head_ref }}" if [[ "$HEAD_REF" =~ ^refs/tags/v ]]; then echo "is_tag_release=true" >> $GITHUB_OUTPUT else echo "is_tag_release=false" >> $GITHUB_OUTPUT fi env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} npm-publish: name: NPM Release runs-on: ubuntu-latest needs: check-release-trigger # 仅当CI成功且是标签触发时才执行 if: ${{ needs.check-release-trigger.outputs.is_tag_release == 'true' && github.event.workflow_run.conclusion == 'success' }} steps: - name: Checkout repo uses: actions/checkout@v2 - name: Use Node 14.x uses: actions/setup-node@v1 with: node-version: '14.x' registry-url: 'https://registry.npmjs.org/' - name: Install deps and build (with cache) uses: bahmutov/npm-install@v1 - name: Publish run: npm publish env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} github-release: name: Github Release needs: [npm-publish] runs-on: ubuntu-latest steps: - uses: "marvinpinto/action-automatic-releases@latest" with: repo_token: "${{ secrets.GITHUB_TOKEN }}" prerelease: false
内容的提问来源于stack exchange,提问作者Shalev Sror
相关产品推荐
相关产品推荐

