【问题标题】:google cloud build syntax谷歌云构建语法
【发布时间】:2020-12-25 10:22:45
【问题描述】:

我正在处理我的第一个 cloudbuild.yaml 文件并遇到此错误:

您的构建运行失败:解组构建配置 cloudbuild.yaml 失败:yaml:第 8 行:未找到预期的密钥

这是我文件的内容(cmets 省略),之后我有几个问题:

steps:
- name: 'node:12-alpine'
    entrypoint: 'bash'
    args:
        - 'build.sh'
- name: 'docker'
    args:
    - 'build'
    - '-t'
    - 'gcr.io/$PROJECT_ID/my-project:$(git describe --tags `git rev-list --tags --max-count=1`)'
images: ['gcr.io/$PROJECT_ID/my-project']

问题:

  • - name: 'node:12-alpine' 的行似乎是它爆炸的地方。但是,文档状态为"Cloud Build enables you to use any publicly available image to execute your tasks."node:12-alpine imgage 是公开的,那么我做错了什么?
  • 其次,我在第一步中尝试使用一堆 BASH 命令执行一个文件。如果我使用的 Alpine 映像都支持这些命令,那应该可以工作,对吧?
  • 最后,我正在尝试创建一个带有基于最新 git 标签版本的版本号的 docker 镜像。是否支持这样的语法,或者谷歌云构建通常如何处理版本控制(我在这个主题上没有看到任何东西)

【问题讨论】:

  • 如何触发构建?手动(gcloud 命令)或自动(使用 Cloud Build Trigger)
  • 认为您错过了@guillaumeblaquiere 的问题...构建正在触发,它只是无法正常工作,因为语法存在一些反复无常的问题。因此我的问题....
  • 不,第三点取决于您开始构建的方式!那么?
  • 当我推送到我的 github 存储库时,构建会自动触发。
  • 顺便提一下,使用手动提交进行调试要快得多

标签: docker google-cloud-build


【解决方案1】:

当您将容器运行到 Cloud Build 中时,会自动调用定义在容器中的入口点,并将 args 传入该入口点的参数。

你必须知道的

  • 您可以覆盖入口点,就像在 node:12 图像中所做的那样
  • 如果容器不包含入口点,则构建失败(您的错误,您使用的是通用 docker 映像)。你可以
    • 要么定义正确的入口点(此处为entrypoint: "docker"
    • 或者使用Cloud Builder,对于docker,这个- name: 'gcr.io/cloud-builders/docker'
  • 步骤的参数按原样转发,没有任何解释(变量替换,如 $MyVariable 除外)。您的命令解释 $(my command) 不会被评估。除了你这样做
- name: 'gcr.io/cloud-builders/docker' #you can also use the raw docker image here
  entrypoint: 'bash'
  args:
    - '-c'
    - |
      first bash command line
      second bash command line
      docker build -t gcr.io/$PROJECT_ID/my-project:$(git describe --tags `git rev-list --tags --max-count=1`)

但您可以让标签更智能。如果你看default environment variable of Cloud Build,你可以使用$TAG_NAME

docker build -t gcr.io/$PROJECT_ID/my-project:$TAG_NAME

请注意,只有在您从存储库中触发它时才会如此。如果您运行手动构建,它将不起作用。所以,有一个解决方法。看看这个

- name: 'gcr.io/cloud-builders/docker' 
  entrypoint: 'bash'
  args:
    - '-c'
    - |
      TAG=${TAG_NAME}
      if [ -z $${TAG} ]; then TAG=$(git describe --tags `git rev-list --tags --max-count=1`); fi      
      docker build -t gcr.io/$PROJECT_ID/my-project:$${TAG}

但是,我不建议您覆盖图像。你会丢失历史,如果你用错误的版本覆盖了一个好的图像,你就会丢失它!

如果你没有抓住某些部分,比如为什么双 $$ 等等,不要犹豫,评论

【讨论】:

  • 第一个问题实际上是一个 yaml 解析问题。但是,请欣赏有关后续问题的提示。如果您有兴趣分享更多 Google Cloud Build 忍者技能,我还遇到了一个未在此处提出的新问题并发送了Q&A style post
【解决方案2】:

这个错误很可能是由于您的cloudbuild.yaml 文件的缩进错误造成的。 你可以看看official documentation,它显示了这个文件的结构:

steps:
- name: string
  args: [string, string, ...]
  entrypoint: string
- name: string
  ...
- name: string
  ...
images:
- [string, string, ...]

【讨论】:

  • 不,不是那样的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-23
  • 2019-10-31
  • 2020-05-21
  • 1970-01-01
  • 2017-07-11
  • 1970-01-01
  • 2023-04-09
相关资源
最近更新 更多