合并请求中的 Terraform 集成
围绕基础架构即代码 (IaC) 更改进行协作,需要检查和批准代码更改和预期的基础架构更改。极狐GitLab 提供了一个解决方案来帮助围绕 Terraform 代码更改及其使用合并请求页面的预期效果进行协作。这样用户就不必构建自定义工具或依赖第三方解决方案来简化他们的 IaC 工作流程。
将 Terraform 计划信息输出到合并请求中
使用极狐GitLab Terraform 报告产物,您可以将 terraform plan
运行的详细信息直接公开到合并请求部件中,使您能够查看关于 Terraform 创建、修改或销毁的资源的统计信息。
配置 Terraform 报告产物
极狐GitLab 通过 CI/CD 模板和组件与 Terraform 以及 OpenTofu 集成,这些模板和组件使用由 GitLab 管理的 Terraform 状态,并在合并请求上显示 Terraform 所做的更改。
自动配置 Terraform 报告产物
您应该使用 Terraform CI/CD 模板 或 OpenTofu CI/CD 组件,这能够在 plan
作业中自动配置 Terraform 报告产物。
手动配置 Terraform 报告产物
对于快速设置,您应该自定义预内置的镜像并依赖 gitlab-terraform
和 gitlab-tofu
helpers。
要手动配置极狐GitLab Terraform 报告产物:
-
为了简化,让我们定义几个可重用的变量来允许我们多次引用这些文件:
variables: PLAN: plan.cache PLAN_JSON: plan.json
- 安装
jq
,一个轻量级和灵活的命令行 JSON 处理器。 -
为
jq
命令创建别名,以便从terraform plan
输出中提取我们想要的信息:before_script: - apk --no-cache add jq - alias convert_report="jq -r '([.resource_changes[]?.change.actions?]|flatten)|{\"create\":(map(select(.==\"create\"))|length),\"update\":(map(select(.==\"update\"))|length),\"delete\":(map(select(.==\"delete\"))|length)}'"
在使用 Bash 的发行版中(比如,Ubuntu),alias
语句在非交互模式下不会扩展。如果您的流水线报错convert_report: command not found
,您可以显式地通过添加shopt
命令来启用别名扩展:before_script: - shopt -s expand_aliases - alias convert_report="jq -r '([.resource_changes[]?.change.actions?]|flatten)|{\"create\":(map(select(.==\"create\"))|length),\"update\":(map(select(.==\"update\"))|length),\"delete\":(map(select(.==\"delete\"))|length)}'"
-
定义一个运行
terraform plan
和terraform show
的script
。这些命令将输出发送到管道,并将有用的部分转换为存储变量PLAN_JSON
。这个 JSON 用于创建一个极狐GitLab Terraform 报告产物。Terraform 报告获得一个 Terraformtfplan.json
文件。收集的 Terraform 计划报告上传到极狐GitLab 作为一个产物,并在合并请求中显示。plan: stage: build script: - terraform plan -out=$PLAN - terraform show --json $PLAN | convert_report > $PLAN_JSON artifacts: reports: terraform: $PLAN_JSON
-
运行的流水线会展示在合并请求的小部件中,像这样:
-
在小部件上选择 查看完整日志 按钮可以让你直接跳转到流水线日志中: