【问题标题】:Google Cloud build conditional stepGoogle Cloud 构建条件步骤
【发布时间】: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

可以这样做吗?

【问题讨论】:

    标签: google-cloud-platform google-kubernetes-engine google-cloud-build


    【解决方案1】:

    您有 2 个解决方案

    1. 制作 2 个触发器,每个触发器都有自己的配置。 Prod 1 个,UAT/DEV 1 个。
    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'
    

    【讨论】:

    • 感谢您编写 anwser。你能否描述更多关于这个<exec in your container, mvn?>的信息。没明白。我必须改变那里的价值或保持原样。
    • 当然,您已经构建了一个自定义的“云构建器”。在这个容器的最后,最后一行,你写ENTRYPOINT 。这是相同的 放在那里。我猜是sonar-scanner(在 sonarQube 文档中)
    • 感谢您的回信,我知道了,我会再次尝试感谢。
    【解决方案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 也有资源组结构。

    【讨论】:

    • 感谢您抽出时间写下答案。相同的工作是否有不同的项目,在相应的分支上有云构建触发器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    • 2019-09-15
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    • 1970-01-01
    相关资源
    最近更新 更多