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 文档中)(还)不可能在云构建中创建条件步骤,例如 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 构建条件步骤的主要内容,如果未能解决你的问题,请参考以下文章
在 Cloud Build 步骤中执行 BigQuery 查询
如何在我的本地 linux 服务器上运行 google-cloud-datalab?