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 个解决方案
- 创建 2 个触发器,每个触发器都有自己的配置。生产 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'
(尚)不可能在云构建中创建条件步骤,例如 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也有资源组结构。
我有以下 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 个解决方案
- 创建 2 个触发器,每个触发器都有自己的配置。生产 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'
(尚)不可能在云构建中创建条件步骤,例如 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也有资源组结构。