Что такое TerraCi?
TerraCi — это CLI-инструмент, который анализирует Terraform/OpenTofu проекты и автоматически генерирует GitLab CI пайплайны с правильным порядком выполнения модулей.
Проблема
При управлении инфраструктурой в монорепозитории с множеством Terraform-модулей возникают следующие проблемы:
Управление зависимостями — модули часто зависят друг от друга (например, EKS зависит от VPC). Выполнение в неправильном порядке приводит к ошибкам.
Ручное обслуживание пайплайнов — написание и поддержка GitLab CI пайплайнов вручную трудоёмко и подвержено ошибкам.
Определение изменений — когда меняется только один модуль, не нужно пересобирать все модули.
Параллельное выполнение — независимые модули должны выполняться параллельно для сокращения времени деплоя.
Решение
TerraCi решает эти проблемы следующим образом:
1. Автоматическое обнаружение модулей
TerraCi сканирует структуру директорий для поиска всех Terraform-модулей:
infrastructure/
├── platform/
│ ├── stage/
│ │ └── eu-central-1/
│ │ ├── vpc/ ← Модуль найден
│ │ ├── eks/ ← Модуль найден
│ │ └── rds/ ← Модуль найден2. Извлечение зависимостей
Парсит data-источники terraform_remote_state для определения зависимостей:
# В 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