v1.2.0-rc1 #7020
yhakbar
announced in
Pre-release Feedback
v1.2.0-rc1
#7020
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
🎉 v1.2.0 Release Candidate
This is the first release candidate for Terragrunt v1.2.
This release completes the following experiments:
block-iterationocibounded-discoverycatalog-formatmutable-generateoptional-dependency-outputsoptional-hooksazure-backendversion-attributeprofilingdependency-fetch-output-from-stateFuture release candidates for v1.2.0 will include bug fixes related to these experiments or other urgent bug fixes as necessary, and documentation improvements.
Please try out this release candidate in lower environments and share your feedback in the Associated GitHub discussion.
🛠️ Breaking Changes
base64gzip()uses the Go 1.27 encoderGo 1.27 changed the compressed output of its gzip encoder. Terragrunt v1.1.5 kept
base64gzip()on the older output and warned once per run that this was legacy behavior.base64gzip()now returns what the Go 1.27 encoder produces.A resource that compares the encoded value can plan a replacement on the first run after upgrading. An
aws_instancewithuser_data_base64set frombase64gzip()anduser_data_replace_on_changeset totrueis one such resource.Where the encoded value has to stay stable, call the experimental
base64gzip_compat(), which returns the v1.1.3 output permanently. It is behind thebase64gzip-compatexperiment and may be renamed or removed:This completes the
legacy-base64gzipstrict control.Note
Within the 1.0 guarantees
The 1.0 guarantees make promises about how Terragrunt remains backwards compatible. This change does not break those promises. It is listed under breaking changes so you are aware of it, in case it affects your workflows.
base64gzip()still takes a string and returns valid gzipped base64 content that decompresses to the same value, but the encoded value itself changes.base64gzip_compat()keeps the old one.S3 state buckets no longer get the
RootAccessbucket policy statementWhen bootstrapping an S3 state bucket, Terragrunt attached a bucket policy statement with the
SidRootAccessthat granteds3:*on the bucket and its objects toarn:aws:iam::<account-id>:root, an ARN that grants access to the AWS account as a whole rather than only to its root user. That statement has been removed. It widened reach to state files that routinely hold secrets, and the account already owns the bucket.The
skip_bucket_root_accessconfig no longer has anything to skip, and is now deprecated. Terragrunt still accepts it, and warns about it when bootstrapping a backend whose config sets it. Enable theskip-bucket-root-accessstrict control to turn that warning into an error.To grant the AWS account root user access to the state bucket, set the new
enable_bucket_root_accessconfig:Buckets that already have the statement keep it. The state backend docs cover how to remove it yourself.
Note
Within the 1.0 guarantees
The 1.0 guarantees make promises about how Terragrunt remains backwards compatible. This change does not break those promises. It is listed under breaking changes so you are aware of it, in case it affects your workflows.
The bucket policy Terragrunt writes is not part of the CLI, HCL, or output schemas the guarantees pin, and
skip_bucket_root_accessremains valid configuration. Removing the statement is a bug fix, andenable_bucket_root_accessrestores it. See Bugs in the guarantees for how a bug fix in 1.x can change your workflows.✨ New Features
Non-interactive
terragrunt catalogoutput with--formatThe catalog TUI needs a terminal. The
--formatflag (env:TG_FORMAT) writes what the catalog discovers to standard output, so a script or an agent can read the catalog without one.--format=jsonlwrites one JSON object per catalog entry, following a published JSON schema:--format=mdwrites a Markdown document with a section per entry:terragrunt catalog --format=md > catalog.mdWithout
--format,terragrunt catalogopens the TUI only when standard input and standard output are both terminals. Anywhere else it writesjsonl, so piping the command needs no flag:Terragrunt writes each entry as it discovers it. See Non-interactive catalog for the structure of each format and how streaming behaves.
Previously gated behind the
catalog-formatexperiment, non-interactive catalog output no longer requires--experiment catalog-format.Collect runtime profiles
Terragrunt writes CPU, heap, and goroutine profiles on request, so you can see where a slow run spends its time. Pass
--profile-cpu,--profile-memor--profile-goroutinewith a path, or--profile-dirto collect all three into one directory under conventional names. Each flag has a matchingTG_PROFILE_*environment variable.Read the result with
go tool pprof. The profiles cover Terragrunt itself, not the OpenTofu/Terraform processes it runs.Previously gated behind the
profilingexperiment, the profile flags no longer require--experiment profiling.Bound discovery with
--discovery-boundaryand(dir)filtersGraph filters search up to the Git repository root for dependents and follow dependencies wherever they point, so in a monorepo they can parse sibling environments a command never needed.
A
(dir)operand in a graph filter stops traversal at that directory:From the same directory, the
--discovery-boundaryflag (env:TG_DISCOVERY_BOUNDARY) applies one boundary to every--filterexpression on the command:Previously gated behind the
bounded-discoveryexperiment, bounded discovery no longer requires--experiment bounded-discovery.Terragrunt docs MCP server
Terragrunt now publishes the read-only Terragrunt docs MCP server, which answers Terragrunt questions from the official docs, the CLI reference, a curated design-pattern library, and real example config. The server is public and unauthenticated. Results are pinned to a Terragrunt version, and docs pages can be read at any release tag from v0.80 onward.
For Claude Code:
Cursor and other MCP clients that read an
mcp.jsonpoint athttps://mcp.docs.terragrunt.com/mcpinstead.The server is in public beta. It has no availability guarantee and may change significantly.
See the install docs for the full setup.
Download modules from OCI registries
An
oci://source downloads a module from an OCI Distribution registry, such as Amazon ECR, GitHub Container Registry, Azure Container Registry, Google Artifact Registry, or a self-hosted one. It works in aterraformblock:And in the
unitandstackblocks of aterragrunt.stack.hcl:Pin the artifact with
tagordigest. Setting neither selects thelatesttag, and a//subdirselector reaches a directory inside the module, unit, or stack. Credentials come from OpenTofu's CLI config, from ambient Docker config, and from credential helpers such asecr-login, so one source string resolves the same way under bothtofuand Terragrunt.Previously gated behind the
ociexperiment, these sources no longer require--experiment oci. See OCI registries for the publishing contract and the full authentication order.Track the files that OpenTofu file functions read
Terragrunt records the files that the built-in file functions read, so reading-based filters select the units that read them without a
mark_as_readcall:filetemplatefilefilesetfileexistsfile*hash functions, such asfilesha256A file read from inside a template counts too.
mark_as_readremains the way to record a file that only OpenTofu/Terraform reads, such as one passed to a module as an input, or one arun_cmdscript reads.Generated files stored in the CAS
The Content Addressable Store (CAS) now stores the files that
generateblocks produce. Each unit's working directory gets a hard link to the stored copy, so every unit that includes this block shares oneprovider.tfon disk:Generated files are read-only by default, so an existing hook or script that edits a generated file in place fails with a permission error. Set
mutable = trueon thatgenerateblock to give each unit a writable file of its own:Passing
--no-casturns off the CAS for a run, and Terragrunt writes generated files as plain files:See Generate blocks and Immutable by default for details.
Previously gated behind the
mutable-generateexperiment, CAS storage for generated files no longer requires--experiment mutable-generate.Iterate
unit,stack, anddependencyblocks withexpansionAn
expansionblock declares acountor afor_each, and Terragrunt reads the block it sits in once per element. Thisunitblock generates two units, at.terragrunt-stack/aurora/weband.terragrunt-stack/aurora/api:A
stackblock expands the same way, generating one stack per element.An expanded
dependencyblock produces one dependency per element, andinputsreads each one by its key:unitandstackblocks also accept anenabledattribute. Setting it tofalseskips the component during stack generation:Adding an
expansionblock to an existing block, or shrinking one, changes the addresses of the components it produces. Read theexpansionreference before changing one that has already been applied.Previously gated behind the
block-iterationexperiment,expansionblocks and theenabledattribute no longer require--experiment block-iteration.Bootstrap, delete, and migrate Azure Storage state backends
Terragrunt provisions the resource group, storage account, and blob container backing an
azurermstate, and converges blob versioning and soft delete on both new and pre-existing accounts. It also deletes state blobs and containers, and migrates state within a storage account. Dependency outputs of Azure-backed units are read straight from the state blob, the same as S3 and GCS.If you already pass
--backend-bootstrap, Terragrunt now creates Azure resources it skipped before.Previously gated behind the
azure-backendexperiment, these operations no longer require--experiment azure-backend. See State Backend for configuration keys and authentication.Set the minimum TLS version on a bootstrapped Azure storage account
The ARM API treats an unset minimum TLS version as
TLS1_0, but Azure deprecatedTLS1_0andTLS1_1in August 2025.Terragrunt now provisions a new storage account with a minimum TLS version of
TLS1_2. Theminimum_tls_versionoption raises it toTLS1_3:TLS1_2andTLS1_3are the only accepted values. Terragrunt rejects the deprecatedTLS1_0andTLS1_1.The setting applies only when Terragrunt creates the account. Terragrunt leaves an existing account's setting alone, so change it there with the Azure portal or CLI.
Call OpenTofu 1.13 built-in functions in Terragrunt configurations
Terragrunt evaluates the built-in functions in configurations using its own copy of the OpenTofu implementations, which tracks OpenTofu 1.13.
These functions are now available:
assumeequalassumelistlengthassumelistlengthmaxassumelistlengthminassumemaplengthassumemaplengthmaxassumemaplengthminassumenotnullassumesetlengthassumesetlengthmaxassumesetlengthminassumestringprefixbase64gunzipcidrcontainsephemeralasnullissensitivetemplatestringurldecodeRead dependency outputs from state by default
Terragrunt reads dependency outputs straight from the remote state object, without initializing each dependency to run
tofu outputorterraform outputagainst it. This covers the S3, GCS, and Azure Storage (azurerm) backends.When a direct read is unsupported, such as for a backend Terragrunt has no reader for, or fails on a permissions or network error, Terragrunt falls back to
tofu/terraform output -json. The outputs are the same either way, so only the speedup is lost.Pass
--no-dependency-fetch-output-from-state(env:TG_NO_DEPENDENCY_FETCH_OUTPUT_FROM_STATE) to always load dependency outputs throughtofu/terraform output -json.Previously gated behind the
dependency-fetch-output-from-stateexperiment, direct state reads no longer require--experiment dependency-fetch-output-from-state. Passing--dependency-fetch-output-from-statestill works, and thedependency-fetch-output-from-statestrict control turns its deprecation warning into an error.Version constraints for registry modules
The
terraformblock accepts aversionattribute holding a version constraint for atfr://registry module. Terragrunt downloads the highest published version that satisfies the constraint, using the same syntax as theversionargument on OpenTofu and Terraformmoduleblocks:See the
terraformblock reference for the full rules.Previously gated behind the
version-attributeexperiment, version constraints for registry modules no longer require--experiment version-attribute.S3 buckets can be created in your account regional namespace
An account regional namespace is a reserved subdivision of the S3 bucket namespace that only your account can create buckets in, so no one else can take or re-create those names. Bucket names in it end with your account ID, the region, and
-an.When a bucket name matches that convention, Terragrunt creates the bucket in the account regional namespace:
There is no setting to enable this. S3 accepts the
-ansuffix only for account regional buckets, so the name alone decides.accesslogging_bucket_nameis read the same way. Buckets named any other way are created in the global namespace, and the namespace is left out of the request entirely, so S3-compatible object stores are unaffected.A name that fits the convention but names a region other than the bucket's own fails immediately.
Skip dependency outputs with
--no-dependency-outputsThe
--no-dependency-outputsflag (env:TG_NO_DEPENDENCY_OUTPUTS) skips output resolution for everydependencyblock in a run, so Terragrunt does not calltofu outputon dependencies that may not be applied yet:Warning
Use this flag with commands that do not read dependency outputs, such as
initandvalidate. While it is set, references to dependency outputs get no real value, soplanandapplycan pass empty values to OpenTofu/Terraform in their place.Previously gated behind the
optional-dependency-outputsexperiment, the flag no longer requires--experiment optional-dependency-outputs.Skip hooks for a run with
--no-hooksThe
--no-hooksflag (env:TG_NO_HOOKS) skips every hook for a run:before_hook,after_hook, anderror_hookblocks.Previously gated behind the
optional-hooksexperiment,--no-hooksno longer requires--experiment optional-hooks.🐛 Bug Fixes
S3 access log delivery is granted with a bucket policy
S3 disables ACLs on new buckets by default, and a bucket with ACLs disabled rejects the ACL grant Terragrunt wrote to make an access logging bucket accept logs. AWS recommends a bucket policy over an ACL for this grant, and recommends keeping ACLs disabled in general.
Terragrunt now creates buckets with ACLs disabled and grants access log delivery through the logging bucket's policy instead, allowing
s3:PutObjectfor thelogging.s3.amazonaws.comservice principal on behalf of buckets in the same AWS account:This only applies to a logging bucket Terragrunt creates. One that already exists keeps the permissions it has, whether that is the ACL grant from an earlier Terragrunt version or something you set up yourself, and Terragrunt neither reads nor writes its policy.
skip_accesslogging_bucket_policyopts out of that grant.skip_accesslogging_bucket_aclis deprecated and now has no effect: Terragrunt puts no ACL on the logging bucket, so there is nothing left for it to skip.If you set
skip_accesslogging_bucket_aclto work around anAccessControlListNotSupportedfailure on a bucket with ACLs disabled, drop it. The bucket policy covers that bucket, and the attribute now suppresses nothing. Setskip_accesslogging_bucket_policyonly if you grant log delivery yourself. Terragrunt warns when the deprecated attribute is used, and theskip-accesslogging-bucket-aclstrict control turns that warning into an error.expansionworks withautoincludeand stack dependenciesterragrunt stack generatefailed withThere is no variable named "each"when aunitorstackblock declared both anexpansionblock and anautoincludeblock. The error pointed ateach.keyinpath, even whenautoincludenever referencedeach.Generation now writes an autoinclude file for each element, and
each.key,each.value, andcount.indexinsideautoincluderesolve to that element:The
prodelement gets thisterragrunt.autoinclude.hcl:A
dependencyblock insideautoincludethat declared its ownexpansionblock failed generation with the same error. A unit whoseterragrunt.autoinclude.hclcontained one also failed to parse. An expanded unit could not be referenced from the stack file at all, sinceunit.<name>.pathskipped it.Each element of an expanded unit or stack is now referenced as
unit.<name>[key].path. The generateddependencyblock keeps itsexpansionblock. Generation evaluatesfor_eachorcountin the stack file, wherelocal.*andvalues.*are available, writes the result as a literal, and resolvesconfig_pathfor each element. The generated unit expands the dependency when it is parsed:A stack file that declares the same
unitorstacklabel both with and without anexpansionnow fails to parse, becauseunit.<name>cannot refer to both.Discovery failed the same way on a
dependencywhoseconfig_pathpointed at a stack directory containing an expanded unit. It dropped the dependency instead of reporting the error, sorun --alldid not wait for the units in that stack. The dependency now covers every element of the expanded unit.Malformed
{}groups in glob patterns no longer crash TerragruntSome glob patterns with an empty or unclosed
{}group crashed Terragrunt when it matched them, e.g.terragrunt find --filter '{./a{}'. Others silently failed to match, so{}adid not matcha.Terragrunt now refuses these patterns with an invalid pattern error. This covers filter queries,
include_in_copyandexclude_from_copyin theterraformblock, and.terragrunt-catalog-ignorefiles. A group with one empty option next to a non-empty one, such asmain.tf{,.bak}, still works.hcl validate --inputsreads-varand-var-filearguments verbatimhcl validate --inputsapplied shell quoting rules to each entry inextra_argumentsbefore reading-varand-var-filefrom it. Those rules treat a backslash as an escape character, so on Windows a var file path such as"-var-file=${get_terragrunt_dir()}\\varfiles\\main.tfvars"lost its separators, and validation failed to open the file.Terragrunt now reads each entry in
argumentsexactly as written, as the single argument it becomes on the OpenTofu/Terraform command line.Units with identical configs each resolve their own
iam_roleWhen two units had the same
terragrunt.hclcontent, Terragrunt could assume the first unit's IAM role for both. This hit anyiam_rolethat depends on the unit's directory, such as:With this config in
a/andb/,bassumedrole/ainstead ofrole/b. Terragrunt now evaluatesiam_rolein each unit's own directory, soget_terragrunt_dir(),find_in_parent_folders(), and similar functions return that unit's paths.terragrunt info print --allwrites JSON Lines and reports each unit's own download directoryinfo print --allwrote each unit's info indented over several lines, one object after another, and gave every unit the root'sdownload_dir:$ terragrunt info print --all { "config_path": "/example/live/db/terragrunt.hcl", "download_dir": "/example/live/.terragrunt-cache", "iam_role": "", "terraform_binary": "tofu", "terraform_command": "print", "working_dir": "/example/live/.terragrunt-cache/EfNrjc2equLKYmOZbwT2qu1dO9c/ByrgT1vMBQjFneXYgAxchposVZ0" } { "config_path": "/example/live/vpc/terragrunt.hcl", "download_dir": "/example/live/.terragrunt-cache", ... }A line-oriented reader could not take one entry at a time:
The
download_dirwas wrong as well.run --allcreates each unit's.terragrunt-cachenext to that unit's configuration, so the directory reported here was not the one the unit runs against.With
--all, Terragrunt now writes one object per line, so the output is JSON Lines, and builds each unit's context the wayrun --alldoes:Printing a single unit is unchanged: one indented object.
Malformed
excludeblocks report an errorTerragrunt silently dropped an
excludeblock with an attribute of the wrong type, such asactions = "plan"where a list belongs, and ran the unit as if the block weren't there. The parse now fails with an error that names the file and the attribute:Discovery doesn't fetch dependency outputs, so it can't evaluate an
excludeblock that reads one. Terragrunt still skips that block during discovery, and now logs a warning naming the file.Dependencies on a stack skip its disabled units
A
dependencywhoseconfig_pathpointed at a stack directory also depended on the units and stacks in that stack set toenabled = false. Stack generation never writes a disabled unit, sorun --allfailed on the missing directory:find --dependenciesanddag graphlisted the same missing path as a dependency.The dependency now covers only enabled units. The units of a disabled stack are left out, including a tree generated before the stack was disabled.
Stack commands respect
--discovery-boundarystack generate,stack run, andstack outputscanned the whole working directory for stack files and ignored--discovery-boundary. In a monorepo with a catalog next to live infrastructure, a catalog stack referencing files that exist only in the live tree failed the command, even though the command never asked for that stack.The boundary now applies to these commands, including an inline
(dir)operand, and it holds when a Git expression such as[main...HEAD]generates stacks for both compared commits. This works from the repository root:terragrunt stack run plan --filter '(./live/)...[main...HEAD]'Terragrunt skips the catalog units outside
./live. It still scans the whole working directory when a positive filter has no dependent-side boundary and--discovery-boundaryis unset, or when the boundaries fall in separate directories.Dependent discovery had the same gap and parsed units outside the dependent-side boundary. It now starts the search for dependents at that boundary, which can be a directory inside the working directory.
In a Git expression, a relative boundary resolves against the repository root like any other path in the expression. Changed units outside a dependent-side boundary are ignored, and a boundary that exists in neither compared commit is an error. A dependency-side boundary only limits dependency traversal.
--auth-provider-cmdand--queue-construct-asreject unquoted shell operatorsTerragrunt splits
--auth-provider-cmdand--queue-construct-asvalues into words without running a shell. An unquoted shell operator such as|,;,&&, or>used to end the value, and Terragrunt used only the words before it, so--auth-provider-cmd 'get-creds | jq .creds'ranget-credson its own.A value with an unquoted shell operator is now an error. Quote the operator to pass it as part of an argument. To run a pipeline as the auth provider, put it in a script and pass the script.
🧪 Experiments Added
mcp-command— Serve Terragrunt operations to AI agentsThe new
mcp-commandexperiment adds themcpcommand, which serves Terragrunt operations to AI agents over the Model Context Protocol.An agent can ask which units exist, how they depend on each other, whether configurations pass validation, what order the units run in, what a unit's applied outputs are, and more.
Point an MCP client at the Terragrunt binary and make sure that it enables the experiment:
By default, the server refuses to start any subprocess (e.g.
tofu,terraform,git, or arun_cmdprogram). Wherever Terragrunt would have started one, the result substitutes a stand-in for its output, such asmock_outputsfor a dependency output thattofu output -jsonwould have fetched, and lists each substitution in adegradedfield.Pass
--allow=execto let the server run thetofu,terraform, andgitthat Terragrunt starts on its own during a run. A program a configuration names, throughrun_cmd(), abefore_hook, or--auth-provider-cmd, is still refused, including atofu,terraform, orgitthe configuration names for itself, so pointing the server at a repository does not hand it those programs. Allow the commands you want with--allow-cmd, a pattern matched against the program and each of its arguments (e.g.--allow-cmd='jq **'), or let the read-only tools ask: whendiscover,render_config,validate, orrun_ordermeets a refused program, it sends the client an elicitation naming it, which the client usually shows the person operating the agent, and runs again with whatever they accept.plan,apply, anddestroynever ask, since answering would mean running them a second time.The remaining capabilities are denied the same way, each granted on its own:
--allow=httplets Terragrunt make HTTP requests on its own.This includes downloading a unit's remote
terraform { source }, fetching a stack's sources, reaching a cloud API to assume a role or read a bucket, and reading remote state directly from blob stores.--allow=sopslets it decrypt SOPS-encrypted files.Unless it is granted,
sops_decrypt_filefails rather than handing an agent the cleartext of your secrets.--allow=envpasses the server's environment variables to configurations and the commands the tools run.Unless it is granted, tool calls start from an empty environment, so
get_env()returns its default. The server also clears its own environment variables and pointsHOMEat an empty directory, so cloud SDKs, the SOPS decrypter, andgitcommands Terragrunt runs will find no credentials in environment variables or your home directory.Granting a capability only changes the capabilities of Terragrunt. A process started under
--allow=execcan still reach out on the network on its own, sotofu initwill download providers whether or not--allow=httpwas passed to allow Terragrunt to make network requests. The directory the server is launched in is its root. A tool call targeting a directory outside it is refused, and graph traversal is bounded there too, so a filter following dependencies or dependents cannot bring back a unit from a tree the server was never pointed at. That bounds what the server acts on, not what a configuration can read: an HCL function such asfile()reads the real disk wherever it points.You can grant multiple capabilities at once:
A separate flag,
--dangerously-allow-apply, addsapplyanddestroytools on top of--allow=exec. Without it neither tool is registered, so a client is never told they exist, and the server won't ever runapplyordestroyon behalf of a client.With it, the tool calls return an elicitation (the protocol's way for a server to ask the client's user a question) naming the units that would be run, and the run starts only once the person operating the client accepts it. A decline ends the tool call, and a client with no way to ask anyone is refused. The approval names the units, not the changes: nothing is planned to build that list, since a plan costs a full run that the acceptance then repeats. Call the plan tool first if you want the changes in front of you before accepting.
Only grant this capability on infrastructure you are willing to lose.
Passing it without
--allow=execis refused at startup, since applying means running OpenTofu/Terraform. Launch the server in the environment directory you are willing to have changed rather than at the repository root, because that directory is as far as any tool call can reach:Warning
Agents managing infrastructure
An agent reading your estate is still an agent acting on it. A model can be confidently wrong about what a tool does, and it can be steered by things you don't expect, including the comments in configurations, module READMEs, and command output it was pointed at. Read what an agent responds with as a proposal. Keep a person between it and anything that changes real resources, and give it credentials scoped to what you are willing to have it reach.
The restrictions this server places on itself are not a sandbox. They bound what the tools on this server do, and nothing else. An agent that can run shell commands can run
terragrunt run --all applyitself, with your ambient credentials, whether or not the server was started with--allow=exec.You remain responsible for how your agents manage infrastructure, and for what they do with the access you give them. An agent with these tools and your credentials can change or destroy real resources, and accepting that risk is your decision.
The tools that run OpenTofu/Terraform use the binary named by
--tf-path, and ignore a unit'sterraform_binaryandengineblock, since Terragrunt starts both without an--allow-cmdpattern or an approval.plan,apply, anddestroytakeparallelismto cap how many units run at once.The tools the server offers, the arguments they take, and what each capability grants are documented with the
mcpcommand.This will not stabilize before v1.3, so treat the tool set, the flag names, and the shape of every result as subject to change until then. The experiment documentation lists the criteria that have to be met first.
🧪 Experiments Updated
Eleven experiments completed
The following experiments graduated to general availability in this release, and the features they gated are now enabled by default:
azure-backendblock-iterationbounded-discoverycatalog-formatdependency-fetch-output-from-statemutable-generateocioptional-dependency-outputsoptional-hooksprofilingversion-attributeEach feature is described in the New Features section above.
The corresponding
--experimentflags (andTG_EXPERIMENTvalues) are no longer needed. Passing one still works, but emits a warning about the completed experiment, so you can drop it at your convenience.Thank you to everyone who ran these experiments early and filed the feedback that got them here.
tg-login— Signing in to the Gruntwork Developer PortalThe
tg-loginexperiment now enablesterragrunt login, which signs you in to the Gruntwork Developer Portal from the CLI:Once you are signed in,
terragrunt catalogdiscovers the repositories your organization selected in the portal and adds them to your catalog. See Gruntwork Developer Portal for how to select those repositories.See the experiment documentation for what still has to land before it stabilizes.
⚙️ Process Updates
Dropped the
hashicorp/terraformv0.15.3dependencyTerragrunt drew its built-in functions from
github.com/hashicorp/terraform, pinned to v0.15.3 by areplacedirective. Those functions now come from Terragrunt's own copy of the OpenTofu implementations, andgo.modhas noreplacedirectives.Projects that import Terragrunt as a Go module no longer resolve
github.com/hashicorp/terraform, and their dependency graph drops by roughly 175 modules, most of them cloud provider SDKs that Terraform used for its backends.Installing and running the Terragrunt binary is unchanged.
Pull Requests
✨ Features
logincommand by @yhakbar in #6804terragrunt catalogby @yhakbar in #6937mcpcommand by @yhakbar in #6851🐛 Bug Fixes
--cas-offlinesupport forcatalogby @yhakbar in #6904expansionwithautoincludeby @yhakbar in #6936enabledattribute by @yhakbar in #6939mcpcommand #6851 by @yhakbar in #6991TestStackExpansionGitFilterSelectsRemovedInstanceby @yhakbar in #7004iam_roleper unit directory and erroring on malformedexcludeblocks by @yhakbar in #7012📖 Documentation
mcp.docs.terragrunt.cominstall instructions by @yhakbar in #6984logincommand by @yhakbar in #6996🤖 CI
🧹 Chores
block-iterationexperiment by @yhakbar in #6925bounded-discoveryexperiment by @yhakbar in #6928catalog-formatexperiment by @yhakbar in #6931mutable-generateexperiment by @yhakbar in #6933optional-dependency-outputsexperiment by @yhakbar in #6935version-attributeexperiment by @yhakbar in #6949TestAwsDependencyOutputOptimizationtests by @yhakbar in #6953optional-hooksexperiment by @yhakbar in #6938TestAwstoTestAWSby @yhakbar in #6979GITHUB_STEP_SUMMARYin bats tests to avoid actually writing to summaries by @yhakbar in #7000gotestsumbetter by @yhakbar in #7001multierroruse by @yhakbar in #7016This discussion was created from the release v1.2.0-rc1.
All reactions