Skip to main content

Job Summaries

When CI mode is enabled, Atmos writes rich Markdown summaries to $GITHUB_STEP_SUMMARY with resource badges, collapsible diffs, and clear warnings about destructive changes.

Experimental

Plan Summary

A plan summary includes resource counts as inline badges, destruction warnings, and a collapsible resource list:

## Plan: `vpc` in `plat-ue2-dev`

[![create](https://shields.io/badge/CREATE-3-success?style=for-the-badge)](#)
[![change](https://shields.io/badge/CHANGE-1-warning?style=for-the-badge)](#)
[![destroy](https://shields.io/badge/DESTROY-2-critical?style=for-the-badge)](#)

> [!CAUTION]
> **Terraform will delete resources!**

<details>
<summary>Plan: 3 to add, 1 to change, 2 to destroy</summary>

### Create
- `aws_vpc.main`
- `aws_subnet.public[0]`
- `aws_subnet.public[1]`

### Change
- `aws_security_group.web`

### Destroy
- `aws_security_group.deprecated`
- `aws_route.legacy`

</details>

Multi-component Plan Summary

When atmos terraform plan runs more than one component through the dependency graph in CI (--all, --components, or --query), Atmos writes one deterministic aggregate summary after all scheduler workers finish. This avoids concurrent writes to $GITHUB_STEP_SUMMARY while preserving per-component detail.

The aggregate summary includes:

  • Total component counts grouped as changed, failed, no changes, and skipped
  • Total resource counts across successful, non-skipped components
  • Failed, changed, no-change, and skipped component groups
  • A per-component table with stack, component, status, summary, resource counts, and duration
  • Collapsible details for failed and changed components

Skipped dependency-blocked components are shown separately from failed components. If any component fails, the aggregate CI exit code is 1; otherwise it is 2 when any component changed and 0 when every component completed with no changes.

Apply Summary

Apply summaries show the result of the apply operation, including resource counts and any terraform outputs that were produced.

Configuration

ci.summary.enabled

Enable or disable job summaries.

Default: true

ci.summary.template

Override the default summary template with a custom template file path.

Template Customization

Override the default plan and apply summary templates with your own Markdown templates. Templates use Go template syntax with access to plan/apply context data.

Custom Template Configuration

atmos.yaml
ci:
templates:
base_path: ".atmos/ci/templates"
terraform:
plan: "plan.md"
apply: "apply.md"
ci.templates.base_path

Directory containing custom template files, relative to the repository root.

Default: .atmos/ci/templates

ci.templates.terraform.plan

Filename of the custom plan summary template within the base path.

Default: plan.md (built-in)

ci.templates.terraform.apply

Filename of the custom apply summary template within the base path.

Default: apply.md (built-in)

Template Context

Templates receive a context object with plan/apply data. The built-in templates are located at pkg/ci/plugins/terraform/templates/ in the Atmos source.

Plan Template Variables

VariableTypeDescription
.ComponentstringComponent name
.StackstringStack name
.CommandstringTerraform command (plan)
.HasChangesboolWhether the plan has changes
.AdditionsintNumber of resources to create
.ChangesintNumber of resources to change
.DestructionsintNumber of resources to destroy
.ImportsintNumber of resources to import
.SummarystringOne-line plan summary
.ResourcesobjectResource lists by action type
.Warnings[]stringTerraform warning messages

Apply Template Variables

VariableTypeDescription
.ComponentstringComponent name
.StackstringStack name
.CommandstringTerraform command (apply)
.SuccessboolWhether apply succeeded
.SummarystringOne-line apply summary
.ResourcesobjectResource lists by action type
.OutputsmapTerraform outputs
.Warnings[]stringTerraform warning messages

Example Custom Template

.atmos/ci/templates/plan.md
## {{ .Component }} / {{ .Stack }}

{{ if .HasChanges }}
**Changes detected:** {{ .Additions }} to add, {{ .Changes }} to change, {{ .Destructions }} to destroy

{{ if gt .Destructions 0 }}
> **Warning:** This plan destroys resources!
{{ end }}
{{ else }}
No changes. Infrastructure is up-to-date.
{{ end }}