Skip to content

Pipeline Job Plugin

Pipeline-плагины добавляют standalone DAG-джобы в provider-agnostic IR. Джобы объявляют, какие typed resources они читают и пишут; TerraCi сам выводит зависимости, восстановление артефактов и необходимость детального plan.

Сценарии

  • Policy checks — читают plan.json, публикуют policy report
  • Cost estimation — читают plan.json, публикуют cost report
  • Dependency updates — публикуют result/report артефакты
  • Summary — читает plan.json и optional plugin reports, затем публикует MR/PR комментарий

Как Это Работает

Фаз и injected plan/apply steps больше нет. Пайплайн строится как DAG:

  1. Core создает Terraform plan/apply jobs для target modules.
  2. Плагины добавляют standalone jobs.
  3. Каждая job объявляет Consumes и Produces.
  4. pipeline.Build резолвит concrete resources, artifacts и dependencies.
  5. Providers только рендерят готовый IR.

Пример Job

go
func (p *Plugin) PipelineContribution(ctx *plugin.AppContext) (*pipeline.Contribution, error) {
    serviceDir := ctx.Config().ServiceDir()

    job, err := pipeline.NewPluginCommandJob(pipeline.PluginCommandJobOptions{
        Name:     "security-scan",
        Commands: []string{"terraci security check"},
        Consumes: []pipeline.ResourceRequest{
            pipeline.AllPlanResources(pipeline.ResourceKindPlanJSON),
        },
        Produces: []pipeline.ResourceSpec{
            pipeline.PluginResource(
                pipeline.ResourceKindPluginReport,
                "security",
                pipeline.WorkspacePath(serviceDir, ci.ReportFilename("security")),
            ),
        },
    })
    if err != nil {
        return nil, err
    }
    contribution, err := pipeline.NewContribution(job)
    if err != nil {
        return nil, err
    }
    return contribution, nil
}

Options и getters для ContributedJob

ПолеТипОписание
NamestringИмя job в generated pipeline
Commands[]stringShell-команды
Dependencies[]JobDependencyЯвные control dependencies, если нужны
Consumes[]ResourceRequestTyped resources, которые надо восстановить
Produces[]ResourceSpecTyped resources, которые job публикует
AllowFailureboolОшибка job не валит pipeline

Job создаётся через pipeline.NewPluginCommandJob или pipeline.NewContributedJob, затем оборачивается в pipeline.NewContribution. Consumers читают через Contribution.Jobs() и getters. Ошибки builder'ов возвращаются наружу; nil, nil запрещён. Optional jobs отключаются через plugin.PipelineContributionGate.

Resources

go
pipeline.AllPlanResources(pipeline.ResourceKindPlanJSON)
pipeline.ModulePlanResource(pipeline.ResourceKindPlanText, "platform/prod/eu-central-1/vpc")

pipeline.AllPluginResources(pipeline.ResourceKindPluginReport, true)
pipeline.PluginProducerResource(pipeline.ResourceKindPluginResult, "policy", false)

Запрос PlanJSON или PlanText автоматически включает detailed plan только для подходящих модулей.

Summary Job

Summary не требует специальной фазы. Она оказывается в конце DAG, потому что читает ресурсы, которые производят предыдущие jobs:

go
func (p *Plugin) PipelineContribution(_ *plugin.AppContext) (*pipeline.Contribution, error) {
    job, err := pipeline.NewPluginCommandJob(pipeline.PluginCommandJobOptions{
        Name:     "terraci-summary",
        Commands: []string{"terraci summary"},
        Consumes: []pipeline.ResourceRequest{
            pipeline.AllPlanResources(pipeline.ResourceKindPlanJSON),
            pipeline.AllPluginResources(pipeline.ResourceKindPluginReport, true),
        },
    })
    if err != nil {
        return nil, err
    }
    contribution, err := pipeline.NewContribution(job)
    if err != nil {
        return nil, err
    }
    return contribution, nil
}

Activation

Registry вызывает PipelineContribution только для enabled plugin configs. Если есть отдельный pipeline toggle, реализуйте plugin.PipelineContributionGate:

go
func (p *Plugin) PipelineContributionEnabled(_ *plugin.AppContext) (bool, error) {
    cfg := p.Config()
    return cfg != nil && cfg.Pipeline, nil
}

См. Также

Released under the MIT License.