Releases: gruntwork-io/terragrunt
v1.0.0-rc3
🎉 v1.0.0 Release Candidate
This is the third, and final release candidate for Terragrunt v1.0.
This release introduces bug fixes, documentation updates, some final breaking changes, and some internal housekeeping since RC2. With the release of 1.0 in March, you can expect many stability guarantees from Terragrunt, which are documented here. You have roughly 2-3 weeks to influence the final 1.0 release, so make sure you try this release candidate out and share your feedback. If you have tried this release, make sure to share your feedback with an emoji or a comment on the associated GitHub Discussion.
You can learn more about the release candidate process in The Road to 1.0: Release Schedule blog post.
🛠️ Breaking Changes
Windows compatibility in file paths improved
All HCL functions now return operating system native file paths without forward slash normalization.
get_terragrunt_dir()get_original_terragrunt_dir()get_parent_terragrunt_dir()get_path_from_repo_root()get_path_to_repo_root()find_in_parent_folders()path_relative_to_include()path_relative_from_include()
If you and your team do not work in Windows environments, you are unlikely to see any change as a consequence of this. If you do use Terragrunt in a Windows environment, Terragrunt will now return appropriate Windows file paths, with backslashes as file path separators instead of Unix-like forward slashes.
If you need to normalize paths, you can use the replace function to achieve this.
e.g.
remote_state {
backend = "s3"
generate = {
path = "backend.tf"
if_exists = "overwrite_terragrunt"
}
config = {
bucket = "my-tofu-state"
key = "${replace(path_relative_to_include(), "\\", "/"}/tofu.tfstate" # <--
region = "us-east-1"
encrypt = true
dynamodb_table = "my-lock-table"
}
}📖 Documentation Updates
New Home for the Terragrunt website!
The Terragrunt website is now hosted at https://terragrunt.com and https://docs.terragrunt.com for marketing and documentation purposes, respectively.
Existing links to https://terragrunt.gruntwork.io should seamlessly redirect to the new domain that hosts the content for that URI.
🐛 Bug Fixes
Improved Error messages for undefined flags
Detection has been added for scenarios when a user is using a flag that might be meant to be passed to OpenTofu/Terraform in the run command, and suggests using the -- argument to pass it through.
As an example:
$ terragrunt run providers lock -platform linux_amd64 -platform darwin_arm64
14:52:19.496 ERROR flag `-platform` is not a Terragrunt flag. If this is an OpenTofu/Terraform flag, use `--` to forward it (e.g., `terragrunt run -- <command> -platform`).Improved log messages for hooks with errors
Hooks encountering errors will now return errors that better communicate whether an error was caused by failure to execute an external process or successfully running an external process, but receiving a non-zero exit code.
e.g.
11:39:03.648 INFO Executing hook: before_hook
11:39:03.649 ERROR Hook "before_hook" failed to execute: Failed to execute "non-existent-command" in ./.terragrunt-cache/_53N4ygp1LP9jdKsbtvistzGFqI/MqiE_Mt8XGTBVLRprAmyl66quoM
exec: "non-existent-command": executable file not found in $PATHvs
11:38:17.694 INFO Executing hook: before_hook
11:38:17.701 ERROR Hook "before_hook" (command: bash -c exit 1) exited with non-zero exit code 1More accurate matching of retryable errors
Fixes a bug where retries were triggered when an expected error is matched against non-stderr output from external process errors.
Duplicate error reporting fixed
Fixes a bug where duplicate errors were reported when running units through the worker pool subsystem.
Interaction between --working-dir and -detailed-exitcode fixed
Fixes a bug where the wrong cache key was used for storing exit codes for OpenTofu/Terraform runs in units when the --working-dir flag was also used.
Variable sanitization via escaping added
Escaping added for interpolation expressions (e.g. ${foo} that are unlikely to be desired by users).
Removing usage of filepath.Abs and reducing usage of filepath.ToSlash
Usage of the Golang filepath.Abs and filepath.ToSlash standard library functions significantly reduced. Overly broad application of these functions to file paths caused subtle operating system compatibility issues and incompatibility with the --working-dir flag.
The codebase has been updated to only use filepath.Abs early on in initialization of the CLI prior to setting the value of --working-dir (after which, working dir is considered the source of truth for file path canonicalization) and tests. The codebase has been updated to use filepath.ToSlash only where unix-style forward slash normalization is a requirement (e.g. when used in file path globs).
Handling of backend init when disable_init=true
Fixes a bug where disable_init = true affected behavior beyond Terragrunt’s bootstrap operations. disable_init now correctly limits its scope to Terragrunt bootstrap steps only.
Fix detection of offline usage in Provider Cache Server
A bug in the detection of offline usage in the Provider Cache Server resulted in attempts to reach the default provider registry for OpenTofu/Terraform to trigger errors even when using the Provider Cache Server to proxy requests to a network or filesystem mirror.
This has been fixed. When the default provider registry isn’t available for OpenTofu/Terraform for any reason, the Provider Cache Server will use the provided network/filesystem mirror instead without attempting to use the discovery endpoint. This will help users in air-gapped environments using the Provider Cache Server.
Provider Cache Server used for fetching outputs from dependencies
The Provider Cache Server is now used when fetching outputs from dependencies, improving performance of output resolution for users using the provider cache server.
Relative paths in reading files fixed
A bug in the logic for incorporating includes as absolute paths in tracked “read” files has been fixed.
Ambiguous unit/stack components now throw errors
Previously, Terragrunt would silently engage in undefined behavior when both a terragrunt.hcl and terragrunt.stack.hcl file existed in the same directory.
With this release, Terragrunt will start to throw warnings and prevent such usage. Users will have to ensure that only one of a unit (terragrunt.hcl) or stack configuration (terragrunt.stack.hcl) exist in a unit or stack directory, respectively.
🧹 Chores
Refactoring to move filter parsing higher
Refactored parsing logic for the --filter flag to allow filter parsing to happen much earlier, improving safety and reliability.
Added testing to verify resolution of #3080
Added testing to verify incidental resolution of #3080.
What's Changed
- fix: Improving error message for undefined flags by @yhakbar in #5571
- fix: Increasing accuracy of retryable errors match by @yhakbar in #5568
- fix: duplicate error reporting in worker pool by @anuragrao04 in #5526
- fix: Fixing incremental lint issue by @yhakbar in #5592
- fix: Fixing
detailed-exitcodewhen used in combination with-working-dirby @yhakbar in #5590 - fix: variables values interpolation by @denis256 in #5585
- fix: Removing usage of
filepath.Absin production code and reducing usage offilepath.ToSlashby @yhakbar in #5597 - fix: handling of backend init when disable_init=true by @denis256 in #5594
- fix: Assume any transport errors to discovery URL are a sign that the user is offline by @yhakbar in #5615
- fix: Fixing CORS for terragrunt.com by @yhakbar in #5631
- fix: Fixing relative paths in tracked reading files by @yhakbar in #5651
- fix: Fixing #4556 by @yhakbar in #5640
- docs: Documenting
-queue-strict-includedeprecation in strict controls by @yhakbar in #5581
...
alpha-2026030301
Tests update to cosign configurations
Full Changelog: v1.0.0-rc3...alpha-2026030301
alpha-2026022001
⚠️ Alpha Release
Allows users to test out the changes in #5590
Full Changelog: v1.0.0-rc2...alpha-2026022001
v1.0.0-rc2
🎉 v1.0.0 Release Candidate
This is the second release candidate for Terragrunt 1.0.
This release includes bug fixes, documentation updates and a couple breaking changes since RC1 that are necessary to ensure a maximally stable 1.0. With the release of 1.0 in March, you can expect many stability guarantees from Terragrunt, which are documented here. You have roughly 3-5 weeks to influence the final 1.0 release, so make sure you try this release candidate out and share your feedback. If you are happy with this release, make sure to share your feedback with an emoji or a comment on the associated GitHub Discussion.
You can learn more about the release candidate process in The Road to 1.0: Release Schedule blog post.
🛠️ Breaking Changes
render --format=json no longer discovers dependents by default
Prior to this release, the render --format=json command would automatically start to perform dependent discovery on other units related to the unit being rendered. Avoiding this required usage of the --disable-dependent-modules flag. That behavior has been removed. HCL and JSON rendering of unit configurations will now proceed without the additional overhead of dependent discovery by default.
This functionality is better served by a combination of find and graph-based filters.
e.g. If you want to detect all the dependents of a given unit foo, expecting to find the dependent unit bar you can run the following:
$ terragrunt find --filter '...^foo'
barIf you aren’t familiar with filters, this reads as “find all dependents of foo, not foo itself”
🏎️ Performance Improvements
Discovery performance improved
The way in which Terragrunt discovers and filters units and stacks for runs has improved significantly.
Terragrunt is now better at avoiding parsing units/stacks unnecessarily, based on the filter you use. Previously, the logic used was more coarse, and could result in a requirement to parse some configurations (e.g. presence of a dependency graph expression to result in parsing all configurations. Discovery has been refactored to allow for much more careful opt-in parsing based on the need to support the filter used by users (or lack thereof).
This will also result in improvements to Terragrunt’s ability to ignore broken parts of infrastructure estates when Terragrunt can predictably determine that it won’t impact a run.
EncodeSourceVersion execution sped up
The performance of EncodeSourceVersion has been improved by utilizing SkipDir to optimize directory traversals.
Special thanks to @healthy-pod for contributing this improvement!
🐛 Bug Fixes
Retries added for registry timeouts in provider cache server
The Provider Cache Server will now perform automatic retries on timeouts to OpenTofu/Terraform provider registries.
Discoverability of init-from-module documentation improved
The special internal init-from-module command referenced in hooks has had its documentation improved to make it easier to discover. It was difficult to find in the terraform HCL block documentation, and that resulted in confusion for users.
Over-warning on strict controls prevented
Using --strict-mode resulted in over-warning on completed controls. Those warnings will no longer appear when using strict mode.
Stdout/stderr from run_cmd emitted when included
A bug prevented the run_cmd HCL function from emitting to stdout/stderr when included by a unit. That bug has been fixed.
Provider Cache Server integration with custom registries fixed
The Provider Cache Server now properly integrates with custom registries. You will still need to use the --provider-cache-registry-names flag to ensure that the Provider Cache Server properly handles proxying requests to the custom provider registry.
The no_run attribute of exclude is fixed
A bug prevented the no_run attribute of the exclude block from being respected when being explicitly set to false (as opposed to not being defined at all). This bug has been fixed.
The --report-file is now respected for single runs
The --report-file will now generate reports even when runs are performed without the --all flag.
Path manipulation removed from log messages
Log messages no longer have paths updated automatically. This caused confusion for users when seeing OpenTofu/Terraform stdout and hook stdout emitted through logs, as paths were unconditionally updated to be relative to the unit path. This logic has been moved to logging call sites to ensure that external process stdout/stderr is not manipulated unexpectedly.
Absolute URLs in registry self-discovery integration with Provider Cache Server Fixed
When using the Provider Cache Server in conjunction with a remote registry using absolute URLs for modules, the Provider Cache Server will now properly resolve the module source.
SOPS decryption race condition fixed
A race condition in the concurrent access to SOPS decrypted secrets in different environments combined with usage of the --auth-provider-cmd flag resulted in authentication failures. Synchronization controls have been introduced to ensure authentication proceeds correctly for each environment independently.
Version constraints in stack runs fixed
When running against a stack, a bug prevented Terragrunt + OpenTofu/Terraform version constraints from being respected while using the terragrunt_version_constraint and terraform_version_constraint HCL attributes. That bug has been fixed.
Interrupt signal propagation to OpenTofu/Terraform fixed
The mechanism by which Terragrunt sends interrupt signals to OpenTofu/Terraform processes it started has been made more robust. Terragrunt will now send the interrupt signal in the event that a user explicitly sends an interrupt signal to Terragrunt in addition to scenarios where Terragrunt’s context cancellation is triggered (e.g. in the event of a timeout).
Remote state configuration parsing fixed
Remote state configuration parsing (especially S3) is now more tolerant of common input formats, reducing decode-related failures from type mismatches in configuration values.
Parsing behavior has also been made more consistent across related remote configuration blocks in Terragrunt, with regression tests added to prevent future breakages.
Invalid unit configurations cause explicit errors instead of silently being excluded during runs
A bug in discovery logic resulted in units with invalid HCL configurations being silently excluded from runs with a warning. This bug has been fixed, and attempting to parse invalid HCL configurations during a run will result in an error.
Partial parse configuration cache fixed
A bug affecting the partial parse configuration cache (in use when the --use-partial-parse-config-cache flag is supplied) has been resolved, ensuring configurations are cached and read accurately without incorrect cache collisions.
Engine output adjusted
The display and formatting of engine outputs have been updated to be cleaner and more intuitive for users when running Terragrunt workflows.
Stdout/Stderr entries emitted from engines will now have the engine tool listed instead of tofu.
⚙️ Process Updates
Go bumped to v1.26
The version of Golang used to compile the Terragrunt binary has been updated to v1.26.0.
OpenTofu/Terraform Compatibility Updated
Terragrunt is now continuously tested against OpenTofu 1.11.4 and Terraform 1.14.4 in CI.
AWS and GRPC dependencies update
Updated AWS SDK and gRPC dependencies to pick up the latest bug fixes and security patches:
google.golang.org/grpctov1.79.1github.com/aws/aws-sdk-go-v2/configtov1.32.8github.com/aws/aws-sdk-go-v2/credentialstov1.19.8
What's Changed
- perf: speed up
EncodeSourceVersionby using SkipDir by @healthy-pod in #4533 - perf: Adding discovery benchmark by @yhakbar in #5562
- fix: Handle registry timeouts in provider cache server by @yhakbar in #5471
- fix: Adding test for
init-from-moduleand improving discoverability by @yhakbar in #5491 - fix: Fixing over-warning on strict controls by @yhakbar in #5501
- fix: Emit output from
run_cmdwhen included by @yhakbar in #5495 - fix: Fixing provider cache server integration with custom registry by @yhakbar in #5500
- fix: Fixing
excludeno_runbehavi...
v0.99.4
🏎️ Performance Improvements
Discovery performance improved
The way in which Terragrunt discovers and filters units and stacks for runs has improved significantly.
Terragrunt is now better at avoiding parsing units/stacks unnecessarily, based on the filter you use. Previously, the logic used was more coarse, and could result in a requirement to parse some configurations (e.g. presence of a dependency graph expression to result in parsing all configurations. Discovery has been refactored to allow for much more careful opt-in parsing based on the need to support the filter used by users (or lack thereof).
This will also result in improvements to Terragrunt’s ability to ignore broken parts of infrastructure estates when Terragrunt can predictably determine that it won’t impact a run.
🐛 Bug Fixes
Invalid unit configurations cause explicit errors instead of silently being excluded during runs
A bug in discovery logic resulted in units with invalid HCL configurations being silently excluded from runs with a warning. This bug has been fixed, and attempting to parse invalid HCL configurations during a run will result in an error.
What's Changed
Full Changelog: v0.99.3...v0.99.4
v0.99.3
🐛 Bug Fixes
Over-warning on strict controls prevented
Using --strict-mode resulted in over-warning on completed controls. Those warnings will no longer appear when using strict mode.
What's Changed
Full Changelog: v0.99.2...v0.99.3
alpha-2026021801
⚠️ Alpha Release
- Release process testing after CICD pipeline updates
What's Changed
- docs: Making filter docs a bit more consistent by @yhakbar in #5557
- chore: Removing options from components by @yhakbar in #5551
Full Changelog: alpha-2026021701...alpha-2026021801
alpha-2026021701
⚠️ Alpha Release
- Release process testing after CICD pipeline updates
What's Changed
- chore: Refactor discovery for nuanced parse handling by @yhakbar in #5477
- chore: Units code cleanup by @denis256 in #5550
- chore(deps): bump aws-actions/configure-aws-credentials from 5 to 6 by @dependabot[bot] in #5553
- fix: Adjusting engine output by @yhakbar in #5386
- docs: Breaking down filters docs by @yhakbar in #5552
- chore: SOPS tests improvements by @denis256 in #5554
- perf: speed up
EncodeSourceVersionby using SkipDir by @healthy-pod in #4533 - Revert css fixes now that docs site is live by @karlcarstensen in #5556
New Contributors
- @healthy-pod made their first contribution in #4533
Full Changelog: alpha-2026021301...alpha-2026021701
v0.99.2
🐛 Bug Fixes
Interrupt signal propagation to OpenTofu/Terraform fixed
The mechanism by which Terragrunt sends interrupt signals to OpenTofu/Terraform processes it started has been made more robust. Terragrunt will now send the interrupt signal in the event that a user explicitly sends an interrupt signal to Terragrunt in addition to scenarios where Terragrunt’s context cancellation is triggered (e.g. in the event of a timeout).
SOPS decryption race condition fixed
A race condition in the concurrent access to SOPS decrypted secrets in different environments combined with usage of the --auth-provider-cmd flag resulted in authentication failures. Synchronization controls have been introduced to ensure authentication proceeds correctly for each environment independently.
What's Changed
- chore: Backporting #5518 to
v0.99by @yhakbar in #5547 - chore: SOPS decode improvements by @denis256 in #5549
Full Changelog: v0.99.1...v0.99.2
alpha-2026021301
⚠️ Alpha Release
- Release process testing after CICD pipeline updates
What's Changed
- fix: Handle registry timeouts in provider cache server by @yhakbar in #5471
- chore: go bump to 1.25.6 by @denis256 in #5481
- chore: IaC update - Terraform 1.14.4 Opentofu 1.11.4 by @denis256 in #5479
- New ambassador by @karlcarstensen in #5496
- fix: Adding test for
init-from-moduleand improving discoverability by @yhakbar in #5491 - fix: Fixing over-warning on strict controls by @yhakbar in #5501
- fix: Emit output from
run_cmdwhen included by @yhakbar in #5495 - fix: Fixing provider cache server integration with custom registry by @yhakbar in #5500
- fix: Fixing
excludeno_runbehavior by @yhakbar in #5506 - fix: Adding
--report-filesupport to single runs by @yhakbar in #5507 - fix: Removing path manipulation in log messages by @yhakbar in #5489
- Updates the discord link by @karlcarstensen in #5521
- chore: Adding testing for
RelPathForLogby @yhakbar in #5513 - Simple component for pagefind styles by @karlcarstensen in #5523
- Pagefind css by @karlcarstensen in #5524
- chore: dependencies update - otel, aws, go-git by @denis256 in #5533
- chore: removed unused constatns, simplified noRun checking by @denis256 in #5517
- fix: Fixing cache server absolute URLs in self-discovery by @yhakbar in #5519
- fix: SOPS decryption env variables locking by @denis256 in #5522
- fix: Fixing respect for version constraints when running a stack by @yhakbar in #5516
- fix: Fixing signal propagation by @yhakbar in #5518
- fix: Addressing
render --format=jsonby @yhakbar in #5511 - chore: Adding VFS testing by @yhakbar in #5490
- Fix command reference in CLI redesign documentation by @PedroMartinSteenstrup-htg in #5541
- docs: Adding Golang compatibility notes by @yhakbar in #5544
- chore: Bumping Go to
1.26by @yhakbar in #5543 - Remote config parsing improvements by @denis256 in #5540
- fix: Fixing partial parse config cache by @yhakbar in #5538
- fix: Using
SyncWriterto fixTestTerragruntReportWithUnitTimingflakes by @yhakbar in #5494
New Contributors
- @PedroMartinSteenstrup-htg made their first contribution in #5541
Full Changelog: v1.0.0-rc1...alpha-2026021301