Pipeline#
CloudIaC 支持 Pipeline,将环境的 Plan、部署、销毁任务拆分为多个步骤,默认的我们为所有任务类型定义了标准步骤流程,用户可以自定义 pipeline,来增加步骤、调整步骤执行顺序等。
同时在前端,任务也是分步骤展示:
如何使用 Pipeline#
自定义 Pipeline 通过在云模板代码库中增加 pipeline 文件实现,文件名为 .cloudiac-pipeline.yml
。
文件查找逻辑如下:
- 如果云模板设置了工作目录,则在工作目录下查找
.cloudiac-pipeline.yml
,存在则使用 - 如果工作目录不存在则在代码库根目录下查找
.cloudiac-pipeline.yml
,存在则使用 - 否则使用默认的 pipeline 标准流程模板
Pipeline 标准流程模板#
Pipeline 使用 yaml 格式定义,标准的流程模板如下:
version: 0.3 # pipeline 格式版本号,为了保证多版本的兼容性
# plan 任务
plan:
steps: # 任务的步骤
- type: checkout # 步骤类型
name: Checkout Code # 步骤的展示名称,未提供名称则展示为步骤类型
- type: terraformInit
name: Terraform Init
- type: opaScan
name: OPA Scan
- type: terraformPlan
name: Terraform Plan
apply:
steps:
- type: checkout
name: Checkout Code
- type: terraformInit
name: Terraform Init
- type: opaScan
name: OPA Scan
- type: terraformPlan
name: Terraform Plan
- type: terraformApply
name: Terraform Apply
- type: ansiblePlay
name: Run playbook
destroy:
steps:
- type: checkout
name: Checkout Code
- type: terraformInit
name: Terraform Init
- type: terraformPlan
name: Terraform Plan
args:
- "-destroy"
- type: terraformDestroy
name: Terraform Destroy
Pipeline 的任务类型和步骤#
从标准 pipeline 模板中可以看到,CloudIaC 支持对 plan、apply、destroy 三种任务进行自定义,分别对应环境的 Plan、部署任务、销毁任务。
自定义 pipeline 时可以只对指定的任务类型做定义,未定义的任务类型会使用标准 pipeline 流程步骤。
每一个任务类型都可以定义各自的步骤列表,CloudIaC 支持的步骤列表如下:
步骤类型 | 说明 |
---|---|
checkout | 代码检出 |
terraformInit | terraform init |
terraformPlan | terraform plan |
terraformApply | terraform apply |
terraformDestroy | terraform destroy |
ansiblePlay | ansible-playbook |
opaScan | OPA 策略扫描 |
regoParse | 解析资源属性为 rego input |
command | 执行自定义命令 |
同时步骤还支持 args 参数,terraform 和 ansible 相关步骤类型的 args 会以命令行参数的形式传递给执行的命令,如 terraformPlan 步骤传入 "-destroy" 参数用于生成 terraform destroy,command 步骤的 args 参数表示需要执行的 shell 命令。
Command 步骤类型#
command 步骤允许您执行任意 shell 命令,基于 command 命令您可以实现功能强大的自定义流程。
一些 command 命令使用场景示例:
apply:
steps:
- name: Instal amazon.aws
type: command
args:
- yum install -y python2-pip
- pip install botocore==1.21.41 boto3==1.18.41
- ansible-galaxy collection install amazon.aws
- name: Download alicloud provider
type: command
args:
- "curl -Ls https://github.com/aliyun/terraform-provider-alicloud/releases/download/v1.126.0/terraform-provider-alicloud_1.126.0_linux_amd64.zip >/usr/share/terraform/plugins/registry.terraform.io/aliyun/alicloud/terraform-provider-alicloud_1.126.0_linux_amd64.zip"
- name: Trigger workflow
type: command
args:
- "curl -d token=${WORKFLOW_TOKEN} https://workflow.example.com/step/${WORKFLOW_STEPID}/start"
- 为避免与 yaml 格式特殊字符冲突,args 参数建议使用双引号包含
- CloudIaC 的任务步骤都是在容器中执行,不会影响宿主系统
Pipeline 回调#
除了给任务定义步骤之后 CloudIaC 还支持定义回调步骤,回调步骤基于任务的运行状态选择性执行。目前支持的回调类型有 onSuccces
和 onFail
,onSuccess 步骤在任务所有步骤执行成功时回调,onFail 步骤在任务任意步骤执行失败时回调。
回调使用示例:
apply:
onSuccess:
name: 任务成功
type: command
args:
- echo "Task successful"
- test "$CLOUDIAC_ENV_STATUS" = "inactive" && echo "Environment created"
- test "$CLOUDIAC_ENV_STATUS" = "failed" && echo "Environment recovered"
onFail:
name: 任务失败
type: command
args:
- echo "Task failed"
steps: [] # 流程步骤省略
在 command 步骤中可以引用环境变量的值,通过判断变量值来执行不同的操作。如示例中基于环境在任务启动时的状态来判断是创建环境还是恢复失败状态的环境。
CLOUDIAC_ENV_STATUS 为任务启动时平台自动导出的环境变量,完整的导出环境变量列表见文档: 变量
回调步骤总是在流程的最后展示,流程步骤展示效果:
完整的自定义 Pipeline 示例#
一个完整的自定义 pipeline 示例:
---
version: 0.3
plan:
steps:
- type: checkout
name: "Checkout code"
- type: terraformInit
name: "Terraform Init"
- type: opaScan
name: OPA Scan
- type: terraformPlan
name: "Terraform Plan"
apply:
onFail:
type: command
args:
- echo "Job failed"
onSuccess:
type: command
args:
- echo "Job successful"
steps:
- type: command
args:
- "echo \"get somethings\""
- "bash script.sh"
- "curl 127.0.0.1/api/action"
- type: checkout
name: "Checkout code"
- type: terraformInit
name: "Terraform Init"
- type: opaScan
name: OPA Scan
- type: terraformPlan
name: "Terraform Plan"
- type: terraformApply
name: "Terraform Apply"
- type: ansiblePlay
name: "Run playbook"
destroy:
steps:
- type: checkout
name: "Checkout code"
- type: terraformInit
name: "Terraform Init"
- type: terraformPlan
name: "Terraform Plan"
args:
- "-destroy"
- type: terraformDestroy
name: "Terraform Destroy"
- type: command
name: "Say Bye"
args:
- echo "Bye!"