【问题标题】:Multiple commands in the same build step in Google Cloud BuilderGoogle Cloud Builder 中同一构建步骤中的多个命令
【发布时间】:2019-09-15 16:52:41
【问题描述】:

我想在 Google Cloud Builder 环境中运行我们的自动化后端测试套件。但是,很自然地,我遇到了需要在 Cloud Builder 中安装各种依赖项和先决条件,以便我们的最终测试运行程序 (php tests/run) 可以运行。

这是我当前的 cloudbuild.yaml:

steps:

  - name: 'ubuntu'
    args: ['bash', './scripts/install-prerequisites.sh', '&&', 'composer install -n -q --prefer-dist', '&&', 'php init --overwrite=y', '&&', 'php tests/run']

目前,多个命令的链接不起作用。唯一执行的是bash ./scripts/install-prerequisites.sh 部分。如何让所有这些命令按顺序执行?

【问题讨论】:

    标签: google-cloud-build


    【解决方案1】:

    一种更易读的运行脚本的方法是使用突破语法(来源:mastering cloud build syntax

    steps:
    - name: 'ubuntu'
      entrypoint: 'bash'
      args:
      - '-c'
      - |
        ./scripts/install-prerequisites.sh \
        && composer install -n -q --prefer-dist \
        && php init --overwrite=y \
        && php tests/run
    
    

    但是,这仅在您的构建步骤映像安装了适当的 deps(php、composer)时才有效。

    【讨论】:

    • 如果您在此之后还有更多步骤,这不起作用?
    • 你能提供一个你正在尝试做什么的例子吗?每个构建步骤都会拉取原始容器。如果您想重复使用此示例中的 ubuntu 容器,并在多个步骤中安装了 prereq,我建议您构建并推送该自定义映像并引用它。
    【解决方案2】:

    我认为目前您有 2 个选项可以实现这一目标:

    1. 创建一个包含您想要的命令序列的脚本并直接调用该脚本:
    # cloudbuild.yaml
    steps:
      - name: 'ubuntu'
        args: ['./my-awesome-script.sh']
    
    # my-awesome-script.sh
    /usr/bin/env/bash
    
    set -eo pipefail
    
    ./scripts/install-prerequisites.sh
    composer install -n -q --prefer-dist
    php init --overwrite=y
    php tests/run
    
    1. 致电bash -c 使用您想要执行的所有命令:
    steps:
      - name: 'ubuntu'
        args: ['bash', '-c', './scripts/install-prerequisites.sh && composer install -n -q --prefer-dist && php init --overwrite=y && php tests/run']
    

    【讨论】:

    • 这里的问题作者:对于任何未来的读者来说,这个困难正是让我切换到 Github Actions 的原因。自己也试试。稍后谢谢我。
    • 选项 #1 需要 bash,例如args: ['bash', './scripts/install-prerequisites.sh'] 有效。见cloud.google.com/cloud-build/docs/create-custom-build-steps
    【解决方案3】:

    见:

    默认情况下,构建步骤按顺序运行,但您可以将它们配置为同时运行。

    步骤字段中构建步骤的顺序与执行步骤的顺序有关。步骤将根据其 waitFor 字段中定义的依赖关系串行或并行运行。

    一个步骤依赖于其 waitFor 中的每个 id,并且在每个依赖成功完成之前不会启动。

    因此,您只需将命令作为每个步骤分开。

    像这样。

    steps:
      - name: 'ubuntu'
        args: ['bash', './scripts/install-prerequisites.sh']
        id: 'bash ./scripts/install-prerequisites.sh'
      - name: 'ubuntu'
        args: ['composer', 'install', '-n', '-q', '--prefer-dist']
        id: 'composer install -n -q --prefer-dist'
      - name: 'ubuntu'
        args: ['php', 'init', '--overwrite=y']
        id: 'php init --overwrite=y'
      - name: 'ubuntu'
        args: ['php', 'tests/run']
        id: 'php tests/run'
    

    顺便问一下,使用ubuntu镜像可以运行php和composer命令吗?

    我认为你应该使用或构建可以运行php和composer命令的docker镜像。

    composer docker 镜像是here

    steps:
    - name: 'gcr.io/$PROJECT_ID/composer'
      args: ['install']
    
    
    

    【讨论】:

    • 将命令作为单独的构建步骤运行不是一种选择,因为它们中的每一个都在“干净”的 ubuntu 环境中运行。它们不会继承彼此已安装的软件堆栈。
    • 他们怎么能建议这个呢? cloud.google.com/cloud-build/docs/building/… 哪里构建取决于安装? @Dzhuneyt
    • Cloud Build 将源文件夹挂载到 docker,npm install 将文件添加到挂载的文件夹,而不是 docker 镜像。接下来 docker run 也挂载了源文件夹,npm 可以在源文件夹中找到已安装的文件。
    猜你喜欢
    • 2020-02-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 2017-10-21
    • 2013-01-23
    相关资源
    最近更新 更多