Skip to content

feat: add test steps, build controls, and default CLI help - #3124

Merged
Andriy Knysh (aknysh) merged 20 commits into
mainfrom
osterman/test-runner-step
Sep 13, 2026
Merged

Andriy Knysh (aknysh) merged 20 commits into
mainfrom
osterman/test-runner-step

Conversation

@osterman

@osterman Erik Osterman (Cloud Posse) (osterman) commented Sep 11, 2026 •

Copy link
Copy Markdown
Member

what

  • Add type: test to workflows, custom commands, and lifecycle hooks with continuation by default, parallel/matrix checks, existing failure policies, buffered failures/all output, and isolated concurrent state

  • Add themed test trees with status dots, leaf progress, durations, immediate failure logs, and CI output; update schemas, documentation, tests, the roadmap, and a custom-command example with a recorded cast and success announcement

  • Implement live output viewports for shell/Atmos commands, including sizing and horizontal padding; use a four-line padded window labeled Compiling for builds and add --no-cache

  • Make bare atmos display help without requiring stacks and suppress duplicate error boxes for already-reported custom-command test failures

  • Bundle an atmos-tests agent skill with HTTP, script/interpreter, shell, require, parallel/dependency, matrix, and post-deployment hook patterns

why

  • Make post-deployment checks reusable locally and in CI, keep successful logs quiet, and support projects that use Atmos without stacks

references

Summary by CodeRabbit

  • New Features

    • Added test workflow steps with progress reporting, pass/fail summaries, parallel and matrix checks, retries, and configurable failure handling.
    • Added live output viewports with configurable height and padding; successful output collapses while failures reveal full logs.
    • Added --no-cache support for builds to force recompilation without clearing shared caches.
    • Running atmos without a subcommand now displays usage and available commands.
  • Bug Fixes

    • Improved custom-command test failure reporting and output handling.
  • Documentation

    • Added guidance and examples for test steps, output viewports, and build caching.

@osterman Erik Osterman (Cloud Posse) (osterman) added the minor New features that do not break anything label Sep 11, 2026
@osterman Erik Osterman (Cloud Posse) (osterman) added the minor New features that do not break anything label Sep 11, 2026
@atmos-pro

atmos-pro Bot commented Sep 11, 2026 •

Copy link
Copy Markdown
Contributor

Tip

Atmos Pro  

No affected stacks workflow was detected for this pull request.
If this is expected, no action is needed.
Learn More. Ask AI.

@github-actions github-actions Bot added the size/l Large size PR label Sep 11, 2026
@github-actions

Copy link
Copy Markdown

Dependency Review

✅ No vulnerabilities or license issues found.

Scanned Files

None

@github-actions

Copy link
Copy Markdown

Resource Changes Found for bucket in test

Atmos CI

create

Plan: 4 to add, 0 to change, 0 to destroy.
To reproduce this locally, run:

atmos terraform plan bucket -s test

Create

