Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google cloud platform 谷歌云构建-构建失败时Terraform自毁_Google Cloud Platform_Terraform_Google Cloud Build_Terraform Provider Gcp - Fatal编程技术网

Google cloud platform 谷歌云构建-构建失败时Terraform自毁

Google 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”? 或者特别是对于地形,有没有办法定义一个

我目前面临一个问题,我的谷歌云构建CI/CD

  • 首先,我构建了多个微服务的新docker映像,并使用Terraform为它们也将在生产中使用的容器创建GCP基础设施
  • 然后,我执行一些集成/系统测试,如果一切正常,我会将新版本的microservice映像推送到容器注册表以供以后部署
我的问题是,如果云构建失败,地形基础设施不会被破坏

是否有一种方法可以始终执行云构建步骤,即使之前的一些步骤失败,在这里我希望始终执行“terraform destroy”? 或者特别是对于地形,有没有办法定义一个自我破坏的地形环境

只有一个docker容器的cloudbuild.yaml示例
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]