{{< details >}}

  • Tier: 基础版,专业版,旗舰版
  • Offering: JihuLab.com, 私有化部署

{{< /details >}}

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

输出 OpenTofu 计划信息到合并请求

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

{{< alert type=”warning” >}}

与其他作业产物一样,OpenTofu 计划数据可以被具有仓库 Guest 角色的任何人查看。默认情况下,OpenTofu 和极狐GitLab 都不会加密计划文件。如果您的 OpenTofu plan.jsonplan.cache 文件包含密码、访问令牌或证书等敏感数据,您应加密计划输出或修改项目可见性设置。您还应禁用公共流水线并将产物的公共标志设置为 falsepublic: false)。此设置确保产物仅对极狐GitLab 管理员和至少具有 Reporter 角色的项目成员可访问。

{{< /alert >}}

配置 OpenTofu 报告产物

极狐GitLab 通过 OpenTofu CI/CD 组件集成 OpenTofu。该组件使用极狐GitLab 管理的 OpenTofu 状态在合并请求中显示 OpenTofu 更改。

手动配置 OpenTofu 报告产物

为了快速设置,您应该自定义预构建镜像并依赖 gitlab-tofu 帮助程序。

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

  1. 定义可重用变量以多次引用这些文件:

    variables:
      PLAN: plan.cache
      PLAN_JSON: plan.json
    
  2. 安装 jq,一个轻量级且灵活的命令行 JSON 处理器。
  3. 为解析出您想从 tofu plan 输出中提取的信息的特定 jq 命令创建别名:

    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)}'"
    

    {{< alert type=”note” >}}

    在使用 Bash 的发行版中(例如,Ubuntu),alias 语句在非交互模式下不会扩展。如果您的流水线因错误 convert_report: command not found 而失败,可以通过在脚本中添加 shopt 命令来显式激活别名扩展:

    {{< /alert >}}

    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. 定义一个运行 tofu plantofu showscript。这些命令将输出通过管道传递并将相关部分转换为存储变量 PLAN_JSON。此 JSON 用于创建一个极狐GitLab OpenTofu 报告产物。OpenTofu 报告获取一个 OpenTofu tfplan.json 文件。收集的 OpenTofu 计划报告被上传到极狐GitLab 作为产物,并在合并请求中显示。

    plan:
      stage: build
      script:
        - terraform plan -out=$PLAN
        - terraform show -json $PLAN | convert_report > $PLAN_JSON
      artifacts:
        reports:
          terraform: $PLAN_JSON
    
  5. 运行流水线以在合并请求中显示小部件,如下所示:

    合并请求 Terraform 小部件

    {{< alert type=”note” >}}

    小部件报告的每个动作的最大变更数为 999,999。此限制仅用于显示目的,计划可以按预期应用更改更多资源。

    {{< /alert >}}

  6. 在小部件中,选择 查看完整日志 以查看流水线日志中的计划输出:

    Terraform 计划日志