Google Cloud 构建条件步骤

Har*_*var 10 google-cloud-platform google-kubernetes-engine google-cloud-build

这是我的云构建文件

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']
Run Code Online (Sandbox Code Playgroud)

我想实施条件步骤。我的声纳步骤在哪里。

如果分支是生产,我必须跳过声纳步骤,如果有其他分支,则必须运行步骤。

我想Cloudbuild.yaml在所有分支机构中管理相同的内容。

当我合并分支时development > staging > production

那么云构建是否有可能实现条件步骤?

gui*_*ere 20

您有 2 个解决方案

  1. 制作 2 个触发器,每个触发器都有自己的配置。1 个在 Prod 上,1 个在 UAT/DEV 上。
  2. 您可以编写执行脚本。它很脏,但你只保留了 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'
Run Code Online (Sandbox Code Playgroud)


Neb*_*tic 10

(尚)不可能在云构建中创建条件步骤,例如使用 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
Run Code Online (Sandbox Code Playgroud)

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

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