Update dependency terragrunt to v1.1.4 - #2470
Merged
Merged
Conversation
devex-sa
force-pushed
the
feature/renovate/terragrunt-1.x
branch
from
September 9, 2026 07:38
fe4fb59 to
159bcab
Compare
andreasfrisch
approved these changes
Sep 9, 2026
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.3→1.1.4Release 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 #6758Configuration
📅 Schedule: (UTC)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR has been generated by Renovate Bot.