Google cloud platform 谷歌云构建-构建失败时Terraform自毁
我目前面临一个问题,我的谷歌云构建CI/CDGoogle cloud platform 谷歌云构建-构建失败时Terraform自毁,google-cloud-platform,terraform,google-cloud-build,terraform-provider-gcp,Google Cloud Platform,Terraform,Google Cloud Build,Terraform Provider Gcp,我目前面临一个问题,我的谷歌云构建CI/CD 首先,我构建了多个微服务的新docker映像,并使用Terraform为它们也将在生产中使用的容器创建GCP基础设施 然后,我执行一些集成/系统测试,如果一切正常,我会将新版本的microservice映像推送到容器注册表以供以后部署 我的问题是,如果云构建失败,地形基础设施不会被破坏 是否有一种方法可以始终执行云构建步骤,即使之前的一些步骤失败,在这里我希望始终执行“terraform destroy”? 或者特别是对于地形,有没有办法定义一个
- 首先,我构建了多个微服务的新docker映像,并使用Terraform为它们也将在生产中使用的容器创建GCP基础设施
- 然后,我执行一些集成/系统测试,如果一切正常,我会将新版本的microservice映像推送到容器注册表以供以后部署
Google Cloud Build还不支持中提到的
allow_failure
或类似机制
正如链接问题中提到的,您可以做的是链接shell条件运算符
如果要在出现故障时运行命令,可以执行以下操作:
-id:测试
名称:“python:3.7-slim”
目录:“…”
等待:[地形适用]
入口点:/bin/sh
args:
--c
-pip安装-r requirements.txt&&pytest--tfstate terraform.tfstate | | echo“此操作失败!”
这将正常运行您的测试,然后echo这将失败如果测试失败,则将代码>添加到日志中。如果您想在失败时运行terraform destroy-auto approve
,则需要将echo“This failed!”
替换为terraform destroy-auto approve
。当然,您还需要使用Docker映像中的Terraform二进制文件,因此需要使用一个自定义映像,该映像中同时包含Python和Terraform
-id:测试
名称:“示例客户python和terraform图像:3.7-slim-0.12.28”
目录:“…”
等待:[地形适用]
入口点:/bin/sh
args:
--c
-pip安装-r requirements.txt&&pytest--tfstate terraform.tfstate | | terraform destroy-自动批准;假“
上述作业还将在命令末尾运行false
,以便返回非0退出代码,并将作业标记为仍然失败,而不是仅在terraform destroy
失败时才失败
另一种方法是使用类似这样的东西,它将自动建立基础设施,运行必要的验证器,然后在最后销毁它—所有这些都只需一个厨房测试
命令
可能还值得一提的是,您的管道完全是串行的,因此您不需要使用waitFor
。这在:
构建步骤指定希望云构建执行的操作。
对于每个构建步骤,CloudBuild都会执行一个docker容器作为
docker run的实例
。构建步骤类似于
脚本并为您提供执行任意命令的灵活性
生成中的说明。如果可以将生成工具打包到
容器,云构建可以将其作为构建的一部分执行
默认情况下,Cloud Build在服务器上串行执行构建的所有步骤
相同的计算机。如果您有可以同时运行的步骤,请使用
选择权
使用生成步骤中的waitFor
字段指定必须运行的步骤
在运行生成步骤之前。如果没有为waitFor
提供值,
生成步骤将等待生成请求中所有先前的生成步骤完成
运行前成功完成。有关使用的说明,请参阅
waitFor
和id
,请参阅配置生成步骤顺序
你能编辑你的问题来分享你是如何配置你的Google云构建管道的吗?@ydaetskcoR我添加了一个云构建yaml的示例。非常感谢!我会看看Test Kitchen。我知道这是离题的,但是你知道是否有可能删除容器注册表的推送步骤并将本地docker映像传递给terraform?在b中este case,我只想在docker图像成功测试后将其推送到容器注册表。这是一个单独的问题,应该作为另一个问题提出来,以便人们能够关注这一点。下面的问题可以在这里找到:如果它解决了你的问题,你能接受答案吗?这将有助于社区我希望能更好地找到答案。
steps:
# build fresh ...
- id: build
name: 'gcr.io/cloud-builders/docker'
dir: '...'
args: ['build', '-t', 'gcr.io/$PROJECT_ID/staging/...:latest', '-t', 'gcr.io/$PROJECT_ID/staging/...:$BUILD_ID', '.', '--file', 'production.dockerfile']
# push
- id: push
name: 'gcr.io/cloud-builders/docker'
dir: '...'
args: ['push', 'gcr.io/$PROJECT_ID/staging/...']
waitFor: [build]
# setup terraform
- id: terraform-init
name: 'hashicorp/terraform:0.12.28'
dir: '...'
args: ['init']
waitFor: [push]
# deploy GCP resources
- id: terraform-apply
name: 'hashicorp/terraform:0.12.28'
dir: '...'
args: ['apply', '-auto-approve']
waitFor: [terraform-init]
# tests
- id: tests
name: 'python:3.7-slim'
dir: '...'
waitFor: [terraform-apply]
entrypoint: /bin/sh
args:
- -c
- 'pip install -r requirements.txt && pytest ... --tfstate terraform.tfstate'
# remove GCP resources
- id: terraform-destroy
name: 'hashicorp/terraform:0.12.28'
dir: '...'
args: ['destroy', '-auto-approve']
waitFor: [tests]