Skip to content

Что такое TerraCi?

TerraCi — это CLI-инструмент, который анализирует Terraform/OpenTofu проекты и автоматически генерирует GitLab CI пайплайны с правильным порядком выполнения модулей.

Проблема

При управлении инфраструктурой в монорепозитории с множеством Terraform-модулей возникают следующие проблемы:

  1. Управление зависимостями — модули часто зависят друг от друга (например, EKS зависит от VPC). Выполнение в неправильном порядке приводит к ошибкам.

  2. Ручное обслуживание пайплайнов — написание и поддержка GitLab CI пайплайнов вручную трудоёмко и подвержено ошибкам.

  3. Определение изменений — когда меняется только один модуль, не нужно пересобирать все модули.

  4. Параллельное выполнение — независимые модули должны выполняться параллельно для сокращения времени деплоя.

Решение

TerraCi решает эти проблемы следующим образом:

1. Автоматическое обнаружение модулей

TerraCi сканирует структуру директорий для поиска всех Terraform-модулей:

infrastructure/
├── platform/
│   ├── stage/
│   │   └── eu-central-1/
│   │       ├── vpc/        ← Модуль найден
│   │       ├── eks/        ← Модуль найден
│   │       └── rds/        ← Модуль найден

2. Извлечение зависимостей

Парсит data-источники terraform_remote_state для определения зависимостей:

hcl
# В eks/main.tf
data "terraform_remote_state" "vpc" {
  backend = "s3"
  config = {
    key = "platform/stage/eu-central-1/vpc/terraform.tfstate"
  }
}

TerraCi определяет, что eks зависит от vpc.

3. Топологическая сортировка

Используя алгоритм Кана, TerraCi сортирует модули по уровням выполнения:

Уровень 0: vpc (нет зависимостей)
Уровень 1: eks, rds (зависят от vpc)
Уровень 2: app (зависит от eks и rds)

4. Генерация пайплайна

Генерирует GitLab CI пайплайн, где:

  • Модули одного уровня выполняются параллельно
  • Модули ждут завершения своих зависимостей
  • Plan и apply стадии разделены (опционально)

Ключевые возможности

ВозможностьОписание
Умное обнаружениеНаходит модули на глубине 4 и 5 (с сабмодулями)
Граф зависимостейСтроит точный DAG из remote state ссылок
Детекция цикловПредупреждает о циклических зависимостях
Git интеграцияОпределяет изменённые модули через git diff
Поддержка OpenTofuРаботает с Terraform и OpenTofu
Glob-фильтрацияInclude/exclude модулей по паттернам
DOT экспортВизуализация зависимостей в GraphViz

Когда использовать TerraCi

TerraCi идеален для:

  • Монорепозиториев с множеством Terraform-модулей
  • Команд, которым нужны консистентные CI/CD пайплайны
  • Сложной инфраструктуры со множеством взаимозависимостей
  • Пользователей GitLab CI (поддержка GitHub Actions планируется)

Требования

  • Go 1.22+ (для сборки из исходников)
  • GitLab CI (для выполнения пайплайнов)
  • Terraform или OpenTofu модули с использованием terraform_remote_state

Released under the MIT License.