合并请求中的 Terraform 集成

围绕基础架构即代码 (IaC) 更改进行协作,需要检查和批准代码更改和预期的基础架构更改。极狐GitLab 提供了一个解决方案来帮助围绕 Terraform 代码更改及其使用合并请求页面的预期效果进行协作。这样用户就不必构建自定义工具或依赖第三方解决方案来简化他们的 IaC 工作流程。

将 Terraform 计划信息输出到合并请求中

使用极狐GitLab Terraform 报告产物,您可以将 terraform plan 运行的详细信息直接公开到合并请求部件中,使您能够查看关于 Terraform 创建、修改或销毁的资源的统计信息。

caution 与任何其他作业产物一样,任何具有仓库访客角色的人都可以查看 Terraform 计划数据。默认情况下,Terraform 和极狐GitLab 都不加密计划文件。如果您的 Terraform 计划包含密码、访问令牌或证书等敏感数据,我们强烈建议您加密计划输出或修改项目可见性设置。

配置 Terraform 报告产物

极狐GitLab 通过 CI/CD 模板和组件与 Terraform 以及 OpenTofu 集成,这些模板和组件使用由 GitLab 管理的 Terraform 状态,并在合并请求上显示 Terraform 所做的更改。

自动配置 Terraform 报告产物

您应该使用 Terraform CI/CD 模板OpenTofu CI/CD 组件,这能够在 plan 作业中自动配置 Terraform 报告产物。

手动配置 Terraform 报告产物

对于快速设置,您应该自定义预内置的镜像并依赖 gitlab-terraformgitlab-tofu helpers。

要手动配置极狐GitLab Terraform 报告产物:

  1. 为了简化,让我们定义几个可重用的变量来允许我们多次引用这些文件:

    variables:
      PLAN: plan.cache
      PLAN_JSON: plan.json
    
  2. 安装 jq,一个轻量级和灵活的命令行 JSON 处理器
  3. 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)}'"
    
    note 在使用 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)}'"
    
  4. 定义一个运行 terraform planterraform showscript。这些命令将输出发送到管道,并将有用的部分转换为存储变量 PLAN_JSON。这个 JSON 用于创建一个极狐GitLab Terraform 报告产物。Terraform 报告获得一个 Terraform tfplan.json 文件。收集的 Terraform 计划报告上传到极狐GitLab 作为一个产物,并在合并请求中显示。

    plan:
      stage: build
      script:
        - terraform plan -out=$PLAN
        - terraform show --json $PLAN | convert_report > $PLAN_JSON
      artifacts:
        reports:
          terraform: $PLAN_JSON
    
  5. 运行的流水线会展示在合并请求的小部件中,像这样:

    merge request Terraform widget

  6. 在小部件上选择 查看完整日志 按钮可以让你直接跳转到流水线日志中:

    Terraform plan logs