Skip to content

Плагины

TerraCi построен как plugin-first система. Каждая функция — генерация пайплайнов, оценка стоимости, проверка политик, MR-комментарии — это плагин. Вы можете добавлять свои плагины для интеграции с любыми инструментами и сервисами.

Что могут плагины?

Тип плагинаЧто добавляетПримеры
CLI-командаНовая субкоманда terraci <command>Slack-уведомления, отчёты, аудит
Шаг пайплайнаДжобы/шаги в генерируемые CI-пайплайныСканирование безопасности, гейты согласования
CI-провайдерПоддержка новой CI-системыBitbucket Pipelines, Jenkins, CircleCI
Поле в мастереПоля конфигурации в terraci init TUIНастройки плагина, корпоративные дефолты

Быстрый старт

Соберите кастомный TerraCi с вашим плагином за 3 шага:

bash
# 1. Напишите плагин (см. гайды ниже)

# 2. Соберите бинарник
xterraci build --with github.com/your-org/terraci-plugin-slack

# 3. Используйте
./terraci slack --channel #deploys

Архитектура

                    ┌──────────────────────────┐
                    │      Ядро TerraCi         │
                    │                           │
                    │  discovery → parser →     │
                    │  graph → pipeline IR      │
                    └──────────┬───────────────┘

              ┌────────────────┼────────────────┐
              │                │                │
        ┌─────┴─────┐   ┌─────┴─────┐   ┌─────┴─────┐
        │ Встроенные │   │ Встроенные │   │   Ваш     │
        │  плагины   │   │  плагины   │   │  плагин   │
        │            │   │            │   │           │
        │  gitlab    │   │  cost      │   │  slack    │
        │  github    │   │  policy    │   │  jira     │
        │  git       │   │  summary   │   │  vault    │
        │            │   │  tfupdate  │   │  ...      │
        └────────────┘   └────────────┘   └───────────┘

Плагины компилируются в бинарник. Нет рантайм-загрузки — нулевой overhead и полная типобезопасность.

Гайды

CLI-команда

Добавьте новую terraci <command>. Самый распространённый тип — идеален для уведомлений, отчётов, интеграций.

Шаг пайплайна

Внедрите кастомные джобы или шаги в генерируемые CI-пайплайны. Для сканирования безопасности, гейтов согласования или post-deploy хуков.

CI-провайдер

Добавьте поддержку новой CI-системы. Реализуйте генерацию пайплайна, определение окружения и MR/PR-комментарии.

Поле в мастере

Добавьте поля конфигурации в интерактивный мастер terraci init. Пользователи настроят ваш плагин через TUI-форму.

Встроенные плагины

ПлагинВозможностиКонфигурация
gitChangeDetection, PreflightВсегда активен
gitlabGenerator, EnvDetector, Comments, Preflight, Initconfig/gitlab
githubGenerator, EnvDetector, Comments, Preflight, Initconfig/github
summaryCommand, Pipeline, InitВключён по умолчанию
costCommand, Pipeline, Runtime, Preflight, Initconfig/cost
policyCommand, Pipeline, Runtime, Preflight, Version, Initconfig/policy
tfupdateCommand, Pipeline, Runtime, Preflight, Initconfig/tfupdate

Основы

Регистрация

Каждый плагин регистрируется в init():

go
package myplugin

import (
    "github.com/edelwud/terraci/pkg/plugin"
    "github.com/edelwud/terraci/pkg/plugin/registry"
)

func init() {
    registry.Register(&Plugin{
        BasePlugin: plugin.BasePlugin[*Config]{
            PluginName: "myplugin",
            PluginDesc: "Что делает мой плагин",
            EnableMode: plugin.EnabledExplicitly,
            DefaultCfg: func() *Config { return &Config{} },
            IsEnabledFn: func(cfg *Config) bool {
                return cfg != nil && cfg.Enabled
            },
        },
    })
}

type Plugin struct {
    plugin.BasePlugin[*Config]
}

type Config struct {
    Enabled bool `yaml:"enabled"`
}

Пользователи настраивают плагин в .terraci.yaml:

yaml
plugins:
  myplugin:
    enabled: true

Политики активации

ПолитикаПоведениеИспользуют
EnabledAlwaysВсегда активен, конфиг не нуженgit
EnabledWhenConfiguredАктивен при наличии секции конфигаgitlab, github
EnabledByDefaultАктивен пока не enabled: falsesummary
EnabledExplicitlyТребует явного opt-incost, policy, update

Жизненный цикл

Register → Configure → Preflight → Freeze → Execute

AppContext

Каждая возможность получает *plugin.AppContext:

go
ctx.WorkDir()    // корневая директория проекта
ctx.ServiceDir() // абсолютный путь к .terraci
ctx.Config()     // полная конфигурация TerraCi (defensive copy)
ctx.Version()    // строка версии TerraCi
ctx.Reports()    // реестр отчётов для обмена между плагинами

Сборка

bash
# Из опубликованного модуля
xterraci build --with github.com/your-org/terraci-plugin-slack

# Из локальной директории при разработке
xterraci build --with github.com/your-org/plugin=./my-plugin

# Исключить ненужные встроенные плагины
xterraci build --without cost --without policy

См. также

Released under the MIT License.