Help us learn about your current experience with the documentation. Take the survey.

合并请求中的 OpenTofu 集成

  • Tier: Free, Premium, Ultimate
  • Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated

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

在合并请求中输出 OpenTofu 计划信息

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

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

配置 OpenTofu 报告产物

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

自动配置 OpenTofu 报告产物

您应该使用 OpenTofu CI/CD 组件,它会自动在 plan 作业中配置 OpenTofu 报告产物。

手动配置 OpenTofu 报告产物

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

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

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

    variables:
      PLAN: plan.cache
      PLAN_JSON: plan.json
  2. 安装 jq,这是一个 轻量级且灵活的命令行 JSON 处理器

  3. 为特定的 jq 命令创建别名,用于解析您想从 tofu 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)}'"
  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. 运行流水线以在合并请求中显示小部件,如下所示:

    merge request Terraform widget

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

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

    Terraform plan logs