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

如何在GitLab CI/CD中从文件内容设置Release的tag_name?

GitLab CI/CD 从VERSION.txt读取版本号设置Release标签的可行方案

问题背景

现有GitLab CI的Release配置如下:

release:
  stage: Release  
  script:
    - echo "Release running"
  release:
    tag_name: $VERSION
    name: 'Release $VERSION'
    description: 'Release created using the Gitlab release-cli.'

尝试从VERSION.txt(内容为1.56.0)中读取语义化版本号作为tag_name,但以下方法均无效:

  • 变量块中执行shell命令不生效:
    variables:
      VERSION: $(cat VERSION.txt)
    
  • 脚本中导出的变量无法被release块读取:
    script: 
     - export VERSION="$(cat VERSION.txt)"
     - echo $VERSION # 输出1.56.0 
    
    release:
     tag_name: '${VERSION}' # $VERSION为空
    
    before_script: 
     - export VERSION="$(cat VERSION.txt)"
     - echo $VERSION # 输出1.56.0
    
    release:
     tag_name: '${VERSION}' # $VERSION为空
    
  • 直接在tag_name中写命令会被当作字面量:
    release:
      tag_name: '${cat VERSION.txt}' # 标签内容就是字面量'${cat VERSION.txt}'
    

可行解决方案

方案一:使用release-cli命令行创建Release(推荐)

GitLab的release块是在Job启动前解析的,无法读取Job执行时生成的变量。改用release-cli命令在脚本中动态创建Release,完全避开这个限制:

release:
  stage: Release  
  image: registry.gitlab.com/gitlab-org/release-cli:latest
  script:
    - VERSION=$(cat VERSION.txt)
    - echo "Creating release for version $VERSION"
    - |
      release-cli create \
        --tag-name "$VERSION" \
        --name "Release $VERSION" \
        --description "Release created using the Gitlab release-cli."

说明:使用官方的release-cli镜像,在脚本中读取版本号后直接调用命令创建Release,所有参数都是动态生成的,完全适配需求。

方案二:通过dotenv报告流水线级变量

将版本号作为流水线级变量传递,让release块可以读取到:

# 前置Job:读取版本号并报告为流水线变量
get-version:
  stage: .pre
  script:
    - echo "VERSION=$(cat VERSION.txt)" > version.env
  artifacts:
    reports:
      dotenv: version.env

# 正式Release Job
release:
  stage: Release  
  needs: [get-version]
  script:
    - echo "Release running for version $VERSION"
  release:
    tag_name: $VERSION
    name: 'Release $VERSION'
    description: 'Release created using the Gitlab release-cli.'

说明:

  1. .pre阶段的get-version Job会在所有阶段前执行,将版本号写入version.env并通过dotenv报告给流水线。
  2. release Job通过needs依赖前置Job,此时VERSION会成为流水线级变量,release块可以正常读取。

无效方法的原因说明

  • 变量块不支持shell命令:GitLab CI的variables块仅支持静态值或预定义变量,无法直接执行$(cat)这类shell命令。
  • 脚本变量无法传递到release块:Job的脚本是在Runner的Shell环境中执行的,而release块由GitLab在Job启动前解析,两者不在同一个上下文,因此无法读取Shell中导出的变量。
  • tag_name不会解析shell命令:GitLab仅会对tag_name中的预定义变量或流水线变量做替换,不会执行其中的shell命令,因此直接写${cat VERSION.txt}会被当作字面量。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 07:05:17