+ aws_s3_bucket.checkov_target
+ aws_s3_bucket.this
+ aws_s3_bucket.trivy_target
+ aws_s3_bucket_public_access_block.trivy_target
Terraform Plan Summary
  # aws_s3_bucket.checkov_target will be created
  + resource "aws_s3_bucket" "checkov_target" {
      + acceleration_status         = (known after apply)
      + acl                         = (known after apply)
      + arn                         = (known after apply)
      + bucket                      = "atmos-native-ci-e2e-checkov-test"
      + bucket_domain_name          = (known after apply)
      + bucket_prefix               = (known after apply)
      + bucket_regional_domain_name = (known after apply)
      + force_destroy               = false
      + hosted_zone_id              = (known after apply)
      + id                          = (known after apply)
      + object_lock_enabled         = (known after apply)
      + policy                      = (known after apply)
      + region                      = (known after apply)
      + request_payer               = (known after apply)
      + tags_all                    = (known after apply)
      + website_domain              = (known after apply)
      + website_endpoint            = (known after apply)

      + cors_rule (known after apply)

      + grant (known after apply)

      + lifecycle_rule (known after apply)

      + logging (known after apply)

      + object_lock_configuration (known after apply)

      + replication_configuration (known after apply)

      + server_side_encryption_configuration (known after apply)

      + versioning (known after apply)

      + website (known after apply)
    }

  # aws_s3_bucket.this will be created
  + resource "aws_s3_bucket" "this" {
      + acceleration_status         = (known after apply)
      + acl                         = (known after apply)
      + arn                         = (known after apply)
      + bucket                      = "atmos-native-ci-e2e-test"
      + bucket_domain_name          = (known after apply)
      + bucket_prefix               = (known after apply)
      + bucket_regional_domain_name = (known after apply)
      + force_destroy               = false
      + hosted_zone_id              = (known after apply)
      + id                          = (known after apply)
      + object_lock_enabled         = (known after apply)
      + policy                      = (known after apply)
      + region                      = (known after apply)
      + request_payer               = (known after apply)
      + tags                        = {
          + "AtmosFixture" = "native-ci-e2e"
          + "Stage"        = "test"
        }
      + tags_all                    = {
          + "AtmosFixture" = "native-ci-e2e"
          + "Stage"        = "test"
        }
      + website_domain              = (known after apply)
      + website_endpoint            = (known after apply)

      + cors_rule (known after apply)

      + grant (known after apply)

      + lifecycle_rule (known after apply)

      + logging (known after apply)

      + object_lock_configuration (known after apply)

      + replication_configuration (known after apply)

      + server_side_encryption_configuration (known after apply)

      + versioning (known after apply)

      + website (known after apply)
    }

  # aws_s3_bucket.trivy_target will be created
  + resource "aws_s3_bucket" "trivy_target" {
      + acceleration_status         = (known after apply)
      + acl                         = (known after apply)
      + arn                         = (known after apply)
      + bucket                      = "atmos-native-ci-e2e-trivy-test"
      + bucket_domain_name          = (known after apply)
      + bucket_prefix               = (known after apply)
      + bucket_regional_domain_name = (known after apply)
      + force_destroy               = false
      + hosted_zone_id              = (known after apply)
      + id                          = (known after apply)
      + object_lock_enabled         = (known after apply)
      + policy                      = (known after apply)
      + region                      = (known after apply)
      + request_payer               = (known after apply)
      + tags_all                    = (known after apply)
      + website_domain              = (known after apply)
      + website_endpoint            = (known after apply)

      + cors_rule (known after apply)

      + grant (known after apply)

      + lifecycle_rule (known after apply)

      + logging (known after apply)

      + object_lock_configuration (known after apply)

      + replication_configuration (known after apply)

      + server_side_encryption_configuration (known after apply)

      + versioning (known after apply)

      + website (known after apply)
    }

  # aws_s3_bucket_public_access_block.trivy_target will be created
  + resource "aws_s3_bucket_public_access_block" "trivy_target" {
      + block_public_acls       = true
      + block_public_policy     = true
      + bucket                  = (known after apply)
      + id                      = (known after apply)
      + ignore_public_acls      = true
      + restrict_public_buckets = true
    }

Plan: 4 to add, 0 to change, 0 to destroy.

Changes to Outputs:
  + bucket_name = "atmos-native-ci-e2e-test"

@codecov

codecov Bot commented Sep 11, 2026 •

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 92.36253% with 75 lines in your changes missing coverage. Please review.
✅ Project coverage is 84.11%. Comparing base (fbb77ad) to head (0e0548c).
⚠️ Report is 3 commits behind head on main.

Files with missing lines Patch % Lines
pkg/hooks/step_engine.go 67.34% 8 Missing and 8 partials ⚠️
pkg/runner/step/output_viewport.go 86.13% 8 Missing and 6 partials ⚠️
pkg/runner/step/scoped_output.go 81.57% 8 Missing and 6 partials ⚠️
pkg/workflow/test_runner.go 96.04% 5 Missing and 5 partials ⚠️
pkg/ui/testreport/report.go 95.26% 5 Missing and 4 partials ⚠️
pkg/workflow/test_leaf.go 96.69% 2 Missing and 2 partials ⚠️
pkg/runner/step/container_build.go 50.00% 1 Missing and 2 partials ⚠️
pkg/runner/step/table.go 0.00% 0 Missing and 2 partials ⚠️
pkg/schema/test_step.go 94.87% 1 Missing and 1 partial ⚠️
pkg/runner/step/format.go 0.00% 0 Missing and 1 partial ⚠️
Additional details and impacted files

