如何在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
相关产品推荐
相关产品推荐

