You need to enable JavaScript to run this app. 如何在GCP的cloudbuild.yaml中添加脚本读取package.json的version值
优惠活动
大模型
产品
解决方案
定价
更多

如何在GCP的cloudbuild.yaml中添加脚本读取package.json的version值

Cloud Build 读取package.json版本号的正确配置方法

你之前的写法不生效是因为Cloud Build的substitutions字段仅支持静态预定义变量,不会执行内嵌的Bash命令,你写的$(node -p -e "require('./package.json').version")会被直接当成普通字符串处理,不会被解析执行。


正确实现逻辑

  1. 新增一个前置步骤,使用Node镜像读取package.json的version字段,将值写入共享目录/workspace下的临时文件,供后续所有步骤读取
  2. 所有用到版本号的步骤都先加载临时文件中的版本变量,使用$$转义避免Cloud Build提前解析变量
  3. 支持手动提交时通过--substitutions=_VERSION=xxx覆盖版本号,兼容原有使用习惯

修改后的完整cloudbuild.yaml配置

# 手动提交时可执行以下命令指定版本,不指定则自动读取package.json的version
# gcloud builds submit --substitutions=_VERSION="1.1.0"

steps:
  # 第一步:读取package.json版本号,写入共享临时文件
  - name: node:18-alpine
    entrypoint: sh
    args:
      - -c
      - |
        # 优先使用手动传入的_VERSION,没传则读package.json
        if [ -z "${_VERSION}" ]; then
          VERSION=$(node -p -e "require('./package.json').version")
        else
          VERSION=${_VERSION}
        fi
        echo "export VERSION=$VERSION" > /workspace/version.sh

  # 构建容器镜像
  - name: "gcr.io/cloud-builders/docker"
    entrypoint: sh
    args:
      - -c
      - |
        source /workspace/version.sh
        docker build -t gcr.io/${_PROJECT_ID}/${_IMAGE}:$$VERSION .

  # 推送容器镜像到Container Registry
  - name: "gcr.io/cloud-builders/docker"
    entrypoint: sh
    args:
      - -c
      - |
        source /workspace/version.sh
        docker push gcr.io/${_PROJECT_ID}/${_IMAGE}:$$VERSION

  # 部署到Cloud Run
  - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
    entrypoint: sh
    args:
      - -c
      - |
        source /workspace/version.sh
        gcloud run deploy "${_SERVICE_NAME}" \
          --project "${_PROJECT_ID}" \
          --image "gcr.io/${_PROJECT_ID}/${_IMAGE}:$$VERSION" \
          --platform managed \
          --allow-unauthenticated \
          --region "${_REGION}" \
          --set-env-vars "${_ENV_VARS}" \
          --ingress internal-and-cloud-load-balancing \
          --quiet

images:
  - gcr.io/${_PROJECT_ID}/${_IMAGE}

substitutions:
  _REGION: us-east1
  _PROJECT_ID: my-dev
  _SERVICE_NAME: my-client
  _IMAGE: my-client
  _VERSION: "" # 留空默认读package.json,手动提交时可覆盖
  _ENV_VARS: "APP_ENV=dev"

注意事项

  • /workspace是Cloud Build所有步骤共享的存储目录,写入该目录的文件在整个构建流程中都可以被后续步骤读取
  • 引用Shell层面的变量需要加两个美元符号$$VERSION,避免被Cloud Build提前解析为预定义的替换变量
  • Node镜像版本可以根据你的项目兼容的Node版本调整,比如改成node:16-alpine等

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 20:45:03