我定义了以下简单管道:
13
当我运行它时,一切都会成功完成-但是from itertools import chain
my_list = [1, 2, 3, 4, 5, 6, 7, 8]
print(list(chain(*zip(my_list[:len(my_list)//2], my_list[len(my_list)//2:]))) + ([] if len(my_list) % 2 == 0 else [my_list[-1]]))
阶段实际上并没有破坏我在image:
name: hashicorp/terraform:light
entrypoint:
- '/usr/bin/env'
- 'PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'
variables:
PLAN: dbrest.tfplan
STATE: dbrest.tfstate
cache:
paths:
- .terraform
before_script:
- terraform --version
- terraform init
stages:
- validate
- build
- deploy
- destroy
validate:
stage: validate
script:
- terraform validate
plan:
stage: build
script:
- terraform plan -state=$STATE -out=$PLAN
artifacts:
name: plan
paths:
- $PLAN
- $STATE
apply:
stage: deploy
environment:
name: production
script:
- terraform apply -state=$STATE -input=false $PLAN
- terraform state show aws_instance.bastion
dependencies:
- plan
when: manual
only:
- master
destroy:
stage: destroy
environment:
name: production
script:
- terraform destroy -state=$STATE -auto-approve
dependencies:
- apply
when: manual
only:
- master
阶段创建的环境。这是我看到的:
destroy
很明显,我打电话给apply
的方式中有一些遗漏,但是我不知道是什么,请问有人可以对此加以说明吗?
答案 0 :(得分:3)
您没有正确传递apply
作业的状态,因为您没有像在plan
-> apply
中那样设置工件。您的apply
工作应如下所示:
apply:
stage: deploy
environment:
name: production
script:
- terraform apply -state=$STATE -input=false $PLAN
- terraform state show aws_instance.bastion
artifacts:
name: apply
paths:
- $STATE
dependencies:
- plan
when: manual
only:
- master
但是,更好的解决方案是不要在此处使用基于文件的状态,而应使用正确的remote state(例如,如果使用AWS,则使用S3),否则您将有很多麻烦多个用户(包括CI作为潜在的自发并发用户)运行Terraform时出现的问题。这样一来,您可以利用state locking的优势,并且还可以对状态文件进行版本控制,以防在Terraform操作过程中发生错误时(例如在重构时移动状态)。