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

如何在GitLab Release的YML中获取package.json版本并兼容release-cli

解决GitLab CI同时获取package版本与运行release-cli的方案

方案1:基于Node镜像安装release-cli

直接用node:latest作为基础镜像,通过npm全局安装GitLab的release-cli,既能用Node读取package.json版本,又能调用release-cli工具。修改后的CI配置如下:

release-job:
  stage: release
  image: node:latest
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH 
  before_script:
    - npm install -g @gitlab-org/release-cli
  script:
    - echo "running release-job for $TAG"
    - VERSION=$(node -p "require('./package.json').version")
    - echo "Package version is $VERSION"
  release: 
    tag_name: 'v0.$CI_PIPELINE_IID'
    description: 'This is the new version: v0.$CI_PIPELINE_IID and package.json = $VERSION'
    ref: '$CI_COMMIT_SHA'
  tags:
    - SharedRunner

方案2:多阶段构建分离任务

把获取版本号和创建release拆成两个阶段:第一阶段用Node镜像读取版本并保存为文件,第二阶段用release-cli镜像读取文件里的版本号执行发布,每个阶段只加载必要工具,更轻量化。

# 第一阶段:提取package版本号
get-version:
  stage: prepare
  image: node:latest
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH 
  script:
    - echo "Extracting package version..."
    - node -p "require('./package.json').version" > version.txt
  artifacts:
    paths:
      - version.txt

# 第二阶段:执行release发布
release-job:
  stage: release
  image: registry.gitlab.com/gitlab-org/release-cli:latest
  needs: [get-version]
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH 
  script:
    - echo "running release-job for $TAG"
    - VERSION=$(cat version.txt)
    - echo "Package version is $VERSION"
  release: 
    tag_name: 'v0.$CI_PIPELINE_IID'
    description: 'This is the new version: v0.$CI_PIPELINE_IID and package.json = $VERSION'
    ref: '$CI_COMMIT_SHA'
  tags:
    - SharedRunner

方案3:在release-cli镜像中安装Node

如果偏好使用release-cli官方镜像,可以在脚本里安装Node环境。以alpine为基础的release-cli镜像为例,用apk安装nodejs:

release-job:
  stage: release
  image: registry.gitlab.com/gitlab-org/release-cli:latest
  rules:
    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH 
  before_script:
    - apk add --no-cache nodejs npm
  script:
    - echo "running release-job for $TAG"
    - VERSION=$(node -p "require('./package.json').version")
    - echo "Package version is $VERSION"
  release: 
    tag_name: 'v0.$CI_PIPELINE_IID'
    description: 'This is the new version: v0.$CI_PIPELINE_IID and package.json = $VERSION'
    ref: '$CI_COMMIT_SHA'
  tags:
    - SharedRunner

注意事项

  • 方案1和3会在同一个job中安装额外工具,可能增加运行时间;方案2分离任务更高效,适合复杂场景。
  • 如果package.json不在CI工作目录根路径,需要调整require('./package.json')中的路径。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 14:18:09