chore(deps): update dependency terragrunt to v1.1.4 - #30538
Open
renovate[bot] wants to merge 1 commit into
Open
Conversation
renovate
Bot
force-pushed
the
renovate/terragrunt-1.x
branch
2 times, most recently
from
August 11, 2026 13:31
0358c3e to
f87e577
Compare
renovate
Bot
force-pushed
the
renovate/terragrunt-1.x
branch
2 times, most recently
from
August 18, 2026 15:57
4e4abe8 to
bc87f5e
Compare
renovate
Bot
force-pushed
the
renovate/terragrunt-1.x
branch
2 times, most recently
from
August 25, 2026 18:20
31921b9 to
3006a4f
Compare
renovate
Bot
force-pushed
the
renovate/terragrunt-1.x
branch
2 times, most recently
from
September 1, 2026 10:30
b863bdd to
26339fa
Compare
renovate
Bot
force-pushed
the
renovate/terragrunt-1.x
branch
from
September 1, 2026 18:18
26339fa to
598a4ca
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR contains the following updates:
1.1.1→1.1.41.1.1→1.1.4Warning
Some dependencies could not be looked up. Check the Dependency Dashboard for more information.
Release Notes
gruntwork-io/terragrunt (terragrunt)
v1.1.4Compare Source
✨ New Features
duplicate-dependency-labelsstrict controlDeclaring two
dependencyblocks with the same label in oneterragrunt.hclconfiguration file parsed without error, and then quietly resolved every reference to that label to whichever block came last. The blocks before it were silently overridden:Terragrunt now warns when it finds this. With the new
duplicate-dependency-labelsstrict control enabled, the warning becomes an error naming the address the blocks share:Give each block a label of its own. A configuration that was relying on the shadowing to pick the last block should keep only that block.
scaffoldasks for values interactivelyScaffolding from the command line wrote
# TODOplaceholders for every input and left you to fill them in by hand, while scaffolding the same component from the Catalog TUI opened a form and collected them.terragrunt scaffoldnow opens that same form:For a module or a template it lists the source's variables; for a unit or a stack it lists the
values.*references its configuration makes, which are written toterragrunt.values.hcl. Dismissing the form withescwrites nothing.The form is skipped, and the placeholders written as before, when you pass
--non-interactive, whenstdinis not a terminal, or when the source asks for nothing. A scaffold in a CI job, or one run by another program, therefore behaves exactly as it did.See Scaffold for the full behavior, and the form's keybindings for driving it.
🏎️ Performance Improvements
Faster startup when
--tf-pathis not setWhen you don't set
--tf-path, Terragrunt picks the binary it wraps by looking fortofuon yourPATHand falling back toterraformwhen it isn't there. Terragrunt used to make that choice by runningtofu -version, which meant launching a process at the start of every command, including commands likefindandlistthat never run the binary. That process launch is gone, and aterragrunt --versionbenchmark runs roughly 1.7x faster as a result.This changes what happens when
tofuis on yourPATHbut can't run: Terragrunt now selects it and reports the failure rather than silently falling back toterraform. Set--tf-pathorTG_TF_PATHto pick the binary yourself.🐛 Bug Fixes
Autoinclude dependency overrides no longer evaluate replaced paths
Terragrunt used to evaluate a dependency's original
config_pathbefore applying a sibling autoinclude override. This could prevent a unit from being parsed when the original path referenced a value that the unit no longer supplied, even though the autoinclude replaced that path. Terragrunt now leaves replaced dependency blocks undecoded, then applies the autoinclude override. Dependency blocks without an autoinclude override are still validated.Blocks that use
expansionare still decoded, because a bare autoinclude label does not name their instances. If the autoinclude also declares the same label without expansion, Terragrunt reports a dependency label collision.Fixed Git sources with a
depthquery parameterA
terraform.source(or stack source) URL carrying the go-getterdepthquery parameter, such as...vpc.git?depth=1&ref=v5.21.0, failed to download since v1.1.0, when the CAS became the default path for Git sources. Terragrunt liftedrefout of the URL but leftdepthin place, sogitreceived...vpc.git?depth=1and rejected it as an invalid repository name. A URL withdepthand norefhit the same failure.Terragrunt now strips
depth, with or without aref, before invokinggit, so these sources download again. The clone depth itself always comes from--cas-clone-depth, which defaults to1; adepthon a source URL is never applied for CAS clones.CAS handles local sources that have already been initialized
With CAS enabled, reading a local source that had already been initialized failed and fell back to the slower standard copy. Generating a stack from such a unit logged
CAS processing failed ... source escapes repository root.Provider caching was the cause. Both the Provider Cache Server and the Automatic Provider Cache Dir leave the plugins under
.terraformpointing into a shared cache outside the source. CAS read those links as the source reaching outside itself and refused to copy the link for safety.CAS now leaves
.terraformand.terragrunt-cacheout of local sources, keeping.terraform.lock.hcland everything else. OpenTofu, Terraform, and Terragrunt rebuild both directories on demand, so units and stacks no longer receive a stale copy of either. Runningtofu initin a source directory no longer changes that source's CAS key.Fixed the signal sent to a running command during shutdown
On Windows, when a failure rather than Ctrl+C cancelled a run, Terragrunt crashed with a nil pointer panic instead of stopping the command it had started. It now terminates the command, which is the closest thing Windows offers to an interrupt.
On every platform, when a command exited on its own during the grace period after Ctrl+C, Terragrunt could still send it the signal and then log a forwarding error against a process that was already gone.
terraform_binaryrespected when reading dependency outputsReading a
dependencyblock's outputs ignored theterraform_binaryof the unit being read and fell back to the auto-detected binary, which is OpenTofu whenevertofuis on yourPATH. Withterraform_binary = "terraform", a unit ran through Terraform while the dependency it consumed was read through OpenTofu. Arun --allover units that each worked on their own then failed with a backend initialization error, followed by a misleadingThere is no variable named "dependency".Dependency outputs are now read through the binary the dependency itself configures, so a unit's
terraform_binaryapplies wherever its state is read.--tf-pathandTG_TF_PATHstill take precedence over the config value.Numbers with extreme exponents fail fast instead of stalling
A number literal such as
9E9999999ininputs,locals, or adependencyblock'smock_outputsused to cost over a minute of CPU on a single unit. Written out in decimal that number is ten million digits long, andterragrunt render --format=jsonproduced every digit before failing with a ten megabyte error message.Terragrunt now rejects numbers larger than
1e4096, and non-zero numbers smaller than1e-4096, before it tries to write them out, and names the attribute holding the value:Numbers inside that range are unaffected.
Registry credentials are no longer copied into the generated CLI config
When the Provider Cache Server is enabled, Terragrunt writes a CLI config for OpenTofu/Terraform into each unit's working directory, based on your own CLI config. That generated file used to include a copy of every
credentialsblock from your config, including the ones for registries Terragrunt routes through the cache server.Those copies were never read. For a routed registry, Terragrunt sets the matching
TF_TOKEN_<hostname>environment variable, which takes precedence over acredentialsblock, and the cache server presents your real credentials when it contacts the registry on your behalf. The generated file now leaves the block out for those registries, so your token stays in the CLI config you put it in instead of being duplicated somewhere it had no effect.Credentials for hosts the cache server does not route are unchanged, since OpenTofu/Terraform contacts those directly and still reads them from the generated config.
Upgrading does not rewrite the files an earlier version already generated. Each is named
.terraformrcand sits in a unit's working directory, which is under.terragrunt-cachefor remote sources. Delete those files, or clear the cache, to get the copied credentials off disk.Generated files are readable only by the user who ran Terragrunt
Terragrunt created several files and directories that other users on the same machine could read:
--json-out-dir, and that directory.--out-dir.render --write, which holds the resolved values ofinputs,locals, anddependencyoutputs.Terragrunt now creates those files as
0600and those directories as0700.hcl fmt --stdinhonors--checkand--diffterragrunt hcl fmt --stdinignored--checkand--diff. It printed the reformatted HCL and exited 0 whether or not the input needed formatting.--checknow exits with status code 1 when the input needs formatting, and--diffprints a unified diff labeledold/stdinandnew/stdin. Neither flag prints the formatted content, so getting that content back means running--stdinwithout them.hcl validateno longer crashes on errors that carry no source locationterragrunt hcl validatecrashed while formatting its output when one of the errors it found had no position in the configuration. Terragrunt now prints that error's summary and detail, without a location line.Fixed the deprecated environment variables for
hcl validateTG_HCLVALIDATE_STRICT_VALIDATE, the deprecated name for--strict, also turned on--show-config-path.--strictonly takes effect alongside--inputs, and--show-config-pathcannot be combined with--inputs. With that variable set,terragrunt hcl validate --inputsfailed withspecifying both -show-config-path and -inputs is invalid.TG_HCLVALIDATE_SHOW_CONFIG_PATH, the deprecated name for--show-config-path, was not recognized at all.TG_HCLVALIDATE_STRICT_VALIDATEnow sets only--strict, andTG_HCLVALIDATE_SHOW_CONFIG_PATHsets--show-config-path.TG_STRICT_VALIDATE,TERRAGRUNT_STRICT_VALIDATE, andTERRAGRUNT_HCLVALIDATE_SHOW_CONFIG_PATHare unchanged.Fixed panic on invalid
if_disabledvalue withincludeblockA
generateblock with an invalidif_disabledvalue combined with anincludeblock caused a nil pointer panic instead of a descriptive error. Terragrunt now returns an error naming the generate block and the invalid value, consistent withif_existsvalidation.OCI sources reject Docker-style
:tagsuffixes instead of fetchinglatestAn
oci://source that pinned a version with a Docker-style suffix, likeoci://ghcr.io/acme/modules/vpc:1.0.0, silently ignored the suffix and resolved thelatesttag, so a run could fetch a different module version than the one pinned. Terragrunt now validates the registry and repository the same way OpenTofu does and rejects such sources with an error that shows the source rewritten in the supported?tag=/?digest=form, for exampleoci://ghcr.io/acme/modules/vpc?tag=1.0.0. Repository names that violate the OCI reference grammar are also rejected before any registry is contacted.Prompts accept a piped answer that has no trailing newline
Piping an answer to a confirmation prompt, as in
printf yes | terragrunt run --all destroy, failed with anEOFerror because Terragrunt discarded a final answer that ended without a newline. Terragrunt now reads that final answer, and only a prompt that gets no input at all reportsEOF.Provider cache supports signed provider download URLs
When a provider mirror returned a signed download URL, the Provider Cache Server used the entire URL, including its query string, as the archive filename. Long authentication parameters could exceed filesystem filename limits and fail with
file name too long.Terragrunt now derives the archive filename only from the URL path while preserving the query string when downloading it. Signed provider URLs, including archives in nested object paths and relative mirror URLs, now download and cache correctly.
findandlistreject a--queue-construct-asvalue that holds no commandA value made only of shell punctuation, such as
terragrunt find --queue-construct-as=';', ended the run with a crash report. A value that quotes an empty command, such as--queue-construct-as='""', was accepted even though it names no command.findandlistnow exit with an error that repeats the value you passed and shows what--queue-construct-asexpects instead.render --writepicks a default filename without a format flagterragrunt render --writefailed withis a directoryunless it was paired with--formator--json. Only those flags set the default filename, so a bare--writehad no output path and Terragrunt tried to write to the unit directory itself.The default now follows the format in use.
terragrunt render --writewritesterragrunt.rendered.hclnext to the unit configuration, and--jsonor--format=jsonwritesterragrunt.rendered.json. An explicit--outstill takes precedence.sops_decrypt_filenow uses the credentials your auth provider suppliesWhen a run obtained credentials from
--auth-provider-cmd,sops_decrypt_fileignored them for any variable already set in the environment Terragrunt started with. The rest of the run honored the auth provider, and correctly overrode any ambient environment variables. OpenTofu/Terraform received those credentials, and so did the AWS calls Terragrunt makes on a unit's behalf, such asget_aws_account_id.Decryption now runs as the identity Terragrunt resolved for the unit, the same one the rest of the run uses, regardless of ambient environment variables.
info strict list <name>now honors--allPassing a control name to
info strict listshows that control's subcontrols. Unlike the top-level listing, it ignored the--allflag and always included completed subcontrols.Terragrunt now applies the same rule when you name a control.
String inputs reach modules with
${...}intactPassing a string input that contains
${...}to a variable declared with a type other thanstringused to fail withVariables not allowed, because OpenTofu/Terraform parse those values as HCL expressions and read${...}as an interpolation. Reading a JSON or YAML file into an input hit this whenever the file happened to contain that sequence:Terragrunt now escapes interpolation sequences in string inputs when the module declares the variable with a type that makes the value parse as HCL, so
${...}arrives as literal text instead of failing the run. Variables declared asstring, and variables declared with no type at all, are read verbatim by OpenTofu/Terraform, and their values are still passed through untouched.🧪 Experiments Updated
Read dependency outputs directly from Azure state
The
dependency-fetch-output-from-stateexperiment can now read dependency outputs directly from Azure Storage (azurerm) state, in addition to S3. This avoids initializing the dependency and runningtofu outputorterraform output.Azure direct reads require the
azure-backendexperiment as well. Unsupported configurations requiring native-only authentication, endpoint, timeout, or customer-provided-key behavior continue to use the native output path.When a dependency has no state yet, Terragrunt uses that dependency block's
mock_outputs, as it already does for S3. When Azure direct reads resolve a storage account key through Azure Resource Manager, which is the case unlessaccess_key,sas_token, oruse_azuread_authis set, aresource_group_name,storage_account_name, orsubscription_idnaming a resource that does not exist fails with an error naming those keys rather than substituting mock outputs.Read dependency outputs directly from GCS state
The
dependency-fetch-output-from-stateexperiment can now read dependency outputs directly from GCS state, in addition to S3. This avoids initializing the dependency and runningtofu outputorterraform output.Unsupported GCS configurations continue to use the native output path. When a dependency has no state yet, Terragrunt uses that dependency block's
mock_outputs, as it already does for S3.Thanks to @joshmyers for the original GCS implementation.
renderpreviews what an expandeddependencyblock expanded toWith the
block-iterationexperiment enabled, adependencyblock that carries anexpansionblock now renders as it was written, followed by the elements it expanded into, commented out and with their bodies resolved:The elements are comments because they aren't valid Terragrunt HCL configurations (you are not allowed to use the same dependency label twice in Terragrunt configurations), the previews are there to help you understand how expansion will resolve.
⚙️ Process Updates
Go bumped to
v1.27The version of Golang used to compile the Terragrunt binary has been updated from
v1.26.6tov1.27.0.If you build Terragrunt from source, or import it as a Go module, you now need a Go 1.27 toolchain.
OpenTelemetry SDK updated to
v1.45.0Terragrunt's OpenTelemetry tracing and metrics dependencies have been updated from
v1.44.0tov1.45.0. The logging packages and exporters have also been updated to their compatible releases, and Terragrunt now uses thev1.43.0semantic conventions.Telemetry behavior is unchanged.
Pull Requests
✨ Features
enabledto unit and stack blocks by @yhakbar in #6714stack outputaddresses by iteration key by @yhakbar in #6715🐛 Bug Fixes
depthquery parameter before invoking git by @HalisCz in #6513--queue-construct-asresulting in empty tokenization by @yhakbar in #6720render --writewhen no--formatis supplied by @yhakbar in #6724RangeandSnippetinSourceSnippetsby @yhakbar in #6731info strict listwithout--allby @yhakbar in #6725TG_HCLVALIDATE_STRICT_VALIDATEenv var by @yhakbar in #6730hcl fmtwith--stdincombined with--checkand/or--diffby @yhakbar in #6726ToSlashto hande old/new prefix appropriately by @yhakbar in #6744run --allusage by @yhakbar in #6753render --writefile permissions by @yhakbar in #6756🏎️ Performance
--tf-pathresolution by @yhakbar in #6651📖 Documentation
✅ Tests
🤖 CI
🧹 Chores
TestCatalogWithLocalDefaultTemplateby @yhakbar in #6700TestNewSignalsForwarderMultipleUnixto actually check for the signal by @yhakbar in #6701TestPartialEval_DeeplyNestedExpressionReturnsTypedErrorby @yhakbar in #6702TestDiscovery_GraphConcurrentConfigAccessWithRacingin-memory by @yhakbar in #6703TestDependencyOutputSkipDependencyOutputsFlagfixtures by @yhakbar in #6740TestNewSignalsForwarderMultipleUnixby @yhakbar in #6750go fix ./...by @yhakbar in #6758v1.1.3Compare Source
🐛 Bug Fixes
Fixed
Unsupported attributeerrors forvalues.*inputs thatautoincludeoverridesA unit input referencing a
values.*key that the unit's values file doesn't define no longer fails withUnsupported attributewhen anautoincludeblock supplies that input. The autoinclude value is applied as intended.Fixed
overwrite_terragruntandremove_terragrunton files with no trailing newlinegenerateblocks usingif_exists = "overwrite_terragrunt"orif_disabled = "remove_terragrunt"failed to properly handle existing files when the file at the target path had no newline after its first line, empty files included.Terragrunt now properly handles files like this, so a file carrying the Terragrunt signature is overwritten or removed as configured, and a file without it produces the usual error naming the path Terragrunt would not touch.
Dependency
mock_outputsapply when the state bucket doesn't exist yetWhen reading a dependency's outputs directly from remote state (
--dependency-fetch-output-from-state), Terragrunt fell back tomock_outputsonly when the state object was missing, not when the S3 bucket itself didn't exist. Adependencyon an environment that hadn't been bootstrapped yet would fail instead of using its mocks.A missing bucket is now treated the same as a missing state object, so commands like
planandvalidatecan resolve mocks before the dependency's backend has been created.Source permissions preserved on hidden directories copied by
include_in_copyWith the
fast-copystrict control enabled, a hidden directory that Terragrunt copied due toinclude_in_copymatching something within it took the permissions of the first file generated within it, instead of the permissions it had in the source.Those directories now keep their source permissions, matching the copy Terragrunt performs with the control disabled.
Applied the positive half of a filter that begins with a negation
When a
--filterquery began with a negation, Terragrunt treated the whole query as an exclusion. The expressions chained after the negation stopped restricting the selection and only narrowed what got subtracted, so components matching none of them came back in the results. Those expressions are now applied.$ terragrunt list --filter '!name=foo | name=bar' bar baz foo$ terragrunt list --filter '!name=foo | name=bar' barThis follows the left-to-right refinement that
|has everywhere else: each expression narrows what the one before it selected. A query is only treated as an exclusion when every one of its expressions is negated, such as'!name=foo'or'!name=foo | !name=bar'.See Combining Expressions for how negation, intersection and union interact.
Fixed a race condition that left cached provider archives in the working directory
With the provider cache server enabled via
--provider-cache, a race let the server start responding to requests before it had finished preparing the directories it caches into. A provider requested in that window had its archive and lock file written relative to the working directory instead of into the cache, leaving zip files behind in your project.That race condition has been fixed. Providers now always download into the cache directory.
Fixed a race condition between concurrent Terragrunt runs downloading providers
A race condition in the logic used to synchronize provider downloads meant that two Terragrunt runs on the same machine could interfere with each other while caching the same provider. Each run staged its downloads at the same path, so a run that finished first could delete an archive another run was still unpacking, failing that run with
failed to open zip archive.That race condition is now fixed. Two runs can cache the same provider at the same time.
Fixed space-delimited flag values in
providers lockThe space-delimited form,
providers lock -platform linux_amd64, now reaches OpenTofu and Terraform intact. Previously it was the attached form,-platform=linux_amd64, that worked: given the value as a separate argument, Terragrunt moved it to the end of the command, where it was read as a provider address and the run failed withInvalid provider type "linux_amd64".-fs-mirrorand-net-mirrorwere moved the same way, and now keep their values too.With
--provider-cacheenabled, platforms are also split correctly across the per-platformproviders lockruns used to warm the cache.Fixed
scaffoldon units and stacksterragrunt scaffoldread every source as an OpenTofu/Terraform module. Given a unit or a stack, which are Terragrunt configurations rather than OpenTofu/Terraform modules, it exited successfully having written an invalidterragrunt.hclfile.Units and stacks are now scaffolded the way the Catalog TUI scaffolds them: their files are copied into the working directory for you to edit in place, along with a
terragrunt.values.hcllisting everyvalues.*reference the configuration makes.terragrunt scaffold 'github.com/gruntwork-io/terragrunt-scale-catalog//units/aws/oidc/iam-oidc-role'Copying refuses to overwrite: a file that would land on an existing path stops the command before anything is written. Modules and templates are unaffected and are still scaffolded from their variables.
See Scaffold for what gets copied and how the values file is filled in.
Answered every prompt when input is piped in
A run that asks for confirmation more than once, such as
terragrunt backend deleteprompting for both the lock table entry and the state object, used to read only the first answer when the answers were piped in rather than typed. The remaining answers were discarded while reading ahead, and the next prompt failed with an end-of-input error. Every prompt in a run now reads from the same input, so pipingyesfor each one works.Stack dependencies honor
mock_outputswith--dependency-fetch-output-from-stateA
dependencyblock that reads outputs from a stack (itsconfig_pathpoints at aterragrunt.stack.hcldirectory) used to fail when a unit in that stack had no state yet, even when the dependency declaredmock_outputs. This blocked commands likeplanandvalidateagainst a stack that hadn't been applied.Such a dependency now falls back to
mock_outputsfor the units that have no state yet. In a partially applied stack, applied units resolve to their real outputs while the rest use their mocks.Mocks for a stack dependency are keyed by unit name, so
mock_outputshas to be a map or object. Declaring it as any other type now reports that directly, instead of leaving the units it can't cover out of the stack outputs.Fixed
--config=being ignored by thetflinthookThe built-in
tflinthook reads the configuration file out of the arguments you give it, then uses that path fortflint initand for the lint run. It only recognized the space-separated--config <path>spelling, so a hook written as:was treated as though no configuration file had been named at all. Terragrunt searched the unit directory and its parents for a
.tflint.hclfile instead, and either failed with a config-not-found error or rantflint initagainst whatever unrelated configuration the search turned up. Terragrunt now recognizes--config <path>,--config=<path>,-c <path>, and-c=<path>.The hook also builds
--vararguments from the unit'sinputsand fromTF_VAR_entries inextra_argumentsblocks. Those arguments came out in a different order on every run, which made the logged command line, and anything comparing it between runs, needlessly unstable. They are now ordered by variable name.🧪 Experiments Added
block-iterationexperiment reserves theexpansionblockThe
block-iterationexperiment has been added as the gate for iterating adependency,unit, orstackblock over acountorfor_each, declared through a nestedexpansionblock, along with anenabledattribute onunitandstackblocks.In this release the flag is reserved only, and enabling it has no behavioral effect. Writing an
expansionblock without the experiment now reports an error naming the flag, rather than leaving the block to be silently discarded:Track progress and share feedback in #4504.
bounded-discovery— Added a directory boundary for graph traversalFilter expressions that traverse the dependency graph reach beyond the working directory: dependents (
--filter '...{unit}') by walking up to the Git repository root, dependencies (--filter '{unit}...') by following declared paths. Either way, Terragrunt reads and parses every configuration it touches. In monorepos with isolated environments, that traversal can fail or do wasted work reading sibling environments.Enable the new
bounded-discoveryexperiment to set a boundary for that traversal. The--discovery-boundaryflag (env:TG_DISCOVERY_BOUNDARY) replaces the Git repository root as the enclosure for a whole run:The experiment also unlocks an inline
(dir)boundary operand, which bounds a single expression and overrides the flag. It occupies the same slot as a traversal depth, so it bounds discovery by location the way a number bounds it by graph hops:Any configuration that resolves outside the boundary, whether a dependent or a dependency, is not read, parsed, or returned:
finddoes not list it andrun --alldoes not run it. Configurations inside the boundary are discovered as usual.The boundary must be an existing directory, and relative paths are resolved against the working directory. Dependent traversal searches upward from the working directory, so filters that use it also need the boundary to be the working directory or one of its parents. Dependency traversal follows declared paths from the units a filter matched, so dependency-only filters accept any directory, including one below the working directory:
Reserving
(and)for the boundary operand changes how--filterreads those characters everywhere, not only when the experiment is enabled. An expression such as--filter '1...(foo | bar)'previously matched a unit literally named(fooorbar); it is now rejected as a malformed boundary. Wrap a name or path containing parentheses in braces (e.g.--filter '{./weird(name)}') to keep it literal.browse-tui— Added an interactive browser for your estateThe new
browse-tuiexperiment adds theterragrunt browsecommand. With the experiment enabled,terragrunt browseopens a three-column Terminal User Interface (TUI) browser of your infrastructure estate: the parent directory on the left, the current directory in the middle, and a detail pane on the right showing metadata for the highlighted unit, stack, or directory. The browser opens immediately and fills in metadata as discovery completes in the background.Enable it with
--experiment browse-tuiorTG_EXPERIMENT=browse-tui. See the experiment documentation for the keybindings, search, and the criteria for stabilization.mutable-generate— Deduplicatedgenerateblock outputThe
mutable-generateexperiment has been added. With it enabled, the contents agenerateblock produces are stored in the Content Addressable Store (CAS), and the file written atpathis a read-only link to that stored copy rather than a file of its own.Since the stored copy is addressed by the hash of its contents, anything generating identical contents links to the same copy. A
generateblock inherited by several hundred units therefore costs one copy in.terragrunt-cacherather than several hundred.The link is read-only because that copy is shared. Where a generated file does need to be edited in place, a new
mutableattribute on thegenerateblock gives it a writable file of its own:Setting
mutablewithout the experiment enabled is an error, since earlier Terragrunt versions reject the attribute. The CAS is required, so--no-caswrites generated files directly andmutablehas no effect.For details, see the experiment documentation.
optional-dependency-outputs— Added--no-dependency-outputsflag to skip dependency output resolutionAdded a
--no-dependency-outputsflag that skips all dependency output resolution globally, mirroring the existingskip_outputs = trueattribute on individualdependencyblocks.The feature is gated behind the
optional-dependency-outputsexperiment:Using
--no-dependency-outputswithout enabling theoptional-dependency-outputsexperiment will return an error.Thanks to @pjrm for contributing this feature!
🧪 Experiments Updated
catalog-format— Added reading the catalog as JSON LinesThe
catalogcommand draws a terminal user interface, and refuses to start where there is no terminal to draw it on. With thecatalog-formatexperiment enabled,--format=jsonlwrites the same discovery to standard output instead, as one JSON object per line:Entries are written as they are discovered rather than collected first, so output is readable while the remaining repositories are still loading, and a reader that stops early ends the command quietly:
terragrunt catalog --experiment=catalog-format --format=jsonl | head -5Entries appear in discovery order, which interleaves the repositories being loaded and differs between runs. Every entry carries the complete body of the component's README in the
docfield. Combine usage of Terragrunt with other tools likejqto drop it.Entries follow a published JSON schema. For the fields and their meanings, see Non-interactive catalog.
--format=tuiis the default, and leaves the terminal user interface exactly as it was.catalog-format— Added reading the catalog as MarkdownThe
catalog-formatexperiment gains a second non-interactive format. Where--format=jsonlwrites a record per catalog entry for a program to parse,--format=mdwrites one Markdown document for a person or an agent to read:terragrunt catalog --experiment=catalog-format --format=md > catalog.mdEach entry becomes a section holding the metadata the catalog user interface shows for it, the source the component is scaffolded from, and the component's README. Sections are written as entries are discovered, so the document is readable while the remaining repositories are still loading.
READMEs are reproduced inside fenced blocks, so the headings one carries are not read as sections of the catalog document. The document closes with a table naming every component it holds and a count of what was discovered, which is how a reader tells a complete document from one that was cut short by a consumer that stopped reading.
For the fields each section carries, see Non-interactive catalog.
oci— Added OCI sources for stack units and stacksterragrunt.stack.hclnow acceptsoci://sources inunitandstackblocks, so a stack can pull its components straight from an OCI registry. Without theociexperiment enabled, such a source fails with a clear error instead of an unsupported-scheme failure.oci— Added OpenTofu CLI-config credentials for OCI module sourcesoci://module downloads now read OpenTofu's CLI-config credentials, so one configuration serves both OpenTofu and Terragrunt.Terragrunt honors the
oci_credentials "<registry>[/<repo-prefix>]"blocks (username and password, OAuth tokens, or adocker_credentials_helper, which liketofumay only be set on a whole registry) and theoci_default_credentialsfallback helper. ATF_CLI_CONFIG_FILEorTERRAFORM_CONFIGvalue selects the config file outright; otherwise Terragrunt reads the first of~/.tofurcand~/.terraformrcthat exists, and merges the*.tfrcand*.tfrc.jsonfiles in OpenTofu's config directory.Terragrunt picks the most specific matching source across CLI config and ambient Docker config; an explicit CLI-config entry wins when both match equally. Set
discover_ambient_credentials = falsein theoci_default_credentialsblock to use CLI config only.⚙️ Process Updates
Go bumped to
v1.26.5The version of Golang used to compile the Terragrunt binary has been updated from
v1.26.0tov1.26.5.Thanks to @apoiget for contributing this upgrade!
Pull Requests
✨ Features
()syntax by @yhakbar in #6365--discovery-boundaryflag by @yhakbar in #6355browseby @yhakbar in #6219mutableattribute to thegenerateblock by @yhakbar in #6563mdformat forcatalogby @yhakbar in #6608🐛 Bug Fixes
EOFingenerateblocks by @yhakbar in #6592--config=form of flags used in the tflint hook by @yhakbar in #6591Configuration
📅 Schedule: (UTC)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about these updates again.
This PR was generated by Mend Renovate. View the repository job log.