Google Cloud 构建条件步骤

Posted

技术标签:

【中文标题】Google Cloud 构建条件步骤【英文标题】:Google Cloud build conditional step 【发布时间】:2020-02-02 18:22:07 【问题描述】:

我有以下cloudbuild.yaml 文件:

substitutions:
    _CLOUDSDK_COMPUTE_ZONE: us-central1-a 
    _CLOUDSDK_CONTAINER_CLUSTER: $_CLOUDSDK_CONTAINER_CLUSTER
steps:
- name: gcr.io/$PROJECT_ID/sonar-scanner:latest
  args:
    - '-Dsonar.host.url=https://sonar.test.io'
    - '-Dsonar.login=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
    - '-Dsonar.projectKey=test-service'
    - '-Dsonar.sources=.'
- id: 'build test-service image'
  name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'gcr.io/$PROJECT_ID/$REPO_NAME/$BRANCH_NAME:$SHORT_SHA', '.']
- id: 'push test-service image'
  name: 'gcr.io/cloud-builders/docker'
  args: ['push', 'gcr.io/$PROJECT_ID/$REPO_NAME/$BRANCH_NAME:$SHORT_SHA']
- id: 'set test-service image in yamls'
  name: 'ubuntu'
  args: ['bash','-c','sed -i "s,TEST_SERVICE,gcr.io/$PROJECT_ID/$REPO_NAME/$BRANCH_NAME:$SHORT_SHA," k8s/*.yaml']
- id: kubectl-apply
  name: 'gcr.io/cloud-builders/kubectl'
  args: ['apply', '-f', 'k8s/']
  env:
  - 'CLOUDSDK_COMPUTE_ZONE=$_CLOUDSDK_COMPUTE_ZONE'
  - 'CLOUDSDK_CONTAINER_CLUSTER=$_CLOUDSDK_CONTAINER_CLUSTER'
images: ['gcr.io/$PROJECT_ID/$REPO_NAME/$BRANCH_NAME:$SHORT_SHA']

我想让sonar-scanner 步骤有条件(如果我们在生产分支上,我想跳过声纳步骤;其他分支应该运行该步骤)。我还想在所有分支中使用相同的cloudbuild.yaml

可以这样做吗?

【问题讨论】:

【参考方案1】:

您有 2 个解决方案

    制作 2 个触发器,每个触发器都有自己的配置。 Prod 1 个,UAT/DEV 1 个。 您可以编写执行脚本。它很脏,但您只保留 1 个 CI/CD 配置文件
steps:
- name: gcr.io/$PROJECT_ID/sonar-scanner:latest
  entrypoint: 'bash'
  args:
    - '-c'
    - 'if [ $BRANCH_NAME != 'prod' ]; then sonar-scanner -Dsonar.host.url=https://sonar.test.io -Dsonar.login=XXXX -Dsonar.projectKey=test-service -Dsonar.sources=. ; fi'

【讨论】:

感谢您编写 anwser。你能否描述更多关于这个<exec in your container, mvn?>的信息。没明白。我必须改变那里的价值或保持原样。 当然,您已经构建了一个自定义的“云构建器”。在这个容器的最后,最后一行,你写ENTRYPOINT 。这是相同的 放在那里。我猜是sonar-scanner(在 sonarQube 文档中) 感谢您的回信,我知道了,我会再次尝试感谢。 ***.com/questions/58502210/… 你能看看这个吗:***.com/questions/58502210/…【参考方案2】:

(还)不可能在云构建中创建条件步骤,例如 gitlab-ci 可能。我们所做的是在 GCP 中创建多个项目。您可以创建一个用于开发、登台和生产的项目。它们都来自同一个 git 存储库,以保持环境彼此相同。这意味着它们具有相同的 cloudbuild.yaml 文件。

如果您需要仅在开发环境中运行特定脚本,例如端到端测试,您可以在构建步骤本身中指定 $BRANCH_NAME 或 $PROJECT_ID 的条件。但是,过多地使用这些条件会损害可维护性,并且您的环境不会是彼此的精确镜像。不过,这里有一个简单的例子:

---
timeout: 300s
steps:
  # Branch name conditional
  - name: gcr.io/google.com/cloudsdktool/cloud-sdk
    entrypoint: bash
    args:
      - -c
      - |
        if [[ "$BRANCH_NAME" == "develop" ]]
        then
          echo "Development stuff only"
        elif [[ "$BRANCH_NAME" == "release" ]]
        then
          echo "Acceptance stuff only"
        elif [[ "$BRANCH_NAME" == "main" ]]
        then
          echo "Production stuff only"
        fi

除了为每个环境构建不同的项目外,我还建议为每个域或应用程序构建一个项目。这意味着您可以在项目中存储的数据之间进行逻辑分离。然后,您可以将所有开发项目分组到名为 development 等的文件夹下。这些文件夹是组织的一部分,甚至是另一个文件夹。

这种逻辑分组是使用 GCP 的真正好处之一,我觉得它非常方便。 Azure 与资源组和订阅的结构有些相似。 AWS 也有资源组结构。

【讨论】:

感谢您抽出时间写下答案。相同的工作是否有不同的项目,在相应的分支上有云构建触发器。

以上是关于Google Cloud 构建条件步骤的主要内容,如果未能解决你的问题,请参考以下文章

在 Google Cloud 构建中的两个容器之间进行通信

构建Spring Cloud微服务分布式云架构详细步骤

在 Cloud Build 步骤中执行 BigQuery 查询

如何在我的本地 linux 服务器上运行 google-cloud-datalab?

带有 python 入口点的 Google Cloud Build gsutil

有没有办法让 cloudbuild 步骤访问 GCP 中的 Cloud SQL