将小 bash 脚本添加到 cloudbuild.yaml

Posted

技术标签:

【中文标题】将小 bash 脚本添加到 cloudbuild.yaml【英文标题】:add small bash script to cloudbuild.yaml 【发布时间】:2021-08-05 00:10:38 【问题描述】:

我有一个用于谷歌云 (GCP) 的 cloudbuild.yaml 文件。我想使用简单的 bash 脚本$(node -p -e "require('./package.json').version")(或任何其他方式)从package.json 中获取version。如何将此添加到我的 cloudbuild.yaml 文件中?

我尝试将脚本放入substitution,但没有成功。

# gcloud submit   --substitutions=_VERSION="1.1.0"

steps:
  # build the container image
  - name: "gcr.io/cloud-builders/docker"
    args: ["build", "-t", "gcr.io/$_PROJECT_ID/$_IMAGE:$_VERSION", "."]
  # push the container image to Container Registry
  - name: "gcr.io/cloud-builders/docker"
    args: ["push", "gcr.io/$_PROJECT_ID/$_IMAGE:$_VERSION"]
  # build the container image
  - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
    entrypoint: gcloud
    args:
      [
        "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: $(node -p -e "require('./package.json').version")
  _ENV_VARS: "APP_ENV=dev"

【问题讨论】:

【参考方案1】:

这是 Cloud Build 的缺点之一。您不能将变量从一个步骤传递到另一个步骤。步骤之间仅保留/workspace。并且替换变量只是静态的(在管道运行时预定义或设置)。

这里的解决方案并不那么容易。

您需要添加一个步骤来获取版本并将其写入文件中
- name: 'node'
  entrypoint: bash
  args:
    - -c
    - node -p -e "require('./package.json').version" > /workspace/node_version
然后在你的步骤中使用它,就像这样
- name: "gcr.io/cloud-builders/docker"
  entrypoint: bash
  args: 
    - -c
    - |
       VERSION=$$cat /workspace/node_version
       docker build -t gcr.io/$_PROJECT_ID/$_IMAGE:$$VERSION .

双美元 $$ 表示这是一个 linux 命令而不是 Cloud Build 变量

【讨论】:

很遗憾VERSION 空了。我觉得您的回答是正确的,但 VERSION 值不起作用 即使我手动将文件制作为cat,这种在本地机器上获取版本的方法也不起作用:bash: $cat ./package_version: bad substitution invalid argument "gcr.io/my-project/my-client:" for "-t, --tag" flag: invalid reference format 我无法让变量设置起作用,所以我改用了$$(cat ./package_version) 我不是节点专家,我的命令是根据您的要求。但是,如果您通过我的投入找到了正确的解决方案,那就太好了!!! 是的,感谢您的意见 :) 但是,这不是特定于节点的问题,我无法使 VERSION 定义起作用(第二步不涉及节点) 【参考方案2】:

根据 Guillaume 的回答,您可以使用带有两个 $$ 而不是 1 个 $ 的 bash 脚本,例如 $$(node -p -e "require('./package.json').version")但是,如果您尝试使用的命令不可用(node 将不可用),最好从您可以在上述步骤中创建的文件中提取它,例如纪尧姆的回答:

- name: "gcr.io/cloud-builders/docker"
    entrypoint: bash
    args: 
      - -c
      - docker build -t gcr.io/$_PROJECT_ID/$_IMAGE:$$(cat ./package_version) .

【讨论】:

以上是关于将小 bash 脚本添加到 cloudbuild.yaml的主要内容,如果未能解决你的问题,请参考以下文章

Google Apps 脚本和 Cloudbuild CI 登录

将 bash 脚本添加到路径

使用 Bash 脚本添加到 Crontab(如果不存在)

bash 脚本从 bash 脚本添加 git 凭据

如何通过 bash 脚本将 ssh 密钥添加到主机

如何在没有注销/登录的情况下将用户添加到组 - Bash 脚本