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

如何在GitHub Actions构建成功时为自有子模块创建/更新标签?

实现构建成功后为子模块更新标签的方案

要在构建成功后为子模块k.edu创建或更新标签(追踪最后可成功构建的版本),可以在现有Workflow的构建步骤后添加标签操作流程,具体配置如下:

修改后的完整Workflow

name: CI
on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]
  workflow_dispatch:

jobs:
  build:
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [macos-latest]
    steps:
      - uses: actions/checkout@v4
        with:
          submodules: 'true'
          fetch-depth: 0  # 确保获取完整的提交历史,包括子模块
          token: ${{ secrets.GITHUB_TOKEN }}  # 若子模块为私有仓库,需替换为有推送权限的PAT

      - name: clang on ${{ matrix.os }}
        run: clang -v

      - name: build on ${{ matrix.os }}
        run: cd k.edu && make

      # 新增:构建成功后更新子模块标签
      - name: Configure Git user
        if: success() && (github.event_name == 'push' || github.event_name == 'workflow_dispatch')
        run: |
          git config --global user.name "GitHub Actions"
          git config --global user.email "actions@github.com"

      - name: Update submodule's successful build tag
        if: success() && (github.event_name == 'push' || github.event_name == 'workflow_dispatch')
        working-directory: ./k.edu
        run: |
          # 获取当前子模块的提交哈希
          SUBMODULE_COMMIT=$(git rev-parse HEAD)
          # 定义标签名
          TAG_NAME="last-successful-build"
          
          # 删除本地已存在的同名标签(如果有)
          git tag -d $TAG_NAME || true
          # 删除远程已存在的同名标签(如果有)
          git push origin :refs/tags/$TAG_NAME || true
          
          # 创建新标签并推送到远程
          git tag $TAG_NAME $SUBMODULE_COMMIT
          git push origin $TAG_NAME

关键步骤说明

  • fetch-depth: 0:拉取完整的Git提交历史,避免子模块操作时出现历史缺失问题。
  • 条件判断if: success() && (github.event_name == 'push' || github.event_name == 'workflow_dispatch'):仅在构建成功,且是推送main分支或手动触发Workflow时执行标签更新,避免PR构建时误触发标签变更。
  • Git用户配置:为GitHub Actions设置提交身份,确保能正常推送标签到远程仓库。
  • 标签更新逻辑:先删除本地和远程的旧标签,再基于当前子模块的最新提交创建新标签并推送,保证标签始终指向最后一次成功构建的版本。

权限说明

如果子模块k.edu是私有仓库,默认的GITHUB_TOKEN仅对当前仓库有访问权限,需要在仓库的Settings -> Secrets and variables -> Actions中添加一个具有子模块仓库推送权限的个人访问令牌(PAT),并将Workflow中的token: ${{ secrets.GITHUB_TOKEN }}替换为token: ${{ secrets.YOUR_PAT_NAME }}。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 07:02:39