Google 云构建条件步骤

Google Cloud build conditional step

我有以下 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

可以这样做吗?

您有 2 个解决方案

  1. 创建 2 个触发器,每个触发器都有自己的配置。生产 1 个,UAT/DEV.
  2. 1 个
  3. 您可以编写执行脚本。它很脏,但你只保留 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'

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

如果您只在开发环境中需要 运行 特定脚本,例如,端到端测试,您将在 $[ 上指定 cify 条件=20=] 或 $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 etc 的文件夹下。这些文件夹是组织的一部分,甚至是另一个文件夹。

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