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:
- Core создает Terraform plan/apply jobs для target modules.
- Плагины добавляют standalone jobs.
- Каждая job объявляет
ConsumesиProduces. pipeline.Buildрезолвит concrete resources, artifacts и dependencies.- Providers только рендерят готовый IR.
Пример Job
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
| Поле | Тип | Описание |
|---|---|---|
Name | string | Имя job в generated pipeline |
Commands | []string | Shell-команды |
Dependencies | []JobDependency | Явные control dependencies, если нужны |
Consumes | []ResourceRequest | Typed resources, которые надо восстановить |
Produces | []ResourceSpec | Typed resources, которые job публикует |
AllowFailure | bool | Ошибка job не валит pipeline |
Job создаётся через pipeline.NewPluginCommandJob или pipeline.NewContributedJob, затем оборачивается в pipeline.NewContribution. Consumers читают через Contribution.Jobs() и getters. Ошибки builder'ов возвращаются наружу; nil, nil запрещён. Optional jobs отключаются через plugin.PipelineContributionGate.
Resources
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:
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:
func (p *Plugin) PipelineContributionEnabled(_ *plugin.AppContext) (bool, error) {
cfg := p.Config()
return cfg != nil && cfg.Pipeline, nil
}См. Также
- CI Provider Plugin — рендер IR для нового CI
- Генерация Pipeline — как строятся generated pipelines