Impacted file tree graph

@@            Coverage Diff             @@
##             main    #3124      +/-   ##
==========================================
+ Coverage   84.04%   84.11%   +0.06%     
==========================================
  Files        2001     2009       +8     
  Lines      196929   197817     +888     
==========================================
+ Hits       165511   166387     +876     
+ Misses      23362    23347      -15     
- Partials     8056     8083      +27     
Flag Coverage Δ
unittests 84.11% <92.36%> (+0.06%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing lines Coverage Δ
cmd/cmd_utils.go 77.24% <100.00%> (-0.12%) ⬇️
cmd/custom_command_output.go 100.00% <100.00%> (ø)
cmd/root.go 79.49% <100.00%> (+0.43%) ⬆️
internal/exec/workflow_utils.go 77.69% <100.00%> (-0.12%) ⬇️
magefiles/build.go 95.27% <100.00%> (+0.11%) ⬆️
pkg/runner/step/alert.go 100.00% <100.00%> (ø)
pkg/runner/step/container_inspect.go 94.91% <100.00%> (ø)
pkg/runner/step/container_run.go 86.89% <100.00%> (ø)
pkg/runner/step/hint.go 100.00% <100.00%> (ø)
pkg/runner/step/http.go 91.04% <100.00%> (ø)
... and 25 more

... and 18 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@osterman

Copy link
Copy Markdown
Member Author

CodeRabbit (@coderabbitai) review

@coderabbitai

coderabbitai Bot commented Sep 13, 2026 •

Copy link
Copy Markdown
Contributor
⚠️ Action not completed

Review rate limited.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@osterman

Copy link
Copy Markdown
Member Author

CodeRabbit (@coderabbitai) review

@coderabbitai

coderabbitai Bot commented Sep 13, 2026 •

Copy link
Copy Markdown
Contributor
⚠️ Action not completed

Review rate limited.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@osterman

Copy link
Copy Markdown
Member Author

CodeRabbit (@coderabbitai) review

@coderabbitai

coderabbitai Bot commented Sep 13, 2026 •

Copy link
Copy Markdown
Contributor
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

coderabbitai[bot]
coderabbitai Bot previously approved these changes Sep 13, 2026
@osterman

Copy link
Copy Markdown
Member Author

CodeRabbit (@coderabbitai) review

@coderabbitai

coderabbitai Bot commented Sep 13, 2026 •

Copy link
Copy Markdown
Contributor
⚠️ Action not completed

Review rate limited.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@aknysh
Andriy Knysh (aknysh) added this pull request to the merge queue Sep 13, 2026
@atmos-pro

atmos-pro Bot commented Sep 13, 2026 •

Copy link
Copy Markdown
Contributor

Tip

Atmos Pro  

No affected stacks workflow was detected for this pull request.
If this is expected, no action is needed.
Learn More. Ask AI.

Merged via the queue into main with commit 584908f Sep 13, 2026
143 checks passed
@aknysh
Andriy Knysh (aknysh) deleted the osterman/test-runner-step branch September 13, 2026 20:47
@atmos-pro

atmos-pro Bot commented Sep 13, 2026 •

Copy link
Copy Markdown
Contributor

Tip

Atmos Pro  

No affected stacks workflow was detected for this pull request.
If this is expected, no action is needed.
Learn More. Ask AI.

@github-actions

Copy link
Copy Markdown

These changes were released in v1.229.0-rc.3.

This branch was successfully deployed

2 active deployments
preview — 0e0548c8 Deployed Sep 13, 2026 by github-actions[bot]
screengrabs — 0e0548c8 Deployed Sep 13, 2026 by osterman via build #2194
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

minor New features that do not break anything size/xl Extra large size PR

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants