如何在GCP的cloudbuild.yaml中添加脚本读取package.json的version值
Cloud Build 读取package.json版本号的正确配置方法
你之前的写法不生效是因为Cloud Build的
substitutions字段仅支持静态预定义变量,不会执行内嵌的Bash命令,你写的$(node -p -e "require('./package.json').version")会被直接当成普通字符串处理,不会被解析执行。
正确实现逻辑
- 新增一个前置步骤,使用Node镜像读取package.json的version字段,将值写入共享目录
/workspace下的临时文件,供后续所有步骤读取 - 所有用到版本号的步骤都先加载临时文件中的版本变量,使用
$$转义避免Cloud Build提前解析变量 - 支持手动提交时通过
--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
相关产品推荐
相关产品推荐

