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

GitHub Actions在Pull Request场景下打标签仅标记master分支问题求助

问题修复方案

根因

标签打在master分支HEAD提交的问题由两个配置错误导致:

  1. PR触发场景下github.sha取值不符合预期:Pull Request触发工作流时,github.sha指向的是GitHub自动生成的「当前PR与master分支的临时合并提交」,并非PR源分支的实际提交。如果合并测试提交生成后master有更新,这个临时合并提交的父提交就会是最新的master HEAD,直接给这个SHA打标签就会出现标签绑定到master HEAD的问题。
  2. checkout动作未适配PR事件拉取规则:旧版本actions/checkout@v2在PR事件下默认只会浅拉取目标分支(master)的内容,没有拉取PR源分支的提交记录,即使指定了ref: ${{ github.sha }},最终操作的提交还是和master绑定。

修复后工作流配置

on:
  push:
    branches:
      - "master"

  pull_request:
    branches: [ master ]

jobs:
  tag:
    runs-on: ubuntu-latest
    outputs:
      name: ${{ steps.generate_tag.outputs.name }}
      target_sha: ${{ steps.get_target_sha.outputs.sha }}

    steps:
      - name: 确定打标签的目标提交SHA
        id: get_target_sha
        run: |
          if [ "${{ github.event_name }}" = "pull_request" ]; then
            echo "::set-output name=sha::${{ github.event.pull_request.head.sha }}"
          else
            echo "::set-output name=sha::${{ github.sha }}"
          fi

      - uses: actions/checkout@v3
        with:
          ref: ${{ steps.get_target_sha.outputs.sha }}
          fetch-depth: 0

      - name: 生成标签名
        id: generate_tag
        run: echo "::set-output name=name::v$(date -d "$(git show -s --format=%ci)" +'%Y.%-m.%-d-%-H%M%S')"

  go:
    runs-on: macos-latest
    needs: [tag]
    steps:
      - uses: actions/checkout@v3
        with:
          ref: ${{ needs.tag.outputs.target_sha }}
          fetch-depth: 0

      - name: 正式版本打标签(master推送触发)
        if: github.event_name == 'push' && github.ref == 'refs/heads/master'
        run: |
          git config user.name "GitHub Actions"
          git config user.email noreply@github.com

          git tag "${{ needs.tag.outputs.name }}" -m "Version: ${{ needs.tag.outputs.name }}"
          # 若需要同步标签到远程仓库,可新增:git push origin ${{ needs.tag.outputs.name }}

      - name: 预发布版本打标签(PR触发)
        if: github.event_name == 'pull_request'
        run: |
          git config user.name "GitHub Actions"
          git config user.email noreply@github.com

          git tag "${{ needs.tag.outputs.name }}"
          # 若需要同步标签到远程仓库,可新增:git push origin ${{ needs.tag.outputs.name }}

核心修改说明

  • 新增target_sha输出参数,PR事件下直接取github.event.pull_request.head.sha,该值为PR源分支的最新实际提交SHA,与master分支完全独立
  • 替换原有的contains(github.ref, 'master')判断逻辑,改为直接匹配事件类型和完整ref值,避免分支名包含master时出现匹配错误
  • 给checkout动作添加fetch-depth: 0参数,拉取全量提交记录,避免打标签时因提交记录不全出现异常
  • 升级checkout到v3版本兼容性更好,若不需要升级保留原有v2.3.4版本也不影响逻辑运行

内容的提问来源于stack exchange,提问作者Peter Lind

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 15:54:03