Repository: goreleaser/goreleaser
Pull request #4230 (2023-08-04 14:50:07)

feat: support WASI
`wasip1` is a valid `GOOS` value in the upcoming go 1.21.


cloudflare-pages[bot]: ## Deploying with &nbsp;<a href="https://pages.dev"><img alt="Cloudflare Pages" src="https://user-images.githubusercontent.com/23264/106598434-9e719e00-654f-11eb-9e59-6167043cfa01.png" width="16"></a> &nbsp;Cloudflare Pages

<table><tr><td><strong>Latest commit:</strong> </td><td>
<code>bd866db</code>
</td></tr>
<tr><td><strong>Status:</strong></td><td>&nbsp;✅&nbsp; Deploy successful!</td></tr>
<tr><td><strong>Preview URL:</strong></td><td>
<a href='https://79da9b9e.goreleaser.pages.dev'>https://79da9b9e.goreleaser.pages.dev</a>
</td></tr>
<tr><td><strong>Branch Preview URL:</strong></td><td>
<a href='https://wasi.goreleaser.pages.dev'>https://wasi.goreleaser.pages.dev</a>
</td></tr>
</table>

[View logs](https://dash.cloudflare.com/?to=/:account/pages/view/goreleaser/79da9b9e-037d-4439-9393-1ad05056d2dd)


Patch:
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 811ee200..d5888f68 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -29,7 +29,7 @@ jobs:
     env:
       DOCKER_CLI_EXPERIMENTAL: "enabled"
     steps:
-      - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3
+      - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3
         with:
           fetch-depth: 0
       - uses: arduino/setup-task@e26d8975574116b0097a1161e0fe16ba75d84c1c # v1
@@ -37,7 +37,7 @@ jobs:
           version: 3.x
           repo-token: ${{ secrets.GITHUB_TOKEN }}
       - uses: docker/setup-qemu-action@2b82ce82d56a2a04d2637cd93a637ae1b359c0a7 # v2
-      - uses: docker/setup-buildx-action@4c0219f9ac95b02789c1075625400b2acbff50b1 # v2
+      - uses: docker/setup-buildx-action@885d1462b80bc1c1c7f0b00334ad271f09369c55 # v2
       - name: setup-snapcraft
         # FIXME: the mkdirs are a hack for https://github.com/goreleaser/goreleaser/issues/1715
         run: |
@@ -51,7 +51,7 @@ jobs:
       - uses: cachix/install-nix-action@v22
         with:
           github_access_token: ${{ secrets.GITHUB_TOKEN }}
-      - uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4
+      - uses: actions/setup-go@93397bea11091df50f3d7e59dc26a7711a8bcfbe # v4
         with:
           go-version: stable
       - uses: sigstore/cosign-installer@v3.1.1
diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml
index 7bae0c36..6bebf1b8 100644
--- a/.github/workflows/codeql.yml
+++ b/.github/workflows/codeql.yml
@@ -15,8 +15,8 @@ jobs:
       contents: read
 
     steps:
-    - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3
-    - uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4
+    - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3
+    - uses: actions/setup-go@93397bea11091df50f3d7e59dc26a7711a8bcfbe # v4
       with:
         go-version: stable
     - uses: github/codeql-action/init@cdcdbb579706841c47f7063dda365e292e5cad7a # v2
diff --git a/.github/workflows/depsreview.yaml b/.github/workflows/depsreview.yaml
index bb9f369a..7450f922 100644
--- a/.github/workflows/depsreview.yaml
+++ b/.github/workflows/depsreview.yaml
@@ -8,7 +8,7 @@ jobs:
   dependency-review:
     runs-on: ubuntu-latest
     steps:
-      - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3
+      - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3
       - uses: actions/dependency-review-action@v3
         with:
           allow-licenses: BSD-2-Clause, BSD-3-Clause, MIT, Apache-2.0, MPL-2.0
diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml
index fdd78ba8..914b5211 100644
--- a/.github/workflows/docs.yml
+++ b/.github/workflows/docs.yml
@@ -17,11 +17,11 @@ jobs:
   htmltest:
     runs-on: ubuntu-latest
     steps:
-      - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3
+      - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3
       - uses: arduino/setup-task@e26d8975574116b0097a1161e0fe16ba75d84c1c # v1
         with:
           repo-token: ${{ secrets.GITHUB_TOKEN }}
-      - uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4
+      - uses: actions/setup-go@93397bea11091df50f3d7e59dc26a7711a8bcfbe # v4
         with:
           go-version: stable
       - run: task docs:build
diff --git a/.github/workflows/fig.yml b/.github/workflows/fig.yml
index a9c4d915..8450ca51 100644
--- a/.github/workflows/fig.yml
+++ b/.github/workflows/fig.yml
@@ -13,8 +13,8 @@ jobs:
   fig:
     runs-on: ubuntu-latest
     steps:
-      - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3
-      - uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4
+      - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3
+      - uses: actions/setup-go@93397bea11091df50f3d7e59dc26a7711a8bcfbe # v4
         with:
           go-version: stable
           cache: true
diff --git a/.github/workflows/generate-releases.yml b/.github/workflows/generate-releases.yml
index f2fbe0b6..0993b2e6 100644
--- a/.github/workflows/generate-releases.yml
+++ b/.github/workflows/generate-releases.yml
@@ -12,7 +12,7 @@ jobs:
       contents: write  # for stefanzweifel/git-auto-commit-action to push code in repo
     runs-on: ubuntu-latest
     steps:
-      - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3
+      - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3
         with:
           token: ${{ secrets.GH_PAT }}
       - uses: arduino/setup-task@e26d8975574116b0097a1161e0fe16ba75d84c1c # v1
diff --git a/.github/workflows/generate.yml b/.github/workflows/generate.yml
index d94e9f12..867983f3 100644
--- a/.github/workflows/generate.yml
+++ b/.github/workflows/generate.yml
@@ -19,10 +19,10 @@ jobs:
       contents: write  # for stefanzweifel/git-auto-commit-action to push code in repo
     runs-on: ubuntu-latest
     steps:
-      - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3
+      - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3
         with:
           token: ${{ secrets.GH_PAT }}
-      - uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4
+      - uses: actions/setup-go@93397bea11091df50f3d7e59dc26a7711a8bcfbe # v4
         with:
           go-version: stable
           cache: true
diff --git a/.github/workflows/gitleaks.yml b/.github/workflows/gitleaks.yml
index c3bce88b..68bb1d3b 100644
--- a/.github/workflows/gitleaks.yml
+++ b/.github/workflows/gitleaks.yml
@@ -14,7 +14,7 @@ jobs:
   gitleaks:
     runs-on: ubuntu-latest
     steps:
-      - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3
+      - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3
         with:
           fetch-depth: 0
       - uses: gitleaks/gitleaks-action@v2
diff --git a/.github/workflows/grype.yml b/.github/workflows/grype.yml
index d81d732f..2cf37743 100644
--- a/.github/workflows/grype.yml
+++ b/.github/workflows/grype.yml
@@ -17,7 +17,7 @@ jobs:
       contents: read
 
     steps:
-    - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3
+    - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3
     - uses: anchore/scan-action@v3
       with:
         path: "."
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
index ccdf1308..56e8d0ce 100644
--- a/.github/workflows/lint.yml
+++ b/.github/workflows/lint.yml
@@ -17,12 +17,12 @@ jobs:
     name: lint
     runs-on: ubuntu-latest
     steps:
-      - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3
-      - uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4
+      - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3
+      - uses: actions/setup-go@93397bea11091df50f3d7e59dc26a7711a8bcfbe # v4
         with:
           go-version: stable
           cache: false
       - name: golangci-lint
-        uses: golangci/golangci-lint-action@639cd343e1d3b897ff35927a75193d57cfcba299 # v3
+        uses: golangci/golangci-lint-action@3a919529898de77ec3da873e3063ca4b10e7f5cc # v3
         with:
           args: --timeout=5m
diff --git a/.github/workflows/nightly-oss.yml b/.github/workflows/nightly-oss.yml
index 29e85045..cb1c2d80 100644
--- a/.github/workflows/nightly-oss.yml
+++ b/.github/workflows/nightly-oss.yml
@@ -16,7 +16,7 @@ jobs:
     env:
       DOCKER_CLI_EXPERIMENTAL: "enabled"
     steps:
-      - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3
+      - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3
         with:
           fetch-depth: 0
       - uses: arduino/setup-task@e26d8975574116b0097a1161e0fe16ba75d84c1c # v1
@@ -24,8 +24,8 @@ jobs:
           version: 3.x
           repo-token: ${{ secrets.GITHUB_TOKEN }}
       - uses: docker/setup-qemu-action@2b82ce82d56a2a04d2637cd93a637ae1b359c0a7 # v2
-      - uses: docker/setup-buildx-action@4c0219f9ac95b02789c1075625400b2acbff50b1 # v2
-      - uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4
+      - uses: docker/setup-buildx-action@885d1462b80bc1c1c7f0b00334ad271f09369c55 # v2
+      - uses: actions/setup-go@93397bea11091df50f3d7e59dc26a7711a8bcfbe # v4
         with:
           go-version: stable
       - uses: sigstore/cosign-installer@v3.1.1
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 54c02f5c..d78da35c 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -49,7 +49,7 @@ jobs:
       matrix:
         format: [ deb, rpm, apk ]
     steps:
-      - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3
+      - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3
         with:
           fetch-depth: 0
       - uses: arduino/setup-task@e26d8975574116b0097a1161e0fe16ba75d84c1c # v1
@@ -70,7 +70,7 @@ jobs:
     env:
       DOCKER_CLI_EXPERIMENTAL: "enabled"
     steps:
-      - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3
+      - uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3
         with:
           fetch-depth: 0
       - uses: arduino/setup-task@e26d8975574116b0097a1161e0fe16ba75d84c1c # v1
@@ -78,7 +78,7 @@ jobs:
           version: 3.x
           repo-token: ${{ secrets.GITHUB_TOKEN }}
       - uses: docker/setup-qemu-action@2b82ce82d56a2a04d2637cd93a637ae1b359c0a7 # v2
-      - uses: docker/setup-buildx-action@4c0219f9ac95b02789c1075625400b2acbff50b1 # v2
+      - uses: docker/setup-buildx-action@885d1462b80bc1c1c7f0b00334ad271f09369c55 # v2
       - name: setup-snapcraft
         # FIXME: the mkdirs are a hack for https://github.com/goreleaser/goreleaser/issues/1715
         run: |
@@ -86,7 +86,7 @@ jobs:
           sudo apt-get -yq --no-install-suggests --no-install-recommends install snapcraft
           mkdir -p $HOME/.cache/snapcraft/download
           mkdir -p $HOME/.cache/snapcraft/stage-packages
-      - uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753 # v4
+      - uses: actions/setup-go@93397bea11091df50f3d7e59dc26a7711a8bcfbe # v4
         with:
           go-version: stable
       - uses: actions/cache@88522ab9f39a2ea568f7027eddc7d8d8bc9d59c8 # v3
diff --git a/.golangci.yaml b/.golangci.yaml
index 23a6c72d..8a9deb29 100644
--- a/.golangci.yaml
+++ b/.golangci.yaml
@@ -1,5 +1,5 @@
 run:
-  go: "1.20"
+  go: "1.21"
   timeout: 5m
 linters:
   enable:
diff --git a/.goreleaser.yaml b/.goreleaser.yaml
index 86725947..f34b25ed 100644
--- a/.goreleaser.yaml
+++ b/.goreleaser.yaml
@@ -17,6 +17,10 @@ gomod:
 
 report_sizes: true
 
+git:
+  ignore_tags:
+    - nightly
+
 metadata:
   mod_timestamp: "{{ .CommitTimestamp }}"
 
@@ -350,11 +354,13 @@ publishers:
     env:
       - "FURY_TOKEN={{ .Env.FURY_TOKEN }}"
     cmd: ./scripts/fury-upload.sh {{ .ArtifactName }}
+    disable: "{{ if .IsNightly }}true{{ end }}"
 
 milestones:
   - close: true
 
 release:
+  name_template: "v{{ .Version }}"
   footer: |
     **Full Changelog**: https://github.com/goreleaser/goreleaser/compare/{{ .PreviousTag }}...{{ .Tag }}
 
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 6891332e..4861ef8f 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -10,7 +10,7 @@ By participating in this project, you agree to abide our
 Prerequisites:
 
 - [Task](https://taskfile.dev/installation)
-- [Go 1.20+](https://go.dev/doc/install)
+- [Go 1.21+](https://go.dev/doc/install)
 
 Other things you might need to run the tests:
 
diff --git a/Dockerfile b/Dockerfile
index 6eb0e9cc..2bac2c1e 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,4 +1,4 @@
-FROM golang:1.20.7-alpine@sha256:7efb78dac256c450d194e556e96f80936528335033a26d703ec8146cec8c2090
+FROM golang:1.21.0-alpine@sha256:445f34008a77b0b98bf1821bf7ef5e37bb63cc42d22ee7c21cc17041070d134f
 
 RUN apk add --no-cache bash \
 	curl \
@@ -13,7 +13,7 @@ RUN apk add --no-cache bash \
 	tini
 
 # install cosign
-COPY --from=gcr.io/projectsigstore/cosign:v1.12.1@sha256:ac8e08a2141e093f4fd7d1d0b05448804eb3771b66574b13ad73e31b460af64d /ko-app/cosign /usr/bin/cosign
+COPY --from=gcr.io/projectsigstore/cosign:v2.1.1@sha256:411ace177097a33cb2ee74028a87ffdcb70965003cd1378c1ec7bf9f9dec9359 /ko-app/cosign /usr/bin/cosign
 
 # install syft
 RUN curl -sSfL https://raw.githubusercontent.com/anchore/syft/v0.84.1/install.sh | sh -s -- -b /usr/local/bin
diff --git a/Taskfile.yml b/Taskfile.yml
index 4857cce4..e348b91f 100644
--- a/Taskfile.yml
+++ b/Taskfile.yml
@@ -226,3 +226,10 @@ tasks:
         sh: 'if [[ $GITHUB_REF != refs/tags/v* ]]; then echo "--snapshot"; fi'
     cmds:
       - ./goreleaser release --clean --timeout 60m {{.SNAPSHOT}}
+
+  nightly:
+    cmds:
+      - gh run list --workflow=nightly-oss.yml
+      - gh workflow run nightly-oss.yml
+      - sleep 30
+      - gh run watch
diff --git a/cmd/check.go b/cmd/check.go
index 864ecf77..6a2fa419 100644
--- a/cmd/check.go
+++ b/cmd/check.go
@@ -47,7 +47,9 @@ func newCheckCmd() *checkCmd {
 				ctx.Deprecated = root.deprecated
 
 				if err := ctrlc.Default.Run(ctx, func() error {
-					log.Info(boldStyle.Render("checking configuration..."))
+					log.WithField("path", config).
+						Info(boldStyle.Render("checking"))
+
 					return defaults.Pipe{}.Run(ctx)
 				}); err != nil {
 					log.WithError(err).Error(boldStyle.Render("configuration is invalid"))
diff --git a/cmd/config.go b/cmd/config.go
index 4adff636..2f65f22e 100644
--- a/cmd/config.go
+++ b/cmd/config.go
@@ -11,13 +11,15 @@ import (
 )
 
 func loadConfig(path string) (config.Project, error) {
-	p, _, err := loadConfigCheck(path)
+	p, path, err := loadConfigCheck(path)
+	if err == nil {
+		log.WithField("path", path).Info("loading")
+	}
 	return p, err
 }
 
 func loadConfigCheck(path string) (config.Project, string, error) {
 	if path == "-" {
-		log.Info("loading config from stdin")
 		p, err := config.LoadReader(os.Stdin)
 		return p, path, err
 	}
diff --git a/go.mod b/go.mod
index a2983ade..6eeefcde 100644
--- a/go.mod
+++ b/go.mod
@@ -1,6 +1,6 @@
 module github.com/goreleaser/goreleaser
 
-go 1.20
+go 1.21
 
 require (
 	code.gitea.io/sdk/gitea v0.15.1
@@ -15,23 +15,23 @@ require (
 	github.com/caarlos0/go-version v0.1.1
 	github.com/caarlos0/log v0.4.2
 	github.com/charmbracelet/keygen v0.4.3
-	github.com/charmbracelet/lipgloss v0.7.1
+	github.com/charmbracelet/lipgloss v0.8.0
 	github.com/chrismellard/docker-credential-acr-env v0.0.0-20220327082430-c57b701bfc08
 	github.com/dghubble/go-twitter v0.0.0-20211115160449-93a8679adecb
 	github.com/dghubble/oauth1 v0.7.2
-	github.com/disgoorg/disgo v0.16.7
+	github.com/disgoorg/disgo v0.16.8
 	github.com/disgoorg/snowflake/v2 v2.0.1
 	github.com/distribution/distribution/v3 v3.0.0-20221021092657-c47a966fded8
 	github.com/go-telegram-bot-api/telegram-bot-api v4.6.4+incompatible
 	github.com/google/go-containerregistry v0.16.1
-	github.com/google/go-github/v53 v53.2.0
+	github.com/google/go-github/v54 v54.0.0
 	github.com/google/ko v0.14.1
-	github.com/google/uuid v1.3.0
+	github.com/google/uuid v1.3.1
 	github.com/goreleaser/fileglob v1.3.0
 	github.com/goreleaser/nfpm/v2 v2.32.0
 	github.com/hashicorp/go-multierror v1.1.1
 	github.com/invopop/jsonschema v0.7.0
-	github.com/jarcoal/httpmock v1.3.0
+	github.com/jarcoal/httpmock v1.3.1
 	github.com/klauspost/pgzip v1.2.6
 	github.com/mattn/go-mastodon v0.0.6
 	github.com/mitchellh/go-homedir v1.1.0
@@ -44,13 +44,13 @@ require (
 	github.com/stretchr/testify v1.8.4
 	github.com/ulikunitz/xz v0.5.11
 	github.com/withfig/autocomplete-tools/integrations/cobra v1.2.1
-	github.com/xanzy/go-gitlab v0.89.0
+	github.com/xanzy/go-gitlab v0.90.0
 	gocloud.dev v0.33.0
-	golang.org/x/crypto v0.11.0
-	golang.org/x/oauth2 v0.10.0
+	golang.org/x/crypto v0.12.0
+	golang.org/x/oauth2 v0.11.0
 	golang.org/x/sync v0.3.0
-	golang.org/x/text v0.11.0
-	golang.org/x/tools v0.11.1
+	golang.org/x/text v0.12.0
+	golang.org/x/tools v0.12.0
 	gopkg.in/mail.v2 v2.3.1
 	gopkg.in/yaml.v3 v3.0.1
 )
@@ -130,7 +130,7 @@ require (
 	github.com/dghubble/sling v1.4.0 // indirect
 	github.com/dimchansky/utfbom v1.1.1 // indirect
 	github.com/disgoorg/json v1.1.0 // indirect
-	github.com/disgoorg/log v1.2.0 // indirect
+	github.com/disgoorg/log v1.2.1 // indirect
 	github.com/docker/cli v24.0.0+incompatible // indirect
 	github.com/docker/distribution v2.8.2+incompatible // indirect
 	github.com/docker/docker v24.0.2+incompatible // indirect
@@ -245,9 +245,9 @@ require (
 	go.uber.org/automaxprocs v1.5.3
 	golang.org/x/exp v0.0.0-20230321023759-10a507213a29 // indirect
 	golang.org/x/mod v0.12.0 // indirect
-	golang.org/x/net v0.13.0 // indirect
-	golang.org/x/sys v0.10.0 // indirect
-	golang.org/x/term v0.10.0 // indirect
+	golang.org/x/net v0.14.0 // indirect
+	golang.org/x/sys v0.11.0 // indirect
+	golang.org/x/term v0.11.0 // indirect
 	golang.org/x/time v0.3.0 // indirect
 	golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect
 	google.golang.org/api v0.134.0 // indirect
diff --git a/go.sum b/go.sum
index c99f6d57..c52a0bc7 100644
--- a/go.sum
+++ b/go.sum
@@ -68,6 +68,7 @@ github.com/Azure/azure-sdk-for-go/sdk/keyvault/azkeys v0.10.0/go.mod h1:Pu5Zksi2
 github.com/Azure/azure-sdk-for-go/sdk/keyvault/internal v0.7.1 h1:FbH3BbSb4bvGluTesZZ+ttN/MDsnMmQP36OSnDuSXqw=
 github.com/Azure/azure-sdk-for-go/sdk/keyvault/internal v0.7.1/go.mod h1:9V2j0jn9jDEkCkv8w/bKTNppX/d0FVA1ud77xCIP4KA=
 github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.2.0 h1:Ma67P/GGprNwsslzEH6+Kb8nybI8jpDTm4Wmzu2ReK8=
+github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.2.0/go.mod h1:c+Lifp3EDEamAkPVzMooRNOK6CZjNSdEnf1A7jsI9u4=
 github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.1.0 h1:nVocQV40OQne5613EeLayJiRAJuKlBGy+m22qWG+WRg=
 github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.1.0/go.mod h1:7QJP7dr2wznCMeqIrhMgWGf7XpAQnVrJqDm9nvV3Cu4=
 github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0=
@@ -105,6 +106,7 @@ github.com/BurntSushi/toml v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak
 github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
 github.com/DataDog/zstd v1.4.5 h1:EndNeuB0l9syBZhut0wns3gV1hL8zX8LIu6ZiVHWLIQ=
+github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo=
 github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI=
 github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU=
 github.com/Masterminds/semver/v3 v3.2.0/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ=
@@ -120,7 +122,9 @@ github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8
 github.com/ProtonMail/go-crypto v0.0.0-20230626094100-7e9e0395ebec h1:vV3RryLxt42+ZIVOFbYJCH1jsZNTNmj2NYru5zfx+4E=
 github.com/ProtonMail/go-crypto v0.0.0-20230626094100-7e9e0395ebec/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0=
 github.com/ProtonMail/go-mime v0.0.0-20230322103455-7d82a3887f2f h1:tCbYj7/299ekTTXpdwKYF8eBlsYsDVoggDAuAjoK66k=
+github.com/ProtonMail/go-mime v0.0.0-20230322103455-7d82a3887f2f/go.mod h1:gcr0kNtGBqin9zDW9GOHcVntrwnjrK+qdJ06mWYBybw=
 github.com/ProtonMail/gopenpgp/v2 v2.7.1 h1:Awsg7MPc2gD3I7IFac2qE3Gdls0lZW8SzrFZ3k1oz0s=
+github.com/ProtonMail/gopenpgp/v2 v2.7.1/go.mod h1:/BU5gfAVwqyd8EfC3Eu7zmuhwYQpKs+cGD8M//iiaxs=
 github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
 github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
 github.com/acomagu/bufpipe v1.0.4 h1:e3H4WUzM3npvo5uv95QuJM3cQspFNtFBzvJ2oNjKIDQ=
@@ -130,8 +134,10 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF
 github.com/alessio/shellescape v1.4.1 h1:V7yhSDDn8LP4lc4jS8pFkt0zCnzVJlG5JXy9BVKJUX0=
 github.com/alessio/shellescape v1.4.1/go.mod h1:PZAiSCk0LJaZkiCSkPv8qIobYglO3FPpyFjDCtHLS30=
 github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8=
+github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4=
 github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
 github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
+github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
 github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw=
 github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so=
 github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw=
@@ -216,6 +222,7 @@ github.com/caarlos0/env/v9 v9.0.0/go.mod h1:ye5mlCVMYh6tZ+vCgrs/B95sj88cg5Tlnc0X
 github.com/caarlos0/go-reddit/v3 v3.0.1 h1:w8ugvsrHhaE/m4ez0BO/sTBOBWI9WZTjG7VTecHnql4=
 github.com/caarlos0/go-reddit/v3 v3.0.1/go.mod h1:QlwgmG5SAqxMeQvg/A2dD1x9cIZCO56BMnMdjXLoisI=
 github.com/caarlos0/go-rpmutils v0.2.1-0.20211112020245-2cd62ff89b11 h1:IRrDwVlWQr6kS1U8/EtyA1+EHcc4yl8pndcqXWrEamg=
+github.com/caarlos0/go-rpmutils v0.2.1-0.20211112020245-2cd62ff89b11/go.mod h1:je2KZ+LxaCNvCoKg32jtOIULcFogJKcL1ZWUaIBjKj0=
 github.com/caarlos0/go-shellwords v1.0.12 h1:HWrUnu6lGbWfrDcFiHcZiwOLzHWjjrPVehULaTFgPp8=
 github.com/caarlos0/go-shellwords v1.0.12/go.mod h1:bYeeX1GrTLPl5cAMYEzdm272qdsQAZiaHgeF0KTk1Gw=
 github.com/caarlos0/go-version v0.1.1 h1:1bikKHkGGVIIxqCmufhSSs3hpBScgHGacrvsi8FuIfc=
@@ -237,8 +244,8 @@ github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj
 github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
 github.com/charmbracelet/keygen v0.4.3 h1:ywOZRwkDlpmkawl0BgLTxaYWDSqp6Y4nfVVmgyyO1Mg=
 github.com/charmbracelet/keygen v0.4.3/go.mod h1:4e4FT3HSdLU/u83RfJWvzJIaVb8aX4MxtDlfXwpDJaI=
-github.com/charmbracelet/lipgloss v0.7.1 h1:17WMwi7N1b1rVWOjMT+rCh7sQkvDU75B2hbZpc5Kc1E=
-github.com/charmbracelet/lipgloss v0.7.1/go.mod h1:yG0k3giv8Qj8edTCbbg6AlQ5e8KNWpFujkNawKNhE2c=
+github.com/charmbracelet/lipgloss v0.8.0 h1:IS00fk4XAHcf8uZKc3eHeMUTCxUH6NkaTrdyCQk84RU=
+github.com/charmbracelet/lipgloss v0.8.0/go.mod h1:p4eYUZZJ/0oXTuCQKFF8mqyKCz0ja6y+7DniDDw5KKU=
 github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E=
 github.com/chrismellard/docker-credential-acr-env v0.0.0-20220327082430-c57b701bfc08 h1:9Qh4lJ/KMr5iS1zfZ8I97+3MDpiKjl+0lZVUNBhdvRs=
 github.com/chrismellard/docker-credential-acr-env v0.0.0-20220327082430-c57b701bfc08/go.mod h1:MAuu1uDJNOS3T3ui0qmKdPUwm59+bO19BbTph2wZafE=
@@ -268,6 +275,7 @@ github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHH
 github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
 github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
 github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY=
+github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4=
 github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4=
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
@@ -280,17 +288,18 @@ github.com/dghubble/sling v1.4.0 h1:/n8MRosVTthvMbwlNZgLx579OGVjUOy3GNEv5BIqAWY=
 github.com/dghubble/sling v1.4.0/go.mod h1:0r40aNsU9EdDUVBNhfCstAtFgutjgJGYbO1oNzkMoM8=
 github.com/dimchansky/utfbom v1.1.1 h1:vV6w1AhK4VMnhBno/TPVCoK9U/LP0PkLCS9tbxHdi/U=
 github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE=
-github.com/disgoorg/disgo v0.16.7 h1:Y4cI+DpLXCMbHJcjIFs5dspKfn4Ous4lN/et2vKgcb8=
-github.com/disgoorg/disgo v0.16.7/go.mod h1:wo61ZLPn6bxHVdUODjyZ3fZTnCT7giD3uknsDUwMGn8=
+github.com/disgoorg/disgo v0.16.8 h1:tvUeX+3Iu8U6koDc8RAgcQadRciWJwsI95Y7edHqq2g=
+github.com/disgoorg/disgo v0.16.8/go.mod h1:5fsaUpfu6Yv0p+PfmsAeQkV395KQskVu/d1bdq8vsNI=
 github.com/disgoorg/json v1.1.0 h1:7xigHvomlVA9PQw9bMGO02PHGJJPqvX5AnwlYg/Tnys=
 github.com/disgoorg/json v1.1.0/go.mod h1:BHDwdde0rpQFDVsRLKhma6Y7fTbQKub/zdGO5O9NqqA=
-github.com/disgoorg/log v1.2.0 h1:sqlXnu/ZKAlIlHV9IO+dbMto7/hCQ474vlIdMWk8QKo=
-github.com/disgoorg/log v1.2.0/go.mod h1:3x1KDG6DI1CE2pDwi3qlwT3wlXpeHW/5rVay+1qDqOo=
+github.com/disgoorg/log v1.2.1 h1:kZYAWkUBcGy4LbZcgYtgYu49xNVLy+xG5Uq3yz5VVQs=
+github.com/disgoorg/log v1.2.1/go.mod h1:hhQWYTFTnIGzAuFPZyXJEi11IBm9wq+/TVZt/FEwX0o=
 github.com/disgoorg/snowflake/v2 v2.0.1 h1:CuUxGLwggUxEswZOmZ+mZ5i0xSumQdXW9tXW7uGqe+0=
 github.com/disgoorg/snowflake/v2 v2.0.1/go.mod h1:SPU9c2CNn5DSyb86QcKtdZgix9osEtKrHLW4rMhfLCs=
 github.com/distribution/distribution/v3 v3.0.0-20221021092657-c47a966fded8 h1:zuxvqNfQKyGNH3a1yFh1ofD4Y7ycgdwQhHX6QRH+Cwo=
 github.com/distribution/distribution/v3 v3.0.0-20221021092657-c47a966fded8/go.mod h1:6rIc5NMSjXjjnwzWWy3HAm9gDBu+X7aCzL8VrHIKgxM=
 github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI=
+github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ=
 github.com/docker/cli v24.0.0+incompatible h1:0+1VshNwBQzQAx9lOl+OYCTCEAD8fKs/qeXMx3O0wqM=
 github.com/docker/cli v24.0.0+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
 github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8=
@@ -308,6 +317,7 @@ github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDD
 github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=
 github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
 github.com/elazarl/goproxy v0.0.0-20221015165544-a0805db90819 h1:RIB4cRk+lBqKK3Oy0r2gRX4ui7tuhiZq2SuTtTCi0/0=
+github.com/elazarl/goproxy v0.0.0-20221015165544-a0805db90819/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM=
 github.com/elliotchance/orderedmap/v2 v2.2.0 h1:7/2iwO98kYT4XkOjA9mBEIwvi4KpGB4cyHeOFOnj4Vk=
 github.com/elliotchance/orderedmap/v2 v2.2.0/go.mod h1:85lZyVbpGaGvHvnKa7Qhx7zncAdBIBq6u56Hb1PRU5Q=
 github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc=
@@ -322,20 +332,27 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7
 github.com/evanphx/json-patch/v5 v5.6.0 h1:b91NhWfaz02IuVxO9faSllyAtNXHMPkC5J8sJCLunww=
 github.com/evanphx/json-patch/v5 v5.6.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4=
 github.com/facebookgo/clock v0.0.0-20150410010913-600d898af40a h1:yDWHCSQ40h88yih2JAcL6Ls/kVkSE8GFACTGVnMPruw=
+github.com/facebookgo/clock v0.0.0-20150410010913-600d898af40a/go.mod h1:7Ga40egUymuWXxAe151lTNnCv97MddSOVsjpPPkityA=
 github.com/facebookgo/limitgroup v0.0.0-20150612190941-6abd8d71ec01 h1:IeaD1VDVBPlx3viJT9Md8if8IxxJnO+x0JCGb054heg=
+github.com/facebookgo/limitgroup v0.0.0-20150612190941-6abd8d71ec01/go.mod h1:ypD5nozFk9vcGw1ATYefw6jHe/jZP++Z15/+VTMcWhc=
 github.com/facebookgo/muster v0.0.0-20150708232844-fd3d7953fd52 h1:a4DFiKFJiDRGFD1qIcqGLX/WlUMD9dyLSLDt+9QZgt8=
+github.com/facebookgo/muster v0.0.0-20150708232844-fd3d7953fd52/go.mod h1:yIquW87NGRw1FU5p5lEkpnt/QxoH5uPAOUlOVkAUuMg=
 github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=
+github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
 github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k=
 github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY=
+github.com/frankban/quicktest v1.14.4/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
 github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=
 github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=
 github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
 github.com/gliderlabs/ssh v0.3.5 h1:OcaySEmAQJgyYcArR+gGGTHCyE7nvhEMTlYY+Dp8CpY=
+github.com/gliderlabs/ssh v0.3.5/go.mod h1:8XB4KraRrX39qHhT6yxPsHedjA08I/uBVwj4xC+/+z4=
 github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI=
 github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic=
 github.com/go-git/go-billy/v5 v5.4.1 h1:Uwp5tDRkPr+l/TnbHOQzp+tmJfLceOlbVucgpTz8ix4=
 github.com/go-git/go-billy/v5 v5.4.1/go.mod h1:vjbugF6Fz7JIflbVpl1hJsGjSHNltrSw45YK/ukIvQg=
 github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20230305113008-0c11038e723f h1:Pz0DHeFij3XFhoBRGUDPzSJ+w2UcK5/0JvF8DRI58r8=
+github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20230305113008-0c11038e723f/go.mod h1:8LHG1a3SRW71ettAD/jW13h8c6AqjVSeL11RAdgaqpo=
 github.com/go-git/go-git/v5 v5.7.0 h1:t9AudWVLmqzlo+4bqdf7GY+46SUuRsx59SboFxkq2aE=
 github.com/go-git/go-git/v5 v5.7.0/go.mod h1:coJHKEOk5kUClpsNlXrUvPrDxY3w3gjHvhcZd8Fodw8=
 github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
@@ -382,11 +399,13 @@ github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+
 github.com/go-openapi/validate v0.22.1 h1:G+c2ub6q47kfX1sOBLwIQwzBVt8qmOAARyo/9Fqs9NU=
 github.com/go-openapi/validate v0.22.1/go.mod h1:rjnrwK57VJ7A8xqfpAOEKRH8yQSGUriMu5/zuPSQ1hg=
 github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=
+github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
 github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
 github.com/go-telegram-bot-api/telegram-bot-api v4.6.4+incompatible h1:2cauKuaELYAEARXRkq2LrJ0yDDv1rW7+wrTEdVL3uaU=
 github.com/go-telegram-bot-api/telegram-bot-api v4.6.4+incompatible/go.mod h1:qf9acutJ8cwBUhm1bqgz6Bei9/C/c93FPDljKWwsOgM=
 github.com/go-test/deep v1.0.4/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA=
 github.com/go-test/deep v1.1.0 h1:WOcxcdHcvdgThNXjw0t76K42FXTU7HpNQWHpA2HHNlg=
+github.com/go-test/deep v1.1.0/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE=
 github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0=
 github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY=
 github.com/gobuffalo/depgen v0.1.0/go.mod h1:+ifsuy7fhi15RWncXQQKjWS9JPkdah5sZvtHc2RXGlg=
@@ -474,12 +493,14 @@ github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
 github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 github.com/google/go-containerregistry v0.16.1 h1:rUEt426sR6nyrL3gt+18ibRcvYpKYdpsa5ZW7MA08dQ=
 github.com/google/go-containerregistry v0.16.1/go.mod h1:u0qB2l7mvtWVR5kNcbFIhFY1hLbf8eeGapA+vbFDCtQ=
-github.com/google/go-github/v53 v53.2.0 h1:wvz3FyF53v4BK+AsnvCmeNhf8AkTaeh2SoYu/XUvTtI=
-github.com/google/go-github/v53 v53.2.0/go.mod h1:XhFRObz+m/l+UCm9b7KSIC3lT3NWSXGt7mOsAWEloao=
+github.com/google/go-github/v54 v54.0.0 h1:OZdXwow4EAD5jEo5qg+dGFH2DpkyZvVsAehjvJuUL/c=
+github.com/google/go-github/v54 v54.0.0/go.mod h1:Sw1LXWHhXRZtzJ9LI5fyJg9wbQzYvFhW8W5P2yaAQ7s=
 github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
 github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
 github.com/google/go-replayers/grpcreplay v1.1.0 h1:S5+I3zYyZ+GQz68OfbURDdt/+cSMqCK1wrvNx7WBzTE=
+github.com/google/go-replayers/grpcreplay v1.1.0/go.mod h1:qzAvJ8/wi57zq7gWqaE6AwLM6miiXUQwP1S+I9icmhk=
 github.com/google/go-replayers/httpreplay v1.2.0 h1:VM1wEyyjaoU53BwrOnaf9VhAyQQEEioJvFYxYcLRKzk=
+github.com/google/go-replayers/httpreplay v1.2.0/go.mod h1:WahEFFZZ7a1P4VM1qEeHy+tME4bwyqPcwWbNlUI1Mcg=
 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 github.com/google/ko v0.14.1 h1:CU+iuIYOOUoSLpBi/gYhnJerig/an/6/cUaEZIOWSGo=
 github.com/google/ko v0.14.1/go.mod h1:OrNWWNU4PEdaOArS3M2trorYoIbUwaZYBUHPOw6CVL0=
@@ -488,6 +509,7 @@ github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXi
 github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
 github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
 github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw=
+github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk=
 github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
 github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
 github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
@@ -510,8 +532,8 @@ github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3
 github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk=
 github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
-github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4=
+github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/google/wire v0.5.0 h1:I7ELFeVBr3yfPIcc8+MWvrjk+3VjbcSzoXm3JVa+jD8=
 github.com/google/wire v0.5.0/go.mod h1:ngWDr9Qvq3yZA10YrxfyGELY/AFWGVpy9c1LTRi1EoU=
 github.com/googleapis/enterprise-certificate-proxy v0.2.5 h1:UR4rDjcgpgEnqpIEvkiqTYKBCKLNmlge2eVjoZfySzM=
@@ -522,6 +544,7 @@ github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56
 github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU=
 github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g=
 github.com/gopherjs/gopherjs v1.17.2 h1:fQnZVsXk8uxXIStYb0N4bGk7jeyTalG/wsZjQ25dO0g=
+github.com/gopherjs/gopherjs v1.17.2/go.mod h1:pRRIvn/QzFLrKfvEz3qUuEhtE/zLCWfreZ6J5gM2i+k=
 github.com/goreleaser/chglog v0.5.0 h1:Sk6BMIpx8+vpAf8KyPit34OgWui8c7nKTMHhYx88jJ4=
 github.com/goreleaser/chglog v0.5.0/go.mod h1:Ri46M3lrMuv76FHszs3vtABR8J8k1w9JHYAzxeeOl28=
 github.com/goreleaser/fileglob v1.3.0 h1:/X6J7U8lbDpQtBvGcwwPS6OpzkNVlVEsFUVRx9+k+7I=
@@ -541,6 +564,7 @@ github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9n
 github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=
 github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ=
 github.com/hashicorp/go-hclog v1.3.1 h1:vDwF1DFNZhntP4DAjuTpOw3uEgMUpXh1pB5fW9DqHpo=
+github.com/hashicorp/go-hclog v1.3.1/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=
 github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
 github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
 github.com/hashicorp/go-retryablehttp v0.7.2 h1:AcYqCvkpalPnPF2pn0KamgwamS42TqUDDYFRKq/RAd0=
@@ -553,7 +577,9 @@ github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ
 github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
 github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
 github.com/honeycombio/beeline-go v1.10.0 h1:cUDe555oqvw8oD76BQJ8alk7FP0JZ/M/zXpNvOEDLDc=
+github.com/honeycombio/beeline-go v1.10.0/go.mod h1:Zz5WMeQCJzFt2Mvf8t6HC1X8RLskLVR/e8rvcmXB1G8=
 github.com/honeycombio/libhoney-go v1.16.0 h1:kPpqoz6vbOzgp7jC6SR7SkNj7rua7rgxvznI6M3KdHc=
+github.com/honeycombio/libhoney-go v1.16.0/go.mod h1:izP4fbREuZ3vqC4HlCAmPrcPT9gxyxejRjGtCYpmBn0=
 github.com/huandu/xstrings v1.3.3 h1:/Gcsuc1x8JVbJ9/rlye4xZnVAbEkGauT8lbebqcQws4=
 github.com/huandu/xstrings v1.3.3/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=
 github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA=
@@ -569,8 +595,8 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2
 github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
 github.com/invopop/jsonschema v0.7.0 h1:2vgQcBz1n256N+FpX3Jq7Y17AjYt46Ig3zIWyy770So=
 github.com/invopop/jsonschema v0.7.0/go.mod h1:O9uiLokuu0+MGFlyiaqtWxwqJm41/+8Nj0lD7A36YH0=
-github.com/jarcoal/httpmock v1.3.0 h1:2RJ8GP0IIaWwcC9Fp2BmVi8Kog3v2Hn7VXM3fTd+nuc=
-github.com/jarcoal/httpmock v1.3.0/go.mod h1:3yb8rc4BI7TCBhFY8ng0gjuLKJNquuDNiPaZjnENuYg=
+github.com/jarcoal/httpmock v1.3.1 h1:iUx3whfZWVf3jT01hQTO/Eo5sAYtB2/rqaUuOtpInww=
+github.com/jarcoal/httpmock v1.3.1/go.mod h1:3yb8rc4BI7TCBhFY8ng0gjuLKJNquuDNiPaZjnENuYg=
 github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A=
 github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=
 github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
@@ -579,6 +605,7 @@ github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHW
 github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8=
 github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
 github.com/jmhodges/clock v0.0.0-20160418191101-880ee4c33548 h1:dYTbLf4m0a5u0KLmPfB6mgxbcV7588bOCx79hxa5Sr4=
+github.com/jmhodges/clock v0.0.0-20160418191101-880ee4c33548/go.mod h1:hGT6jSUVzF6no3QaDSMLGLEHtHSBSefs+MgcDWnmhmo=
 github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg=
 github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
 github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
@@ -587,6 +614,7 @@ github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/u
 github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
 github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
 github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
+github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
 github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
 github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4=
 github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA=
@@ -606,6 +634,7 @@ github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFB
 github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
 github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
 github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
+github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
 github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
 github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
@@ -615,6 +644,7 @@ github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+
 github.com/letsencrypt/boulder v0.0.0-20221109233200-85aa52084eaf h1:ndns1qx/5dL43g16EQkPV/i8+b3l5bYQwLeoSBe7tS8=
 github.com/letsencrypt/boulder v0.0.0-20221109233200-85aa52084eaf/go.mod h1:aGkAgvWY/IUcVFfuly53REpfv5edu25oij+qHRFaraA=
 github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
+github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
 github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY=
 github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
 github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY=
@@ -630,6 +660,7 @@ github.com/matryer/is v1.2.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlW
 github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE=
 github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU=
 github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
+github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
 github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
 github.com/mattn/go-isatty v0.0.18 h1:DOKFKCQ7FNG2L1rbrmstDN4QVRdS89Nkh85u68Uwp98=
 github.com/mattn/go-isatty v0.0.18/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
@@ -642,6 +673,7 @@ github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5
 github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo=
 github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
 github.com/maxatome/go-testdeep v1.12.0 h1:Ql7Go8Tg0C1D/uMMX59LAoYK7LffeJQ6X2T04nTH68g=
+github.com/maxatome/go-testdeep v1.12.0/go.mod h1:lPZc/HAcJMP92l7yI6TRz1aZN5URwUBUAfUNvrclaNM=
 github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw=
 github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw=
 github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s=
@@ -663,6 +695,7 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN
 github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
 github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
 github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A=
+github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=
 github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ=
 github.com/muesli/mango v0.1.0 h1:DZQK45d2gGbql1arsYA4vfg4d7I9Hfx5rX/GCmzsAvI=
 github.com/muesli/mango v0.1.0/go.mod h1:5XFpbC8jY5UUv89YQciiXNlbi+iJgt29VDC5xbzrLL4=
@@ -708,6 +741,7 @@ github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qR
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
 github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g=
+github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U=
 github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
 github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
 github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g=
@@ -736,6 +770,7 @@ github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR
 github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
+github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
 github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
 github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
 github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
@@ -767,7 +802,9 @@ github.com/skeema/knownhosts v1.1.1/go.mod h1:g4fPeYpque7P0xefxtGzV81ihjC8sX2Iqp
 github.com/slack-go/slack v0.12.2 h1:x3OppyMyGIbbiyFhsBmpf9pwkUzMhthJMRNmNlA4LaQ=
 github.com/slack-go/slack v0.12.2/go.mod h1:hlGi5oXA+Gt+yWTPP0plCdRKmjsDxecdHxYQdlMQKOw=
 github.com/smartystreets/assertions v1.13.1 h1:Ef7KhSmjZcK6AVf9YbJdvPYG9avaF0ZxudX+ThRdWfU=
+github.com/smartystreets/assertions v1.13.1/go.mod h1:cXr/IwVfSo/RbCSPhoAPv73p3hlSdrBH/b3SdnW/LMY=
 github.com/smartystreets/goconvey v1.8.0 h1:Oi49ha/2MURE0WexF052Z0m+BNSGirfjg5RL+JXWq3w=
+github.com/smartystreets/goconvey v1.8.0/go.mod h1:EdX8jtrTIj26jmjCOVNMVSIYAtgexqXKHOXW2Dx9JLg=
 github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM=
 github.com/spf13/afero v1.9.5/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ=
 github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
@@ -811,6 +848,7 @@ github.com/theupdateframework/go-tuf v0.5.2 h1:habfDzTmpbzBLIFGWa2ZpVhYvFBoK0C1o
 github.com/theupdateframework/go-tuf v0.5.2/go.mod h1:SyMV5kg5n4uEclsyxXJZI2UxPFJNDc4Y+r7wv+MlvTA=
 github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
 github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=
+github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
 github.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399 h1:e/5i7d4oYZ+C1wj2THlRK+oAhjeS/TRQwMfkIuet3w0=
 github.com/titanous/rocacheck v0.0.0-20171023193734-afe73141d399/go.mod h1:LdwHTNJT99C5fTAzDz0ud328OgXz+gierycbcIx2fRs=
 github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80 h1:nrZ3ySNYwJbSpD6ce9duiP+QkD3JuLCcWkdaehUS/3Y=
@@ -824,11 +862,13 @@ github.com/vbatts/tar-split v0.11.3/go.mod h1:9QlHN18E+fEH7RdG+QAJJcuya3rqT7eXST
 github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE=
 github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU=
 github.com/vmihailenco/msgpack/v5 v5.3.5 h1:5gO0H1iULLWGhs2H5tbAHIZTV8/cYafcFOr9znI5mJU=
+github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc=
 github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g=
+github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds=
 github.com/withfig/autocomplete-tools/integrations/cobra v1.2.1 h1:+dBg5k7nuTE38VVdoroRsT0Z88fmvdYrI2EjzJst35I=
 github.com/withfig/autocomplete-tools/integrations/cobra v1.2.1/go.mod h1:nmuySobZb4kFgFy6BptpXp/BBw+xFSyvVPP6auoJB4k=
-github.com/xanzy/go-gitlab v0.89.0 h1:yJuy1Pw+to/NqHzVIiopt/VApoHvGDB5SEGuRs3EJpI=
-github.com/xanzy/go-gitlab v0.89.0/go.mod h1:5ryv+MnpZStBH8I/77HuQBsMbBGANtVpLWC15qOjWAw=
+github.com/xanzy/go-gitlab v0.90.0 h1:j8ZUHfLfXdnC+B8njeNaW/kM44c1zw8fiuNj7D+qQN8=
+github.com/xanzy/go-gitlab v0.90.0/go.mod h1:5ryv+MnpZStBH8I/77HuQBsMbBGANtVpLWC15qOjWAw=
 github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM=
 github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw=
 github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
@@ -844,6 +884,7 @@ github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:
 github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74=
 github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=
 github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 h1:nIPpBwaJSVYIxUFsDv3M8ofmx9yWTog9BfvIu0q41lo=
+github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8/go.mod h1:HUYIGzjTL3rfEspMxjDjgmT5uz5wzYJKVo23qUhYTos=
 github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
 github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
@@ -888,8 +929,8 @@ golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4
 golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4=
 golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58=
 golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
-golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA=
-golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio=
+golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk=
+golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -970,8 +1011,8 @@ golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco=
 golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=
 golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
 golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
-golang.org/x/net v0.13.0 h1:Nvo8UFsZ8X3BhAC9699Z1j7XQ3rsZnUUm7jfBEk1ueY=
-golang.org/x/net v0.13.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA=
+golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14=
+golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -981,8 +1022,8 @@ golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ
 golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
 golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
 golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.10.0 h1:zHCpF2Khkwy4mMB4bv0U37YtJdTGW8jI0glAApi0Kh8=
-golang.org/x/oauth2 v0.10.0/go.mod h1:kTpgurOux7LqtuxjuyZa4Gj2gdezIt/jQtGnNFfypQI=
+golang.org/x/oauth2 v0.11.0 h1:vPL4xzxBM4niKCW6g9whtaWVXTJf1U5e4aZxxFx/gbU=
+golang.org/x/oauth2 v0.11.0/go.mod h1:LdF7O/8bLR/qWK9DrpXmbHLTouvRHK0SgJl0GmDBchk=
 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -1062,16 +1103,16 @@ golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA=
-golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM=
+golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
 golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
 golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
-golang.org/x/term v0.10.0 h1:3R7pNqamzBraeqj/Tj8qt1aQ2HpmlC+Cx/qL/7hn4/c=
-golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o=
+golang.org/x/term v0.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0=
+golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU=
 golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -1085,8 +1126,8 @@ golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
 golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
 golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
 golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
-golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4=
-golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
+golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc=
+golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
 golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -1149,8 +1190,8 @@ golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4f
 golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
 golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
 golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
-golang.org/x/tools v0.11.1 h1:ojD5zOW8+7dOGzdnNgersm8aPfcDjhMp12UfG93NIMc=
-golang.org/x/tools v0.11.1/go.mod h1:anzJrxPjNtfgiYQYirP2CPGzGLxrH2u2QBhn6Bf3qY8=
+golang.org/x/tools v0.12.0 h1:YW6HUoUmYBpwSgyaGaZq1fHjrBjX1rlpZ54T6mu2kss=
+golang.org/x/tools v0.12.0/go.mod h1:Sc0INKfu04TlqNoRA1hgpFZbhYXHPr4V5DzpSBTPqQM=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -1269,6 +1310,7 @@ gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLks
 gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc h1:2gGKlE2+asNV9m7xrywl36YYNnBG5ZQ0r/BOOxqPpmk=
 gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk=
 gopkg.in/alexcesaro/statsd.v2 v2.0.0 h1:FXkZSCZIH17vLCO5sO2UucTHsH9pc+17F6pl3JVCwMc=
+gopkg.in/alexcesaro/statsd.v2 v2.0.0/go.mod h1:i0ubccKGzBVNBpdGV5MocxyA/XlLUJzA7SLonnE4drU=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
@@ -1300,6 +1342,7 @@ gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C
 gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gotest.tools/v3 v3.3.0 h1:MfDY1b1/0xN1CyMlQDac0ziEy9zJQd9CXBRRDHw2jJo=
+gotest.tools/v3 v3.3.0/go.mod h1:Mcr9QNxkg0uMvy/YElmo4SpXgJKWgQvYrT7Kw5RzJ1A=
 honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
diff --git a/internal/builders/buildtarget/targets.go b/internal/builders/buildtarget/targets.go
index 9d66640e..5d0088aa 100644
--- a/internal/builders/buildtarget/targets.go
+++ b/internal/builders/buildtarget/targets.go
@@ -157,6 +157,7 @@ var (
 		"illumosamd64",
 		"iosarm64",
 		"jswasm",
+		"wasip1wasm",
 		"linux386",
 		"linuxamd64",
 		"linuxarm",
@@ -202,6 +203,7 @@ var (
 		"plan9",
 		"solaris",
 		"windows",
+		"wasip1",
 	}
 
 	validGoarch = []string{
diff --git a/internal/client/github.go b/internal/client/github.go
index b54f8427..dad28703 100644
--- a/internal/client/github.go
+++ b/internal/client/github.go
@@ -12,7 +12,7 @@ import (
 	"time"
 
 	"github.com/caarlos0/log"
-	"github.com/google/go-github/v53/github"
+	"github.com/google/go-github/v54/github"
 	"github.com/goreleaser/goreleaser/internal/artifact"
 	"github.com/goreleaser/goreleaser/internal/tmpl"
 	"github.com/goreleaser/goreleaser/pkg/config"
@@ -196,6 +196,8 @@ func (c *githubClient) OpenPullRequest(
 	draft bool,
 ) error {
 	c.checkRateLimit(ctx)
+	base.Owner = firstNonEmpty(base.Owner, head.Owner)
+	base.Name = firstNonEmpty(base.Name, head.Name)
 	if base.Branch == "" {
 		def, err := c.getDefaultBranch(ctx, base)
 		if err != nil {
@@ -217,8 +219,8 @@ func (c *githubClient) OpenPullRequest(
 	log.Info("opening pull request")
 	pr, res, err := c.client.PullRequests.Create(
 		ctx,
-		firstNonEmpty(base.Owner, head.Owner),
-		firstNonEmpty(base.Name, head.Name),
+		base.Owner,
+		base.Name,
 		&github.NewPullRequest{
 			Title: github.String(title),
 			Base:  github.String(base.Branch),
diff --git a/internal/exec/exec.go b/internal/exec/exec.go
index 2a9442e9..19c0fecc 100644
--- a/internal/exec/exec.go
+++ b/internal/exec/exec.go
@@ -14,6 +14,7 @@ import (
 	"github.com/goreleaser/goreleaser/internal/extrafiles"
 	"github.com/goreleaser/goreleaser/internal/gio"
 	"github.com/goreleaser/goreleaser/internal/logext"
+	"github.com/goreleaser/goreleaser/internal/pipe"
 	"github.com/goreleaser/goreleaser/internal/semerrgroup"
 	"github.com/goreleaser/goreleaser/internal/tmpl"
 	"github.com/goreleaser/goreleaser/pkg/config"
@@ -25,18 +26,30 @@ var passthroughEnvVars = []string{"HOME", "USER", "USERPROFILE", "TMPDIR", "TMP"
 
 // Execute the given publisher
 func Execute(ctx *context.Context, publishers []config.Publisher) error {
+	skips := pipe.SkipMemento{}
 	for _, p := range publishers {
 		log.WithField("name", p.Name).Debug("executing custom publisher")
 		err := executePublisher(ctx, p)
+		if err != nil && pipe.IsSkip(err) {
+			skips.Remember(err)
+			continue
+		}
 		if err != nil {
 			return err
 		}
 	}
-
-	return nil
+	return skips.Evaluate()
 }
 
 func executePublisher(ctx *context.Context, publisher config.Publisher) error {
+	disabled, err := tmpl.New(ctx).Bool(publisher.Disable)
+	if err != nil {
+		return err
+	}
+	if disabled {
+		return pipe.Skip("publisher is disabled")
+	}
+
 	log.Debugf("filtering %d artifacts", len(ctx.Artifacts.List()))
 	artifacts := filterArtifacts(ctx.Artifacts, publisher)
 
diff --git a/internal/pipe/docker/docker.go b/internal/pipe/docker/docker.go
index 49e13d7d..0b9454c1 100644
--- a/internal/pipe/docker/docker.go
+++ b/internal/pipe/docker/docker.go
@@ -3,10 +3,12 @@ package docker
 import (
 	"fmt"
 	"io/fs"
+	"net/http"
 	"os"
 	"path/filepath"
 	"sort"
 	"strings"
+	"time"
 
 	"github.com/caarlos0/log"
 	"github.com/goreleaser/goreleaser/internal/artifact"
@@ -306,7 +308,7 @@ func dockerPush(ctx *context.Context, image *artifact.Artifact) error {
 		return pipe.Skip("prerelease detected with 'auto' push, skipping docker publish: " + image.Name)
 	}
 
-	digest, err := imagers[docker.Use].Push(ctx, image.Name, docker.PushFlags)
+	digest, err := doPush(ctx, imagers[docker.Use], image.Name, docker.PushFlags)
 	if err != nil {
 		return err
 	}
@@ -328,3 +330,52 @@ func dockerPush(ctx *context.Context, image *artifact.Artifact) error {
 	ctx.Artifacts.Add(art)
 	return nil
 }
+
+func doPush(ctx *context.Context, img imager, name string, flags []string) (string, error) {
+	var try int
+	for try < 10 {
+		digest, err := img.Push(ctx, name, flags)
+		if err == nil {
+			return digest, nil
+		}
+		if isRetryable(err) {
+			log.WithField("try", try).
+				WithField("image", name).
+				WithError(err).
+				Warnf("failed to push image, will retry")
+			time.Sleep(time.Duration(try*10) * time.Second)
+			try++
+			continue
+		}
+		return "", fmt.Errorf("failed to push %s after %d tries: %w", name, try, err)
+	}
+	return "", nil // will never happen
+}
+
+func isRetryable(err error) bool {
+	for _, code := range []int{
+		http.StatusInternalServerError,
+		// http.StatusNotImplemented,
+		http.StatusBadGateway,
+		http.StatusServiceUnavailable,
+		http.StatusGatewayTimeout,
+		// http.StatusHTTPVersionNotSupported,
+		http.StatusVariantAlsoNegotiates,
+		// http.StatusInsufficientStorage,
+		// http.StatusLoopDetected,
+		http.StatusNotExtended,
+		// http.StatusNetworkAuthenticationRequired,
+	} {
+		if strings.Contains(
+			err.Error(),
+			fmt.Sprintf(
+				"received unexpected HTTP status: %d %s",
+				code,
+				http.StatusText(code),
+			),
+		) {
+			return true
+		}
+	}
+	return false
+}
diff --git a/internal/pipe/git/errors.go b/internal/pipe/git/errors.go
index 331508ec..d1fa8bc4 100644
--- a/internal/pipe/git/errors.go
+++ b/internal/pipe/git/errors.go
@@ -3,6 +3,9 @@ package git
 import (
 	"errors"
 	"fmt"
+	"regexp/syntax"
+
+	"github.com/goreleaser/goreleaser/internal/tmpl"
 )
 
 // ErrDirty happens when the repo has uncommitted/unstashed changes.
@@ -33,3 +36,12 @@ var ErrNotRepository = errors.New("current folder is not a git repository")
 
 // ErrNoGit happens when git is not present in PATH.
 var ErrNoGit = errors.New("git not present in PATH")
+
+// shouldErr returns true if the errors are template or regex related.
+func shouldErr(err error) bool {
+	if errors.As(err, &tmpl.Error{}) {
+		return true
+	}
+	se := &syntax.Error{}
+	return errors.As(err, &se)
+}
diff --git a/internal/pipe/git/git.go b/internal/pipe/git/git.go
index 29deabf8..66ad07a5 100644
--- a/internal/pipe/git/git.go
+++ b/internal/pipe/git/git.go
@@ -5,6 +5,7 @@ import (
 	"net/url"
 	"os"
 	"os/exec"
+	"regexp"
 	"strconv"
 	"strings"
 	"time"
@@ -12,6 +13,7 @@ import (
 	"github.com/caarlos0/log"
 	"github.com/goreleaser/goreleaser/internal/git"
 	"github.com/goreleaser/goreleaser/internal/pipe"
+	"github.com/goreleaser/goreleaser/internal/tmpl"
 	"github.com/goreleaser/goreleaser/pkg/context"
 )
 
@@ -115,7 +117,10 @@ func getGitInfo(ctx *context.Context) (context.GitInfo, error) {
 	}
 
 	tag, err := getTag(ctx)
-	if err != nil {
+	if err != nil && shouldErr(err) {
+		return context.GitInfo{}, fmt.Errorf("could not get current tag: %w", err)
+	}
+	if tag == "" {
 		return context.GitInfo{
 			Branch:      branch,
 			Commit:      full,
@@ -254,12 +259,16 @@ func getTag(ctx *context.Context) (string, error) {
 		},
 	} {
 		tags, err := fn()
-		if len(tags) > 0 {
-			return tags[0], err
+		if err != nil {
+			return "", err
 		}
+		tags, err = filterOutTags(ctx, tags)
 		if err != nil {
 			return "", err
 		}
+		if len(tags) > 0 {
+			return tags[0], err
+		}
 	}
 
 	return "", nil
@@ -277,17 +286,47 @@ func getPreviousTag(ctx *context.Context, current string) (string, error) {
 		},
 	} {
 		tags, err := fn()
-		if len(tags) > 0 {
-			return tags[0], err
+		if err != nil {
+			return "", err
 		}
+		tags, err = filterOutTags(ctx, tags)
 		if err != nil {
 			return "", err
 		}
+		if len(tags) > 0 {
+			return tags[0], err
+		}
 	}
 
 	return "", nil
 }
 
+func filterOutTags(ctx *context.Context, tags []string) ([]string, error) {
+	regexes := []*regexp.Regexp{}
+	for _, s := range ctx.Config.Git.IgnoreTags {
+		applied, err := tmpl.New(ctx).Apply(s)
+		if err != nil {
+			return nil, err
+		}
+		re, err := regexp.Compile(applied)
+		if err != nil {
+			return nil, err
+		}
+		regexes = append(regexes, re)
+	}
+	var result []string
+outer:
+	for _, tag := range tags {
+		for _, re := range regexes {
+			if re.MatchString(tag) {
+				continue outer
+			}
+		}
+		result = append(result, tag)
+	}
+	return result, nil
+}
+
 func gitTagsPointingAt(ctx *context.Context, ref string) ([]string, error) {
 	args := []string{}
 	if ctx.Config.Git.PrereleaseSuffix != "" {
diff --git a/internal/pipe/snapshot/snapshot.go b/internal/pipe/snapshot/snapshot.go
index acdb8521..c4d469f6 100644
--- a/internal/pipe/snapshot/snapshot.go
+++ b/internal/pipe/snapshot/snapshot.go
@@ -9,7 +9,7 @@ import (
 	"github.com/goreleaser/goreleaser/pkg/context"
 )
 
-// Pipe for checksums.
+// Pipe for setting up the snapshot feature..
 type Pipe struct{}
 
 func (Pipe) String() string                 { return "snapshotting" }
@@ -26,7 +26,7 @@ func (Pipe) Default(ctx *context.Context) error {
 func (Pipe) Run(ctx *context.Context) error {
 	name, err := tmpl.New(ctx).Apply(ctx.Config.Snapshot.NameTemplate)
 	if err != nil {
-		return fmt.Errorf("failed to generate snapshot name: %w", err)
+		return fmt.Errorf("failed to parse snapshot name: %w", err)
 	}
 	if name == "" {
 		return fmt.Errorf("empty snapshot name")
diff --git a/internal/pipe/upx/upx.go b/internal/pipe/upx/upx.go
index faaf66ca..e1e1195b 100644
--- a/internal/pipe/upx/upx.go
+++ b/internal/pipe/upx/upx.go
@@ -11,6 +11,7 @@ import (
 	"github.com/goreleaser/goreleaser/internal/artifact"
 	"github.com/goreleaser/goreleaser/internal/pipe"
 	"github.com/goreleaser/goreleaser/internal/semerrgroup"
+	"github.com/goreleaser/goreleaser/internal/tmpl"
 	"github.com/goreleaser/goreleaser/pkg/config"
 	"github.com/goreleaser/goreleaser/pkg/context"
 )
@@ -32,7 +33,11 @@ func (Pipe) Run(ctx *context.Context) error {
 	g := semerrgroup.NewSkipAware(semerrgroup.New(ctx.Parallelism))
 	for _, upx := range ctx.Config.UPXs {
 		upx := upx
-		if !upx.Enabled {
+		enabled, err := tmpl.New(ctx).Bool(upx.Enabled)
+		if err != nil {
+			return err
+		}
+		if !enabled {
 			return pipe.Skip("upx is not enabled")
 		}
 		if _, err := exec.LookPath(upx.Binary); err != nil {
diff --git a/internal/pipe/webhook/webhook.go b/internal/pipe/webhook/webhook.go
index 1c9121bc..5c867032 100644
--- a/internal/pipe/webhook/webhook.go
+++ b/internal/pipe/webhook/webhook.go
@@ -68,7 +68,7 @@ func (p Pipe) Announce(ctx *context.Context) error {
 
 	msg, err := tmpl.New(ctx).Apply(ctx.Config.Announce.Webhook.MessageTemplate)
 	if err != nil {
-		return fmt.Errorf("webhook: %s", err)
+		return fmt.Errorf("webhook: %w", err)
 	}
 
 	log.Infof("posting: '%s'", msg)
diff --git a/internal/pipeline/pipeline.go b/internal/pipeline/pipeline.go
index 51c30fba..d81e358a 100644
--- a/internal/pipeline/pipeline.go
+++ b/internal/pipeline/pipeline.go
@@ -59,10 +59,10 @@ var BuildPipeline = []Piper{
 	semver.Pipe{},
 	// load default configs
 	defaults.Pipe{},
-	// run global hooks before build
-	before.Pipe{},
 	// snapshot version handling
 	snapshot.Pipe{},
+	// run global hooks before build
+	before.Pipe{},
 	// ensure ./dist is clean
 	dist.Pipe{},
 	// setup gomod-related stuff
diff --git a/internal/static/config.yaml b/internal/static/config.yaml
index a65edfee..d3fb70f3 100644
--- a/internal/static/config.yaml
+++ b/internal/static/config.yaml
@@ -1,11 +1,18 @@
 # This is an example .goreleaser.yml file with some sensible defaults.
 # Make sure to check the documentation at https://goreleaser.com
+
+# The lines bellow are called `modelines`. See `:help modeline`
+# Feel free to remove those if you don't want/need to use them.
+# yaml-language-server: $schema=https://goreleaser.com/static/schema.json
+# vim: set ts=2 sw=2 tw=0 fo=cnqoj
+
 before:
   hooks:
     # You may remove this if you don't use go modules.
     - go mod tidy
     # you may remove this if you don't need go generate
     - go generate ./...
+
 builds:
   - env:
       - CGO_ENABLED=0
@@ -16,7 +23,7 @@ builds:
 
 archives:
   - format: tar.gz
-    # this name template makes the OS and Arch compatible with the results of uname.
+    # this name template makes the OS and Arch compatible with the results of `uname`.
     name_template: >-
       {{ .ProjectName }}_
       {{- title .Os }}_
@@ -26,20 +33,12 @@ archives:
       {{- if .Arm }}v{{ .Arm }}{{ end }}
     # use zip for windows archives
     format_overrides:
-    - goos: windows
-      format: zip
-checksum:
-  name_template: 'checksums.txt'
-snapshot:
-  name_template: "{{ incpatch .Version }}-next"
+      - goos: windows
+        format: zip
+
 changelog:
   sort: asc
   filters:
     exclude:
-      - '^docs:'
-      - '^test:'
-
-# The lines beneath this are called `modelines`. See `:help modeline`
-# Feel free to remove those if you don't want/use them.
-# yaml-language-server: $schema=https://goreleaser.com/static/schema.json
-# vim: set ts=2 sw=2 tw=0 fo=cnqoj
+      - "^docs:"
+      - "^test:"
diff --git a/internal/tmpl/errors.go b/internal/tmpl/errors.go
new file mode 100644
index 00000000..90030b84
--- /dev/null
+++ b/internal/tmpl/errors.go
@@ -0,0 +1,45 @@
+package tmpl
+
+import (
+	"fmt"
+	"regexp"
+)
+
+var res = []*regexp.Regexp{
+	regexp.MustCompile(`^template: tmpl:\d+:\d+: executing ".+" at .+: `),
+	regexp.MustCompile(`^template: tmpl:\d+:\d+: `),
+	regexp.MustCompile(`^template: tmpl:\d+: `),
+}
+
+func newTmplError(str string, err error) error {
+	if err == nil {
+		return nil
+	}
+	details := err.Error()
+	for _, re := range res {
+		if re.MatchString(details) {
+			details = re.ReplaceAllString(details, "")
+			break
+		}
+	}
+	return Error{str, details, err}
+}
+
+// Error is returned on any template error.
+type Error struct {
+	str     string
+	details string
+	err     error
+}
+
+func (e Error) Unwrap() error {
+	return e.err
+}
+
+func (e Error) Error() string {
+	return fmt.Sprintf(
+		"template: failed to apply %q: %s",
+		e.str,
+		e.details,
+	)
+}
diff --git a/internal/tmpl/tmpl.go b/internal/tmpl/tmpl.go
index bd58963f..72cf98e3 100644
--- a/internal/tmpl/tmpl.go
+++ b/internal/tmpl/tmpl.go
@@ -223,11 +223,11 @@ func (t *Template) Apply(s string) (string, error) {
 		}).
 		Parse(s)
 	if err != nil {
-		return "", err
+		return "", newTmplError(s, err)
 	}
 
 	err = tmpl.Execute(&out, t.fields)
-	return out.String(), err
+	return out.String(), newTmplError(s, err)
 }
 
 // ApplyAll applies all the given strings against the Fields stored in the
@@ -237,7 +237,7 @@ func (t *Template) ApplyAll(sps ...*string) error {
 		s := *sp
 		result, err := t.Apply(s)
 		if err != nil {
-			return fmt.Errorf("failed to apply template: %s: %w", s, err)
+			return newTmplError(s, err)
 		}
 		*sp = result
 	}
diff --git a/pkg/config/config.go b/pkg/config/config.go
index a66fd234..e7f2cac3 100644
--- a/pkg/config/config.go
+++ b/pkg/config/config.go
@@ -11,7 +11,6 @@ import (
 	"strings"
 	"time"
 
-	"github.com/caarlos0/log"
 	"github.com/goreleaser/goreleaser/internal/yaml"
 	"github.com/goreleaser/nfpm/v2/files"
 	"github.com/invopop/jsonschema"
@@ -19,8 +18,9 @@ import (
 
 // Git configs.
 type Git struct {
-	TagSort          string `yaml:"tag_sort,omitempty" json:"tag_sort,omitempty"`
-	PrereleaseSuffix string `yaml:"prerelease_suffix,omitempty" json:"prerelease_suffix,omitempty"`
+	TagSort          string   `yaml:"tag_sort,omitempty" json:"tag_sort,omitempty"`
+	PrereleaseSuffix string   `yaml:"prerelease_suffix,omitempty" json:"prerelease_suffix,omitempty"`
+	IgnoreTags       []string `yaml:"ignore_tags,omitempty" json:"ignore_tags,omitempty"`
 }
 
 // GitHubURLs holds the URLs to be used when using github enterprise.
@@ -682,7 +682,7 @@ type UniversalBinary struct {
 
 // UPX allows to compress binaries with `upx`.
 type UPX struct {
-	Enabled  bool     `yaml:"enabled,omitempty" json:"enabled,omitempty"`
+	Enabled  string   `yaml:"enabled,omitempty" json:"enabled,omitempty" jsonschema:"oneof_type=string;boolean"`
 	IDs      []string `yaml:"ids,omitempty" json:"ids,omitempty"`
 	Goos     []string `yaml:"goos,omitempty" json:"goos,omitempty"`
 	Goarch   []string `yaml:"goarch,omitempty" json:"goarch,omitempty"`
@@ -1121,6 +1121,7 @@ type Publisher struct {
 	Cmd        string      `yaml:"cmd,omitempty" json:"cmd,omitempty"`
 	Env        []string    `yaml:"env,omitempty" json:"env,omitempty"`
 	ExtraFiles []ExtraFile `yaml:"extra_files,omitempty" json:"extra_files,omitempty"`
+	Disable    string      `yaml:"disable,omitempty" json:"disable,omitempty" jsonschema:"oneof_type=string;boolean"`
 }
 
 // Source configuration.
@@ -1329,7 +1330,6 @@ func Load(file string) (config Project, err error) {
 		return
 	}
 	defer f.Close()
-	log.WithField("file", file).Info("loading config file")
 	return LoadReader(f)
 }
 
@@ -1340,7 +1340,6 @@ func LoadReader(fd io.Reader) (config Project, err error) {
 		return config, err
 	}
 	err = yaml.UnmarshalStrict(data, &config)
-	log.WithField("config", config).Debug("loaded config file")
 	return config, err
 }
 
diff --git a/www/docs/contributing.md b/www/docs/contributing.md
index 6891332e..4861ef8f 100644
--- a/www/docs/contributing.md
+++ b/www/docs/contributing.md
@@ -10,7 +10,7 @@ By participating in this project, you agree to abide our
 Prerequisites:
 
 - [Task](https://taskfile.dev/installation)
-- [Go 1.20+](https://go.dev/doc/install)
+- [Go 1.21+](https://go.dev/doc/install)
 
 Other things you might need to run the tests:
 
diff --git a/www/docs/customization/changelog.md b/www/docs/customization/changelog.md
index 17300310..9306ee5a 100644
--- a/www/docs/customization/changelog.md
+++ b/www/docs/customization/changelog.md
@@ -52,8 +52,11 @@ changelog:
   # Group commits messages by given regex and title.
   # Order value defines the order of the groups.
   # Providing no regex means all commits will be grouped under the default group.
+  #
+  # Matches are performed against the first line of the commit message only,
+  # prefixed with the commit SHA1, usually in the form of
+  # `<abbrev-commit>[:] <title-commit>`.
   # Groups are disabled when using github-native, as it already groups things by itself.
-  # Matches are performed against strings of the form: "<abbrev-commit>[:] <title-commit>".
   # Regex use RE2 syntax as defined here: https://github.com/google/re2/wiki/Syntax.
   groups:
     - title: Features
@@ -96,15 +99,24 @@ changelog:
   filters:
     # Commit messages matching the regexp listed here will be removed from
     # the changelog
+    #
+    # Matches are performed against the first line of the commit message only,
+    # prefixed with the commit SHA1, usually in the form of
+    # `<abbrev-commit>[:] <title-commit>`.
     exclude:
       - "^docs:"
       - typo
       - (?i)foo
+
     # Commit messages matching the regexp listed here will be the only ones
     # added to the changelog
     #
     # If include is not-empty, exclude will be ignored.
     #
+    # Matches are performed against the first line of the commit message only,
+    # prefixed with the commit SHA1, usually in the form of
+    # `<abbrev-commit>[:] <title-commit>`.
+    #
     # Since: v1.19
     include:
       - "^feat:"
diff --git a/www/docs/customization/git.md b/www/docs/customization/git.md
index a7fa3a64..289a4249 100644
--- a/www/docs/customization/git.md
+++ b/www/docs/customization/git.md
@@ -18,4 +18,14 @@ git:
   #
   # Since: v1.17
   prerelease_suffix: "-"
+
+  # Regular expressions for tags to be ignored by GoReleaser.
+  # This means that GoReleaser will not pick up tags that match any of the
+  # provided ignores as either previous or current tags.
+  #
+  # Templates: allowed.
+  # Since: v1.21.
+  ignore_tags:
+    - nightly
+    - "{{.Env.FOO}}.*"
 ```
diff --git a/www/docs/customization/publishers.md b/www/docs/customization/publishers.md
index 84e809e0..716cb93a 100644
--- a/www/docs/customization/publishers.md
+++ b/www/docs/customization/publishers.md
@@ -121,6 +121,12 @@ publishers:
     env:
       - API_TOKEN=secret-token
 
+    # Whether to disable this particular upload configuration.
+    #
+    # Since: v1.20
+    # Templates: allowed
+    disable: "{{ if .IsNightly }}true{{ end }}"
+
     # You can publish extra pre-existing files.
     # The filename published will be the last part of the path (base).
     # If another file with the same name exists, the last one found will be used.
diff --git a/www/docs/customization/upx.md b/www/docs/customization/upx.md
index ac5ac30d..30daf97e 100644
--- a/www/docs/customization/upx.md
+++ b/www/docs/customization/upx.md
@@ -12,44 +12,43 @@ the _de facto_ tool for the job.
 GoReleaser has been able to integrate with it via custom [build hooks][bhooks],
 and now UPX has its own configuration section:
 
-!!! warning
+!!! warning "Compatibility"
+
     `upx` does not support all platforms! Make sure to check
-    [their issues][upx-issues] and to test your packed binaries first.
+    [their issues][upx-issues] and to test your packed binaries.
 
     Namely, _macOS Ventura_ is not supported at the moment.
 
-    Future GoReleaser releases will add more filters so you can cherry-pick
-    which platforms you want to pack or not.
-
 ```yaml
 # .goreleaser.yaml
 upx:
-  -
-    # Whether to enable it or not.
+  - # Whether to enable it or not.
+    #
+    # Templates: allowed (since v1.21).
     enabled: true
 
     # Filter by build ID.
-    ids: [ build1, build2 ]
+    ids: [build1, build2]
 
     # Filter by GOOS.
     #
     # Since: v1.19
-    goos: [ linux , darwin ]
+    goos: [linux, darwin]
 
     # Filter by GOARCH.
     #
     # Since: v1.19
-    goarch: [ arm, amd64 ]
+    goarch: [arm, amd64]
 
     # Filter by GOARM.
     #
     # Since: v1.19
-    goarm: [ 8 ]
+    goarm: [8]
 
     # Filter by GOAMD64.
     #
     # Since: v1.19
-    goamd64: [ v1 ]
+    goamd64: [v1]
 
     # Compress argument.
     # Valid options are from '1' (faster) to '9' (better), and 'best'.
@@ -62,12 +61,17 @@ upx:
     brute: true
 ```
 
+!!! info
+
+    If `upx` is not in `$PATH`, GoReleaser will automatically avoid running it.
+
 Notice you can define multiple `upx` definitions, filtering by various fields.
 You can use that to have different compression options depending on the target
 OS, for instance - or even to run it only on a few selected platforms.
 
-!!! info
-    If `upx` is not in `$PATH`, GoReleaser will automatically avoid running it.
+!!! tip
+
+    Learn more about the [name template engine](templates.md).
 
 [upx]: https://upx.github.io/
 [upx-issues]: https://github.com/upx/upx/issues
diff --git a/www/docs/static/releases-pro.json b/www/docs/static/releases-pro.json
index 094cdb52..81bd220a 100644
--- a/www/docs/static/releases-pro.json
+++ b/www/docs/static/releases-pro.json
@@ -1,4 +1,7 @@
 [
+  {
+    "tag_name": "v1.20.0-pro"
+  },
   {
     "tag_name": "v1.19.2-pro"
   },
diff --git a/www/docs/static/releases.json b/www/docs/static/releases.json
index af394773..823bd951 100644
--- a/www/docs/static/releases.json
+++ b/www/docs/static/releases.json
@@ -1,4 +1,10 @@
 [
+  {
+    "tag_name": "v1.20.0"
+  },
+  {
+    "tag_name": "nightly"
+  },
   {
     "tag_name": "v1.19.2"
   },
diff --git a/www/docs/static/schema-pro.json b/www/docs/static/schema-pro.json
index b4746043..1e029b4d 100644
--- a/www/docs/static/schema-pro.json
+++ b/www/docs/static/schema-pro.json
@@ -217,17 +217,6 @@
 					"strip_parent_binary_folder": {
 						"type": "boolean"
 					},
-					"rlcp": {
-						"oneOf": [
-							{
-								"type": "string"
-							},
-							{
-								"type": "boolean"
-							}
-						],
-						"description": "you can now remove this"
-					},
 					"files": {
 						"items": {
 							"$ref": "#/$defs/File"
@@ -248,6 +237,17 @@
 							"$ref": "#/$defs/TemplatedFile"
 						},
 						"type": "array"
+					},
+					"rlcp": {
+						"oneOf": [
+							{
+								"type": "string"
+							},
+							{
+								"type": "boolean"
+							}
+						],
+						"description": "you can now remove this"
 					}
 				},
 				"additionalProperties": false,
@@ -1246,10 +1246,6 @@
 					"name": {
 						"type": "string"
 					},
-					"tap": {
-						"$ref": "#/$defs/RepoRef",
-						"description": "use repository instead"
-					},
 					"repository": {
 						"$ref": "#/$defs/RepoRef"
 					},
@@ -1265,10 +1261,6 @@
 					"caveats": {
 						"type": "string"
 					},
-					"plist": {
-						"type": "string",
-						"description": "use service instead"
-					},
 					"install": {
 						"type": "string"
 					},
@@ -1351,6 +1343,14 @@
 							"type": "string"
 						},
 						"type": "array"
+					},
+					"tap": {
+						"$ref": "#/$defs/RepoRef",
+						"description": "use repository instead"
+					},
+					"plist": {
+						"type": "string",
+						"description": "use service instead"
 					}
 				},
 				"additionalProperties": false,
@@ -1640,10 +1640,6 @@
 					"name": {
 						"type": "string"
 					},
-					"index": {
-						"$ref": "#/$defs/RepoRef",
-						"description": "use repository instead"
-					},
 					"repository": {
 						"$ref": "#/$defs/RepoRef"
 					},
@@ -1690,6 +1686,10 @@
 								"type": "boolean"
 							}
 						]
+					},
+					"index": {
+						"$ref": "#/$defs/RepoRef",
+						"description": "use repository instead"
 					}
 				},
 				"additionalProperties": false,
@@ -2458,10 +2458,6 @@
 						},
 						"type": "array"
 					},
-					"scoop": {
-						"$ref": "#/$defs/Scoop",
-						"description": "use scoops insteads"
-					},
 					"scoops": {
 						"items": {
 							"$ref": "#/$defs/Scoop"
@@ -2609,10 +2605,6 @@
 						},
 						"type": "array"
 					},
-					"build": {
-						"$ref": "#/$defs/Build",
-						"description": "use builds instead"
-					},
 					"force_token": {
 						"type": "string",
 						"enum": [
@@ -2655,6 +2647,14 @@
 							"$ref": "#/$defs/Fury"
 						},
 						"type": "array"
+					},
+					"scoop": {
+						"$ref": "#/$defs/Scoop",
+						"description": "use scoops instead"
+					},
+					"build": {
+						"$ref": "#/$defs/Build",
+						"description": "use builds instead"
 					}
 				},
 				"additionalProperties": false,
@@ -2704,6 +2704,16 @@
 						},
 						"type": "array"
 					},
+					"disable": {
+						"oneOf": [
+							{
+								"type": "string"
+							},
+							{
+								"type": "boolean"
+							}
+						]
+					},
 					"templated_extra_files": {
 						"items": {
 							"$ref": "#/$defs/TemplatedExtraFile"
@@ -3002,10 +3012,6 @@
 						},
 						"type": "array"
 					},
-					"bucket": {
-						"$ref": "#/$defs/RepoRef",
-						"description": "use repository instead"
-					},
 					"repository": {
 						"$ref": "#/$defs/RepoRef"
 					},
@@ -3075,6 +3081,10 @@
 					},
 					"goamd64": {
 						"type": "string"
+					},
+					"bucket": {
+						"$ref": "#/$defs/RepoRef",
+						"description": "use repository instead"
 					}
 				},
 				"additionalProperties": false,
@@ -3494,6 +3504,12 @@
 						},
 						"type": "array"
 					},
+					"templated_files": {
+						"items": {
+							"$ref": "#/$defs/TemplatedFile"
+						},
+						"type": "array"
+					},
 					"rlcp": {
 						"oneOf": [
 							{
@@ -3504,12 +3520,6 @@
 							}
 						],
 						"description": "you can now remove this"
-					},
-					"templated_files": {
-						"items": {
-							"$ref": "#/$defs/TemplatedFile"
-						},
-						"type": "array"
 					}
 				},
 				"additionalProperties": false,
diff --git a/www/docs/static/schema.json b/www/docs/static/schema.json
index b96be66b..ba3e5c4e 100644
--- a/www/docs/static/schema.json
+++ b/www/docs/static/schema.json
@@ -208,17 +208,6 @@
 					"strip_parent_binary_folder": {
 						"type": "boolean"
 					},
-					"rlcp": {
-						"oneOf": [
-							{
-								"type": "string"
-							},
-							{
-								"type": "boolean"
-							}
-						],
-						"description": "you can now remove this"
-					},
 					"files": {
 						"items": {
 							"$ref": "#/$defs/File"
@@ -230,6 +219,17 @@
 					},
 					"allow_different_binary_count": {
 						"type": "boolean"
+					},
+					"rlcp": {
+						"oneOf": [
+							{
+								"type": "string"
+							},
+							{
+								"type": "boolean"
+							}
+						],
+						"description": "you can now remove this"
 					}
 				},
 				"additionalProperties": false,
@@ -1028,6 +1028,12 @@
 					},
 					"prerelease_suffix": {
 						"type": "string"
+					},
+					"ignore_tags": {
+						"items": {
+							"type": "string"
+						},
+						"type": "array"
 					}
 				},
 				"additionalProperties": false,
@@ -1128,10 +1134,6 @@
 					"name": {
 						"type": "string"
 					},
-					"tap": {
-						"$ref": "#/$defs/RepoRef",
-						"description": "use repository instead"
-					},
 					"repository": {
 						"$ref": "#/$defs/RepoRef"
 					},
@@ -1147,10 +1149,6 @@
 					"caveats": {
 						"type": "string"
 					},
-					"plist": {
-						"type": "string",
-						"description": "use service instead"
-					},
 					"install": {
 						"type": "string"
 					},
@@ -1227,6 +1225,14 @@
 					},
 					"service": {
 						"type": "string"
+					},
+					"tap": {
+						"$ref": "#/$defs/RepoRef",
+						"description": "use repository instead"
+					},
+					"plist": {
+						"type": "string",
+						"description": "use service instead"
 					}
 				},
 				"additionalProperties": false,
@@ -1417,10 +1423,6 @@
 					"name": {
 						"type": "string"
 					},
-					"index": {
-						"$ref": "#/$defs/RepoRef",
-						"description": "use repository instead"
-					},
 					"repository": {
 						"$ref": "#/$defs/RepoRef"
 					},
@@ -1467,6 +1469,10 @@
 								"type": "boolean"
 							}
 						]
+					},
+					"index": {
+						"$ref": "#/$defs/RepoRef",
+						"description": "use repository instead"
 					}
 				},
 				"additionalProperties": false,
@@ -2159,10 +2165,6 @@
 						},
 						"type": "array"
 					},
-					"scoop": {
-						"$ref": "#/$defs/Scoop",
-						"description": "use scoops insteads"
-					},
 					"scoops": {
 						"items": {
 							"$ref": "#/$defs/Scoop"
@@ -2301,10 +2303,6 @@
 						},
 						"type": "array"
 					},
-					"build": {
-						"$ref": "#/$defs/Build",
-						"description": "use builds instead"
-					},
 					"force_token": {
 						"type": "string",
 						"enum": [
@@ -2323,6 +2321,14 @@
 					},
 					"gitea_urls": {
 						"$ref": "#/$defs/GiteaURLs"
+					},
+					"scoop": {
+						"$ref": "#/$defs/Scoop",
+						"description": "use scoops instead"
+					},
+					"build": {
+						"$ref": "#/$defs/Build",
+						"description": "use builds instead"
 					}
 				},
 				"additionalProperties": false,
@@ -2371,6 +2377,16 @@
 							"$ref": "#/$defs/ExtraFile"
 						},
 						"type": "array"
+					},
+					"disable": {
+						"oneOf": [
+							{
+								"type": "string"
+							},
+							{
+								"type": "boolean"
+							}
+						]
 					}
 				},
 				"additionalProperties": false,
@@ -2652,10 +2668,6 @@
 						},
 						"type": "array"
 					},
-					"bucket": {
-						"$ref": "#/$defs/RepoRef",
-						"description": "use repository instead"
-					},
 					"repository": {
 						"$ref": "#/$defs/RepoRef"
 					},
@@ -2725,6 +2737,10 @@
 					},
 					"goamd64": {
 						"type": "string"
+					},
+					"bucket": {
+						"$ref": "#/$defs/RepoRef",
+						"description": "use repository instead"
 					}
 				},
 				"additionalProperties": false,
@@ -2923,6 +2939,16 @@
 					"plugs": {
 						"type": "object"
 					},
+					"disable": {
+						"oneOf": [
+							{
+								"type": "string"
+							},
+							{
+								"type": "boolean"
+							}
+						]
+					},
 					"extra_files": {
 						"items": {
 							"$ref": "#/$defs/SnapcraftExtraFiles"
@@ -3222,7 +3248,14 @@
 			"UPX": {
 				"properties": {
 					"enabled": {
-						"type": "boolean"
+						"oneOf": [
+							{
+								"type": "string"
+							},
+							{
+								"type": "boolean"
+							}
+						]
 					},
 					"ids": {
 						"items": {


Test patch:
diff --git a/cmd/util_test.go b/cmd/util_test.go
index c4ea0d4c..2a220a52 100644
--- a/cmd/util_test.go
+++ b/cmd/util_test.go
@@ -62,7 +62,7 @@ func goModInit(tb testing.TB) {
 	tb.Helper()
 	createFile(tb, "go.mod", `module foo
 
-go 1.20
+go 1.21
 `)
 }
 
diff --git a/internal/artifact/artifact_test.go b/internal/artifact/artifact_test.go
index 9993d3d8..45647362 100644
--- a/internal/artifact/artifact_test.go
+++ b/internal/artifact/artifact_test.go
@@ -409,7 +409,7 @@ func TestExtra(t *testing.T) {
 
 	t.Run("unmarshal error", func(t *testing.T) {
 		_, err := Extra[config.Docker](a, "fail-plz")
-		require.EqualError(t, err, "json: unknown field \"tap\"")
+		require.EqualError(t, err, "json: unknown field \"repository\"")
 	})
 
 	t.Run("marshal error", func(t *testing.T) {
diff --git a/internal/builders/buildtarget/targets_test.go b/internal/builders/buildtarget/targets_test.go
index d9034f26..4f971c53 100644
--- a/internal/builders/buildtarget/targets_test.go
+++ b/internal/builders/buildtarget/targets_test.go
@@ -19,6 +19,7 @@ func TestAllBuildTargets(t *testing.T) {
 			"windows",
 			"js",
 			"ios",
+			"wasip1",
 		},
 		Goarch: []string{
 			"386",
@@ -111,6 +112,7 @@ func TestAllBuildTargets(t *testing.T) {
 			"windows_arm64",
 			"js_wasm",
 			"ios_arm64",
+			"wasip1_wasm",
 		}, result)
 	})
 
diff --git a/internal/client/gitea_test.go b/internal/client/gitea_test.go
index b67e5de2..145dae66 100644
--- a/internal/client/gitea_test.go
+++ b/internal/client/gitea_test.go
@@ -7,11 +7,11 @@ import (
 	"os"
 	"strings"
 	"testing"
-	"text/template"
 
 	"code.gitea.io/sdk/gitea"
 	"github.com/goreleaser/goreleaser/internal/artifact"
 	"github.com/goreleaser/goreleaser/internal/testctx"
+	"github.com/goreleaser/goreleaser/internal/tmpl"
 	"github.com/goreleaser/goreleaser/pkg/config"
 	"github.com/goreleaser/goreleaser/pkg/context"
 	"github.com/jarcoal/httpmock"
@@ -102,7 +102,7 @@ func (s *GetInstanceURLSuite) TestTemplateMissingValue() {
 	})
 
 	result, err := getInstanceURL(ctx)
-	require.ErrorAs(t, err, &template.ExecError{})
+	require.ErrorAs(t, err, &tmpl.Error{})
 	require.Empty(t, result)
 }
 
diff --git a/internal/client/github_test.go b/internal/client/github_test.go
index 417bd6cc..013d438b 100644
--- a/internal/client/github_test.go
+++ b/internal/client/github_test.go
@@ -13,9 +13,10 @@ import (
 	"text/template"
 	"time"
 
-	"github.com/google/go-github/v53/github"
+	"github.com/google/go-github/v54/github"
 	"github.com/goreleaser/goreleaser/internal/artifact"
 	"github.com/goreleaser/goreleaser/internal/testctx"
+	"github.com/goreleaser/goreleaser/internal/testlib"
 	"github.com/goreleaser/goreleaser/pkg/config"
 	"github.com/stretchr/testify/require"
 )
@@ -197,7 +198,7 @@ func TestGitHubCreateReleaseWrongNameTemplate(t *testing.T) {
 
 	str, err := client.CreateRelease(ctx, "")
 	require.Empty(t, str)
-	require.EqualError(t, err, `template: tmpl:1: unclosed action`)
+	testlib.RequireTemplateError(t, err)
 }
 
 func TestGitHubGetDefaultBranch(t *testing.T) {
@@ -651,6 +652,55 @@ func TestGitHubOpenPullRequestBaseEmpty(t *testing.T) {
 	}))
 	defer srv.Close()
 
+	ctx := testctx.NewWithCfg(config.Project{
+		GitHubURLs: config.GitHubURLs{
+			API: srv.URL + "/",
+		},
+	})
+	client, err := newGitHub(ctx, "test-token")
+	require.NoError(t, err)
+	repo := Repo{
+		Owner:  "someone",
+		Name:   "something",
+		Branch: "foo",
+	}
+
+	require.NoError(t, client.OpenPullRequest(ctx, Repo{}, repo, "some title", false))
+}
+
+func TestGitHubOpenPullRequestHeadEmpty(t *testing.T) {
+	srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+		defer r.Body.Close()
+
+		if r.URL.Path == "/repos/someone/something/contents/.github/PULL_REQUEST_TEMPLATE.md" {
+			w.WriteHeader(http.StatusNotFound)
+			return
+		}
+
+		if r.URL.Path == "/repos/someone/something/pulls" {
+			r, err := os.Open("testdata/github/pull.json")
+			require.NoError(t, err)
+			_, err = io.Copy(w, r)
+			require.NoError(t, err)
+			return
+		}
+
+		if r.URL.Path == "/repos/someone/something" {
+			w.WriteHeader(http.StatusOK)
+			fmt.Fprint(w, `{"default_branch": "main"}`)
+			return
+		}
+
+		if r.URL.Path == "/rate_limit" {
+			w.WriteHeader(http.StatusOK)
+			fmt.Fprint(w, `{"resources":{"core":{"remaining":120}}}`)
+			return
+		}
+
+		t.Error("unhandled request: " + r.URL.Path)
+	}))
+	defer srv.Close()
+
 	ctx := testctx.NewWithCfg(config.Project{
 		GitHubURLs: config.GitHubURLs{
 			API: srv.URL + "/",
diff --git a/internal/exec/exec_test.go b/internal/exec/exec_test.go
index 621a6eae..6e7b6e8b 100644
--- a/internal/exec/exec_test.go
+++ b/internal/exec/exec_test.go
@@ -8,7 +8,9 @@ import (
 	"testing"
 
 	"github.com/goreleaser/goreleaser/internal/artifact"
+	"github.com/goreleaser/goreleaser/internal/pipe"
 	"github.com/goreleaser/goreleaser/internal/testctx"
+	"github.com/goreleaser/goreleaser/internal/tmpl"
 	"github.com/goreleaser/goreleaser/pkg/config"
 	"github.com/stretchr/testify/require"
 )
@@ -87,9 +89,10 @@ func TestExecute(t *testing.T) {
 	}
 
 	testCases := []struct {
-		name       string
-		publishers []config.Publisher
-		expectErr  error
+		name        string
+		publishers  []config.Publisher
+		expectErr   error
+		expectErrAs any
 	}{
 		{
 			"filter by IDs",
@@ -108,13 +111,15 @@ func TestExecute(t *testing.T) {
 				},
 			},
 			nil,
+			nil,
 		},
 		{
 			"no filter",
 			[]config.Publisher{
 				{
-					Name: "test",
-					Cmd:  MockCmd + " {{ .ArtifactName }}",
+					Name:    "test",
+					Cmd:     MockCmd + " {{ .ArtifactName }}",
+					Disable: "false",
 					Env: []string{
 						MarshalMockEnv(&MockData{
 							AnyOf: []MockCall{
@@ -129,6 +134,33 @@ func TestExecute(t *testing.T) {
 				},
 			},
 			nil,
+			nil,
+		},
+		{
+			"disabled",
+			[]config.Publisher{
+				{
+					Name:    "test",
+					Cmd:     MockCmd + " {{ .ArtifactName }}",
+					Disable: "true",
+					Env:     []string{},
+				},
+			},
+			pipe.ErrSkip{},
+			nil,
+		},
+		{
+			"disabled invalid tmpl",
+			[]config.Publisher{
+				{
+					Name:    "test",
+					Cmd:     MockCmd + " {{ .ArtifactName }}",
+					Disable: "{{ .NOPE }}",
+					Env:     []string{},
+				},
+			},
+			nil,
+			&tmpl.Error{},
 		},
 		{
 			"include checksum",
@@ -152,6 +184,7 @@ func TestExecute(t *testing.T) {
 				},
 			},
 			nil,
+			nil,
 		},
 		{
 			"include signatures",
@@ -176,6 +209,7 @@ func TestExecute(t *testing.T) {
 				},
 			},
 			nil,
+			nil,
 		},
 		{
 			"docker",
@@ -195,6 +229,7 @@ func TestExecute(t *testing.T) {
 				},
 			},
 			nil,
+			nil,
 		},
 		{
 			"extra files",
@@ -220,6 +255,7 @@ func TestExecute(t *testing.T) {
 				},
 			},
 			nil,
+			nil,
 		},
 		{
 			"extra files with rename",
@@ -248,6 +284,7 @@ func TestExecute(t *testing.T) {
 				},
 			},
 			nil,
+			nil,
 		},
 		{
 			"try dir templating",
@@ -268,6 +305,7 @@ func TestExecute(t *testing.T) {
 				},
 			},
 			nil,
+			nil,
 		},
 		{
 			"check env templating",
@@ -295,6 +333,7 @@ func TestExecute(t *testing.T) {
 				},
 			},
 			nil,
+			nil,
 		},
 		{
 			"override path",
@@ -320,10 +359,14 @@ func TestExecute(t *testing.T) {
 				},
 			},
 			nil,
+			nil,
 		},
 		{
 			"command error",
 			[]config.Publisher{
+				{
+					Disable: "true",
+				},
 				{
 					Name: "test",
 					IDs:  []string{"debpkg"},
@@ -344,18 +387,23 @@ func TestExecute(t *testing.T) {
 			},
 			// stderr is sent to output via logger
 			fmt.Errorf(`publishing: %s failed: exit status 1: test error`, MockCmd),
+			nil,
 		},
 	}
 
 	for i, tc := range testCases {
 		t.Run(fmt.Sprintf("%d-%s", i, tc.name), func(t *testing.T) {
 			err := Execute(ctx, tc.publishers)
-			if tc.expectErr == nil {
-				require.NoError(t, err)
+			if tc.expectErr != nil {
+				require.Error(t, err)
+				require.True(t, strings.HasPrefix(err.Error(), tc.expectErr.Error()), err.Error())
+				return
+			}
+			if tc.expectErrAs != nil {
+				require.ErrorAs(t, err, tc.expectErrAs)
 				return
 			}
-			require.Error(t, err)
-			require.True(t, strings.HasPrefix(err.Error(), tc.expectErr.Error()))
+			require.NoError(t, err)
 		})
 	}
 }
diff --git a/internal/extrafiles/extra_files_test.go b/internal/extrafiles/extra_files_test.go
index 1cea6db6..ac3c559a 100644
--- a/internal/extrafiles/extra_files_test.go
+++ b/internal/extrafiles/extra_files_test.go
@@ -4,6 +4,7 @@ import (
 	"testing"
 
 	"github.com/goreleaser/goreleaser/internal/testctx"
+	"github.com/goreleaser/goreleaser/internal/testlib"
 	"github.com/goreleaser/goreleaser/pkg/config"
 	"github.com/stretchr/testify/require"
 )
@@ -30,7 +31,7 @@ func TestBadTemplate(t *testing.T) {
 	ctx := testctx.New()
 	files, err := Find(ctx, globs)
 	require.Empty(t, files)
-	require.EqualError(t, err, `failed to apply template to glob "./testdata/file{{ .Env.NOPE }}.golden": template: tmpl:1:22: executing "tmpl" at <.Env.NOPE>: map has no entry for key "NOPE"`)
+	testlib.RequireTemplateError(t, err)
 }
 
 func TestShouldGetSpecificFile(t *testing.T) {
@@ -123,7 +124,7 @@ func TestTargetInvalidNameTemplate(t *testing.T) {
 	ctx := testctx.New()
 	files, err := Find(ctx, globs)
 	require.Empty(t, files)
-	require.EqualError(t, err, `failed to apply template to name "file1_{{.Env.HONK}}.golden": template: tmpl:1:12: executing "tmpl" at <.Env.HONK>: map has no entry for key "HONK"`)
+	testlib.RequireTemplateError(t, err)
 }
 
 func TestTargetNameMatchesMultipleFiles(t *testing.T) {
diff --git a/internal/pipe/archive/archive_meta_test.go b/internal/pipe/archive/archive_meta_test.go
index cb7244a7..f947a561 100644
--- a/internal/pipe/archive/archive_meta_test.go
+++ b/internal/pipe/archive/archive_meta_test.go
@@ -51,7 +51,7 @@ func TestMeta(t *testing.T) {
 		})
 
 		require.NoError(t, Pipe{}.Default(ctx))
-		require.EqualError(t, Pipe{}.Run(ctx), `template: tmpl:1:5: executing "tmpl" at <.Os>: map has no entry for key "Os"`)
+		testlib.RequireTemplateError(t, Pipe{}.Run(ctx))
 	})
 
 	t.Run("no files", func(t *testing.T) {
diff --git a/internal/pipe/archive/archive_test.go b/internal/pipe/archive/archive_test.go
index 447c560e..c3231a17 100644
--- a/internal/pipe/archive/archive_test.go
+++ b/internal/pipe/archive/archive_test.go
@@ -655,7 +655,7 @@ func TestRunPipeInvalidWrapInDirectoryTemplate(t *testing.T) {
 			artifact.ExtraID:     "default",
 		},
 	})
-	require.EqualError(t, Pipe{}.Run(ctx), `template: tmpl:1: unexpected "}" in operand`)
+	testlib.RequireTemplateError(t, Pipe{}.Run(ctx))
 }
 
 func TestRunPipeWrap(t *testing.T) {
diff --git a/internal/pipe/aur/aur_test.go b/internal/pipe/aur/aur_test.go
index cdbfd3c5..83f02c16 100644
--- a/internal/pipe/aur/aur_test.go
+++ b/internal/pipe/aur/aur_test.go
@@ -150,11 +150,12 @@ func TestSrcInfoSimple(t *testing.T) {
 
 func TestFullPipe(t *testing.T) {
 	type testcase struct {
-		prepare                func(ctx *context.Context)
-		expectedRunError       string
-		expectedPublishError   string
-		expectedPublishErrorIs error
-		expectedErrorCheck     func(testing.TB, error)
+		prepare                   func(ctx *context.Context)
+		expectedRunError          string
+		expectedRunErrorCheck     func(testing.TB, error)
+		expectedPublishError      string
+		expectedPublishErrorIs    error
+		expectedPublishErrorCheck func(testing.TB, error)
 	}
 	for name, tt := range map[string]testcase{
 		"default": {
@@ -185,25 +186,25 @@ func TestFullPipe(t *testing.T) {
 			prepare: func(ctx *context.Context) {
 				ctx.Config.AURs[0].Name = "{{ .Asdsa }"
 			},
-			expectedRunError: `template: tmpl:1: unexpected "}" in operand`,
+			expectedRunErrorCheck: testlib.RequireTemplateError,
 		},
 		"invalid-package-template": {
 			prepare: func(ctx *context.Context) {
 				ctx.Config.AURs[0].Package = "{{ .Asdsa }"
 			},
-			expectedRunError: `template: tmpl:1: unexpected "}" in operand`,
+			expectedRunErrorCheck: testlib.RequireTemplateError,
 		},
 		"invalid-commit-template": {
 			prepare: func(ctx *context.Context) {
 				ctx.Config.AURs[0].CommitMessageTemplate = "{{ .Asdsa }"
 			},
-			expectedErrorCheck: testlib.RequireTemplateError,
+			expectedPublishErrorCheck: testlib.RequireTemplateError,
 		},
 		"invalid-key-template": {
 			prepare: func(ctx *context.Context) {
 				ctx.Config.AURs[0].PrivateKey = "{{ .Asdsa }"
 			},
-			expectedErrorCheck: testlib.RequireTemplateError,
+			expectedPublishErrorCheck: testlib.RequireTemplateError,
 		},
 		"no-key": {
 			prepare: func(ctx *context.Context) {
@@ -221,7 +222,7 @@ func TestFullPipe(t *testing.T) {
 			prepare: func(ctx *context.Context) {
 				ctx.Config.AURs[0].GitURL = "{{ .Asdsa }"
 			},
-			expectedErrorCheck: testlib.RequireTemplateError,
+			expectedPublishErrorCheck: testlib.RequireTemplateError,
 		},
 		"no-git-url": {
 			prepare: func(ctx *context.Context) {
@@ -233,13 +234,13 @@ func TestFullPipe(t *testing.T) {
 			prepare: func(ctx *context.Context) {
 				ctx.Config.AURs[0].GitSSHCommand = "{{ .Asdsa }"
 			},
-			expectedErrorCheck: testlib.RequireTemplateError,
+			expectedPublishErrorCheck: testlib.RequireTemplateError,
 		},
 		"invalid-commit-author-template": {
 			prepare: func(ctx *context.Context) {
 				ctx.Config.AURs[0].CommitAuthor.Name = "{{ .Asdsa }"
 			},
-			expectedErrorCheck: testlib.RequireTemplateError,
+			expectedPublishErrorCheck: testlib.RequireTemplateError,
 		},
 	} {
 		t.Run(name, func(t *testing.T) {
@@ -321,6 +322,10 @@ func TestFullPipe(t *testing.T) {
 				require.EqualError(t, runAll(ctx, client), tt.expectedRunError)
 				return
 			}
+			if tt.expectedRunErrorCheck != nil {
+				tt.expectedRunErrorCheck(t, runAll(ctx, client))
+				return
+			}
 			require.NoError(t, runAll(ctx, client))
 
 			if tt.expectedPublishError != "" {
@@ -333,8 +338,8 @@ func TestFullPipe(t *testing.T) {
 				return
 			}
 
-			if tt.expectedErrorCheck != nil {
-				tt.expectedErrorCheck(t, Pipe{}.Publish(ctx))
+			if tt.expectedPublishErrorCheck != nil {
+				tt.expectedPublishErrorCheck(t, Pipe{}.Publish(ctx))
 				return
 			}
 
diff --git a/internal/pipe/before/before_test.go b/internal/pipe/before/before_test.go
index 54ef2f0e..4885386d 100644
--- a/internal/pipe/before/before_test.go
+++ b/internal/pipe/before/before_test.go
@@ -7,6 +7,7 @@ import (
 
 	"github.com/caarlos0/log"
 	"github.com/goreleaser/goreleaser/internal/testctx"
+	"github.com/goreleaser/goreleaser/internal/testlib"
 	"github.com/goreleaser/goreleaser/pkg/config"
 	"github.com/stretchr/testify/require"
 )
@@ -83,13 +84,13 @@ func TestRunWithEnv(t *testing.T) {
 }
 
 func TestInvalidTemplate(t *testing.T) {
-	require.EqualError(t, Pipe{}.Run(testctx.NewWithCfg(
+	testlib.RequireTemplateError(t, Pipe{}.Run(testctx.NewWithCfg(
 		config.Project{
 			Before: config.Before{
 				Hooks: []string{"touch {{ .fasdsd }"},
 			},
 		},
-	)), `template: tmpl:1: unexpected "}" in operand`)
+	)))
 }
 
 func TestSkip(t *testing.T) {
diff --git a/internal/pipe/brew/brew_test.go b/internal/pipe/brew/brew_test.go
index e2b1ac7d..c1c18b62 100644
--- a/internal/pipe/brew/brew_test.go
+++ b/internal/pipe/brew/brew_test.go
@@ -12,6 +12,7 @@ import (
 	"github.com/goreleaser/goreleaser/internal/golden"
 	"github.com/goreleaser/goreleaser/internal/testctx"
 	"github.com/goreleaser/goreleaser/internal/testlib"
+	"github.com/goreleaser/goreleaser/internal/tmpl"
 	"github.com/goreleaser/goreleaser/pkg/config"
 	"github.com/goreleaser/goreleaser/pkg/context"
 	"github.com/stretchr/testify/require"
@@ -161,9 +162,11 @@ func TestSplit(t *testing.T) {
 
 func TestFullPipe(t *testing.T) {
 	type testcase struct {
-		prepare              func(ctx *context.Context)
-		expectedRunError     string
-		expectedPublishError string
+		prepare                func(ctx *context.Context)
+		expectedRunError       string
+		expectedRunErrorAs     any
+		expectedPublishError   string
+		expectedPublishErrorAs any
 	}
 	for name, tt := range map[string]testcase{
 		"default": {
@@ -247,7 +250,7 @@ func TestFullPipe(t *testing.T) {
 				ctx.Config.Brews[0].Repository.Name = "test"
 				ctx.Config.Brews[0].CommitMessageTemplate = "{{ .Asdsa }"
 			},
-			expectedPublishError: `template: tmpl:1: unexpected "}" in operand`,
+			expectedPublishErrorAs: &tmpl.Error{},
 		},
 		"valid_repository_templates": {
 			prepare: func(ctx *context.Context) {
@@ -264,14 +267,14 @@ func TestFullPipe(t *testing.T) {
 				ctx.Config.Brews[0].Repository.Owner = "test"
 				ctx.Config.Brews[0].Repository.Name = "{{ .Asdsa }"
 			},
-			expectedRunError: `template: tmpl:1: unexpected "}" in operand`,
+			expectedRunErrorAs: &tmpl.Error{},
 		},
 		"invalid_repository_owner_template": {
 			prepare: func(ctx *context.Context) {
 				ctx.Config.Brews[0].Repository.Owner = "{{ .Asdsa }"
 				ctx.Config.Brews[0].Repository.Name = "test"
 			},
-			expectedRunError: `template: tmpl:1: unexpected "}" in operand`,
+			expectedRunErrorAs: &tmpl.Error{},
 		},
 		"invalid_repository_skip_upload_template": {
 			prepare: func(ctx *context.Context) {
@@ -279,7 +282,7 @@ func TestFullPipe(t *testing.T) {
 				ctx.Config.Brews[0].Repository.Owner = "test"
 				ctx.Config.Brews[0].Repository.Name = "test"
 			},
-			expectedRunError: `template: tmpl:1: unexpected "}" in operand`,
+			expectedRunErrorAs: &tmpl.Error{},
 		},
 		"invalid_install_template": {
 			prepare: func(ctx *context.Context) {
@@ -287,7 +290,7 @@ func TestFullPipe(t *testing.T) {
 				ctx.Config.Brews[0].Repository.Name = "test"
 				ctx.Config.Brews[0].Install = "{{ .aaaa }"
 			},
-			expectedRunError: `template: tmpl:1: unexpected "}" in operand`,
+			expectedRunErrorAs: &tmpl.Error{},
 		},
 	} {
 		t.Run(name, func(t *testing.T) {
@@ -381,18 +384,27 @@ func TestFullPipe(t *testing.T) {
 
 			require.NoError(t, Pipe{}.Default(ctx))
 
-			if tt.expectedRunError == "" {
-				require.NoError(t, runAll(ctx, client))
-			} else {
-				require.EqualError(t, runAll(ctx, client), tt.expectedRunError)
+			err = runAll(ctx, client)
+			if tt.expectedRunError != "" {
+				require.EqualError(t, err, tt.expectedRunError)
 				return
 			}
-			if tt.expectedPublishError != "" {
-				require.EqualError(t, publishAll(ctx, client), tt.expectedPublishError)
+			if tt.expectedRunErrorAs != nil {
+				require.ErrorAs(t, err, tt.expectedRunErrorAs)
 				return
 			}
+			require.NoError(t, err)
 
-			require.NoError(t, publishAll(ctx, client))
+			err = publishAll(ctx, client)
+			if tt.expectedPublishError != "" {
+				require.EqualError(t, err, tt.expectedPublishError)
+				return
+			}
+			if tt.expectedPublishErrorAs != nil {
+				require.ErrorAs(t, err, tt.expectedPublishErrorAs)
+				return
+			}
+			require.NoError(t, err)
 
 			content := []byte(client.Content)
 			if url := ctx.Config.Brews[0].Repository.Git.URL; url == "" {
diff --git a/internal/pipe/build/build_test.go b/internal/pipe/build/build_test.go
index 1a0a7c54..8c24f5ef 100644
--- a/internal/pipe/build/build_test.go
+++ b/internal/pipe/build/build_test.go
@@ -562,7 +562,7 @@ func TestPipeOnBuild_invalidBinaryTpl(t *testing.T) {
 	})
 	g := semerrgroup.New(ctx.Parallelism)
 	runPipeOnBuild(ctx, g, build)
-	require.EqualError(t, g.Wait(), `template: tmpl:1:11: executing "tmpl" at <.XYZ>: map has no entry for key "XYZ"`)
+	testlib.RequireTemplateError(t, g.Wait())
 }
 
 func TestBuildOptionsForTarget(t *testing.T) {
diff --git a/internal/pipe/checksums/checksums_test.go b/internal/pipe/checksums/checksums_test.go
index 759ce9b7..0e65cdbd 100644
--- a/internal/pipe/checksums/checksums_test.go
+++ b/internal/pipe/checksums/checksums_test.go
@@ -9,6 +9,7 @@ import (
 
 	"github.com/goreleaser/goreleaser/internal/artifact"
 	"github.com/goreleaser/goreleaser/internal/testctx"
+	"github.com/goreleaser/goreleaser/internal/testlib"
 	"github.com/goreleaser/goreleaser/pkg/config"
 	"github.com/stretchr/testify/require"
 )
@@ -159,9 +160,9 @@ func TestPipeInvalidNameTemplate(t *testing.T) {
 	_, err = binFile.WriteString("fake artifact")
 	require.NoError(t, err)
 
-	for template, eerr := range map[string]string{
-		"{{ .Pro }_checksums.txt": `template: tmpl:1: unexpected "}" in operand`,
-		"{{.Env.NOPE}}":           `template: tmpl:1:6: executing "tmpl" at <.Env.NOPE>: map has no entry for key "NOPE"`,
+	for _, template := range []string{
+		"{{ .Pro }_checksums.txt",
+		"{{.Env.NOPE}}",
 	} {
 		t.Run(template, func(t *testing.T) {
 			folder := t.TempDir()
@@ -181,9 +182,7 @@ func TestPipeInvalidNameTemplate(t *testing.T) {
 				Type: artifact.UploadableBinary,
 				Path: binFile.Name(),
 			})
-			err = Pipe{}.Run(ctx)
-			require.Error(t, err)
-			require.Equal(t, eerr, err.Error())
+			testlib.RequireTemplateError(t, Pipe{}.Run(ctx))
 		})
 	}
 }
diff --git a/internal/pipe/discord/discord_test.go b/internal/pipe/discord/discord_test.go
index f901be46..18de1314 100644
--- a/internal/pipe/discord/discord_test.go
+++ b/internal/pipe/discord/discord_test.go
@@ -4,6 +4,7 @@ import (
 	"testing"
 
 	"github.com/goreleaser/goreleaser/internal/testctx"
+	"github.com/goreleaser/goreleaser/internal/testlib"
 	"github.com/goreleaser/goreleaser/pkg/config"
 	"github.com/stretchr/testify/require"
 )
@@ -26,7 +27,7 @@ func TestAnnounceInvalidTemplate(t *testing.T) {
 			},
 		},
 	})
-	require.EqualError(t, Pipe{}.Announce(ctx), `discord: template: tmpl:1: unexpected "}" in operand`)
+	testlib.RequireTemplateError(t, Pipe{}.Announce(ctx))
 }
 
 func TestAnnounceMissingEnv(t *testing.T) {
diff --git a/internal/pipe/env/env_test.go b/internal/pipe/env/env_test.go
index fccf89c6..0c6a4c6d 100644
--- a/internal/pipe/env/env_test.go
+++ b/internal/pipe/env/env_test.go
@@ -78,7 +78,7 @@ func TestSetDefaultTokenFiles(t *testing.T) {
 				"FOO={{ .Asss }",
 			},
 		})
-		require.EqualError(t, Pipe{}.Run(ctx), `template: tmpl:1: unexpected "}" in operand`)
+		testlib.RequireTemplateError(t, Pipe{}.Run(ctx))
 	})
 
 	t.Run("no token", func(t *testing.T) {
diff --git a/internal/pipe/git/git_test.go b/internal/pipe/git/git_test.go
index 4516f3c5..15c8cdad 100644
--- a/internal/pipe/git/git_test.go
+++ b/internal/pipe/git/git_test.go
@@ -358,3 +358,73 @@ func TestPreviousTagFromCI(t *testing.T) {
 		})
 	}
 }
+
+func TestFilterTags(t *testing.T) {
+	testlib.Mktmp(t)
+	testlib.GitInit(t)
+	testlib.GitRemoteAdd(t, "git@github.com:foo/bar.git")
+	testlib.GitCommit(t, "commit1")
+	testlib.GitTag(t, "v0.0.1")
+	testlib.GitTag(t, "nightly")
+	testlib.GitCommit(t, "commit2")
+	testlib.GitTag(t, "v0.0.2")
+	testlib.GitTag(t, "v0.1.0-dev")
+
+	t.Run("no filter", func(t *testing.T) {
+		ctx := testctx.New()
+		require.NoError(t, Pipe{}.Run(ctx))
+		require.Equal(t, "v0.0.1", ctx.Git.PreviousTag)
+		require.Equal(t, "v0.1.0-dev", ctx.Git.CurrentTag)
+	})
+
+	t.Run("regex", func(t *testing.T) {
+		ctx := testctx.NewWithCfg(config.Project{
+			Git: config.Git{
+				IgnoreTags: []string{
+					".*-dev",
+				},
+			},
+		})
+		require.NoError(t, Pipe{}.Run(ctx))
+		require.Equal(t, "v0.0.1", ctx.Git.PreviousTag)
+		require.Equal(t, "v0.0.2", ctx.Git.CurrentTag)
+	})
+
+	t.Run("template", func(t *testing.T) {
+		ctx := testctx.NewWithCfg(config.Project{
+			Git: config.Git{
+				IgnoreTags: []string{
+					"{{.Env.PREFIX}}.*",
+					"nightly",
+				},
+			},
+		}, testctx.WithEnv(map[string]string{
+			"PREFIX": `v0\.0\.`,
+		}))
+		require.NoError(t, Pipe{}.Run(ctx))
+		require.Empty(t, ctx.Git.PreviousTag)
+		require.Equal(t, "v0.1.0-dev", ctx.Git.CurrentTag)
+	})
+
+	t.Run("invalid regex", func(t *testing.T) {
+		ctx := testctx.NewWithCfg(config.Project{
+			Git: config.Git{
+				IgnoreTags: []string{
+					"[",
+				},
+			},
+		})
+		require.EqualError(t, Pipe{}.Run(ctx), "could not get current tag: error parsing regexp: missing closing ]: `[`")
+	})
+
+	t.Run("invalid template", func(t *testing.T) {
+		ctx := testctx.NewWithCfg(config.Project{
+			Git: config.Git{
+				IgnoreTags: []string{
+					"{{.Env.Nope}}",
+				},
+			},
+		})
+		testlib.RequireTemplateError(t, Pipe{}.Run(ctx))
+	})
+}
diff --git a/internal/pipe/gomod/gomod_proxy_test.go b/internal/pipe/gomod/gomod_proxy_test.go
index 180f8a3b..0b93df60 100644
--- a/internal/pipe/gomod/gomod_proxy_test.go
+++ b/internal/pipe/gomod/gomod_proxy_test.go
@@ -205,8 +205,7 @@ func requireGoMod(tb testing.TB) {
 	require.NoError(tb, err)
 	require.Contains(tb, string(mod), `module foo
 
-go 1.20
-`)
+go 1.21`)
 }
 
 func fakeGoModAndSum(tb testing.TB, module string) {
diff --git a/internal/pipe/ko/testdata/app/go.mod b/internal/pipe/ko/testdata/app/go.mod
index 174022eb..8a847c57 100644
--- a/internal/pipe/ko/testdata/app/go.mod
+++ b/internal/pipe/ko/testdata/app/go.mod
@@ -1,3 +1,3 @@
 module testapp
 
-go 1.20
+go 1.21
diff --git a/internal/pipe/krew/krew_test.go b/internal/pipe/krew/krew_test.go
index a4d88a93..91110efa 100644
--- a/internal/pipe/krew/krew_test.go
+++ b/internal/pipe/krew/krew_test.go
@@ -15,6 +15,7 @@ import (
 	"github.com/goreleaser/goreleaser/internal/golden"
 	"github.com/goreleaser/goreleaser/internal/testctx"
 	"github.com/goreleaser/goreleaser/internal/testlib"
+	"github.com/goreleaser/goreleaser/internal/tmpl"
 	"github.com/goreleaser/goreleaser/pkg/config"
 	"github.com/goreleaser/goreleaser/pkg/context"
 	"github.com/stretchr/testify/require"
@@ -134,9 +135,11 @@ func TestSimple(t *testing.T) {
 
 func TestFullPipe(t *testing.T) {
 	type testcase struct {
-		prepare              func(ctx *context.Context)
-		expectedRunError     string
-		expectedPublishError string
+		prepare                func(ctx *context.Context)
+		expectedRunError       string
+		expectedRunErrorAs     any
+		expectedPublishError   string
+		expectedPublishErrorAs any
 	}
 	for name, tt := range map[string]testcase{
 		"default": {
@@ -175,7 +178,7 @@ func TestFullPipe(t *testing.T) {
 				ctx.Config.Krews[0].Repository.Name = "test"
 				ctx.Config.Krews[0].CommitMessageTemplate = "{{ .Asdsa }"
 			},
-			expectedPublishError: `template: tmpl:1: unexpected "}" in operand`,
+			expectedPublishErrorAs: &tmpl.Error{},
 		},
 		"invalid desc": {
 			prepare: func(ctx *context.Context) {
@@ -183,7 +186,7 @@ func TestFullPipe(t *testing.T) {
 				ctx.Config.Krews[0].Repository.Name = "test"
 				ctx.Config.Krews[0].Description = "{{ .Asdsa }"
 			},
-			expectedRunError: `failed to apply template: {{ .Asdsa }: template: tmpl:1: unexpected "}" in operand`,
+			expectedRunErrorAs: &tmpl.Error{},
 		},
 		"invalid short desc": {
 			prepare: func(ctx *context.Context) {
@@ -191,7 +194,7 @@ func TestFullPipe(t *testing.T) {
 				ctx.Config.Krews[0].Repository.Name = "test"
 				ctx.Config.Krews[0].ShortDescription = "{{ .Asdsa }"
 			},
-			expectedRunError: `failed to apply template: {{ .Asdsa }: template: tmpl:1: unexpected "}" in operand`,
+			expectedRunErrorAs: &tmpl.Error{},
 		},
 		"invalid homepage": {
 			prepare: func(ctx *context.Context) {
@@ -199,7 +202,7 @@ func TestFullPipe(t *testing.T) {
 				ctx.Config.Krews[0].Repository.Name = "test"
 				ctx.Config.Krews[0].Homepage = "{{ .Asdsa }"
 			},
-			expectedRunError: `failed to apply template: {{ .Asdsa }: template: tmpl:1: unexpected "}" in operand`,
+			expectedRunErrorAs: &tmpl.Error{},
 		},
 		"invalid name": {
 			prepare: func(ctx *context.Context) {
@@ -207,7 +210,7 @@ func TestFullPipe(t *testing.T) {
 				ctx.Config.Krews[0].Repository.Name = "test"
 				ctx.Config.Krews[0].Name = "{{ .Asdsa }"
 			},
-			expectedRunError: `failed to apply template: {{ .Asdsa }: template: tmpl:1: unexpected "}" in operand`,
+			expectedRunErrorAs: &tmpl.Error{},
 		},
 		"invalid caveats": {
 			prepare: func(ctx *context.Context) {
@@ -215,7 +218,7 @@ func TestFullPipe(t *testing.T) {
 				ctx.Config.Krews[0].Repository.Name = "test"
 				ctx.Config.Krews[0].Caveats = "{{ .Asdsa }"
 			},
-			expectedRunError: `failed to apply template: {{ .Asdsa }: template: tmpl:1: unexpected "}" in operand`,
+			expectedRunErrorAs: &tmpl.Error{},
 		},
 		"no short desc": {
 			prepare: func(ctx *context.Context) {
@@ -304,11 +307,16 @@ func TestFullPipe(t *testing.T) {
 			distFile := filepath.Join(folder, "krew", name+".yaml")
 
 			require.NoError(t, Pipe{}.Default(ctx))
+
 			err = runAll(ctx, client)
 			if tt.expectedRunError != "" {
 				require.EqualError(t, err, tt.expectedRunError)
 				return
 			}
+			if tt.expectedRunErrorAs != nil {
+				require.ErrorAs(t, err, tt.expectedRunErrorAs)
+				return
+			}
 			require.NoError(t, err)
 
 			err = publishAll(ctx, client)
@@ -316,7 +324,10 @@ func TestFullPipe(t *testing.T) {
 				require.EqualError(t, err, tt.expectedPublishError)
 				return
 			}
-
+			if tt.expectedPublishErrorAs != nil {
+				require.ErrorAs(t, err, tt.expectedPublishErrorAs)
+				return
+			}
 			require.NoError(t, err)
 
 			content := []byte(client.Content)
diff --git a/internal/pipe/linkedin/linkedin_test.go b/internal/pipe/linkedin/linkedin_test.go
index 2c47b98e..f782bca5 100644
--- a/internal/pipe/linkedin/linkedin_test.go
+++ b/internal/pipe/linkedin/linkedin_test.go
@@ -4,6 +4,7 @@ import (
 	"testing"
 
 	"github.com/goreleaser/goreleaser/internal/testctx"
+	"github.com/goreleaser/goreleaser/internal/testlib"
 	"github.com/goreleaser/goreleaser/pkg/config"
 	"github.com/stretchr/testify/require"
 )
@@ -33,7 +34,7 @@ func TestAnnounceInvalidTemplate(t *testing.T) {
 			},
 		},
 	})
-	require.EqualError(t, Pipe{}.Announce(ctx), `linkedin: template: tmpl:1: unexpected "}" in operand`)
+	testlib.RequireTemplateError(t, Pipe{}.Announce(ctx))
 }
 
 func TestAnnounceMissingEnv(t *testing.T) {
diff --git a/internal/pipe/mastodon/mastodon_test.go b/internal/pipe/mastodon/mastodon_test.go
index 05342799..91ce3bce 100644
--- a/internal/pipe/mastodon/mastodon_test.go
+++ b/internal/pipe/mastodon/mastodon_test.go
@@ -4,6 +4,7 @@ import (
 	"testing"
 
 	"github.com/goreleaser/goreleaser/internal/testctx"
+	"github.com/goreleaser/goreleaser/internal/testlib"
 	"github.com/goreleaser/goreleaser/pkg/config"
 	"github.com/stretchr/testify/require"
 )
@@ -26,7 +27,7 @@ func TestAnnounceInvalidTemplate(t *testing.T) {
 			},
 		},
 	})
-	require.EqualError(t, Pipe{}.Announce(ctx), `mastodon: template: tmpl:1: unexpected "}" in operand`)
+	testlib.RequireTemplateError(t, Pipe{}.Announce(ctx))
 }
 
 func TestAnnounceMissingEnv(t *testing.T) {
diff --git a/internal/pipe/mattermost/mattermost_test.go b/internal/pipe/mattermost/mattermost_test.go
index 535badf1..7d69956e 100644
--- a/internal/pipe/mattermost/mattermost_test.go
+++ b/internal/pipe/mattermost/mattermost_test.go
@@ -10,6 +10,7 @@ import (
 	"github.com/stretchr/testify/require"
 
 	"github.com/goreleaser/goreleaser/internal/testctx"
+	"github.com/goreleaser/goreleaser/internal/testlib"
 	"github.com/goreleaser/goreleaser/pkg/config"
 )
 
@@ -31,7 +32,7 @@ func TestAnnounceInvalidTemplate(t *testing.T) {
 			},
 		},
 	})
-	require.EqualError(t, Pipe{}.Announce(ctx), `mattermost: template: tmpl:1: unexpected "}" in operand`)
+	testlib.RequireTemplateError(t, Pipe{}.Announce(ctx))
 }
 
 func TestAnnounceMissingEnv(t *testing.T) {
diff --git a/internal/pipe/opencollective/opencollective_test.go b/internal/pipe/opencollective/opencollective_test.go
index bc46dec4..edbd51e9 100644
--- a/internal/pipe/opencollective/opencollective_test.go
+++ b/internal/pipe/opencollective/opencollective_test.go
@@ -4,6 +4,7 @@ import (
 	"testing"
 
 	"github.com/goreleaser/goreleaser/internal/testctx"
+	"github.com/goreleaser/goreleaser/internal/testlib"
 	"github.com/goreleaser/goreleaser/pkg/config"
 	"github.com/stretchr/testify/require"
 )
@@ -27,7 +28,7 @@ func TestAnnounceInvalidTemplate(t *testing.T) {
 			},
 		},
 	})
-	require.EqualError(t, Pipe{}.Announce(ctx), `opencollective: template: tmpl:1: unexpected "}" in operand`)
+	testlib.RequireTemplateError(t, Pipe{}.Announce(ctx))
 }
 
 func TestAnnounceMissingEnv(t *testing.T) {
diff --git a/internal/pipe/prebuild/prebuild_test.go b/internal/pipe/prebuild/prebuild_test.go
index b485f053..d28fed93 100644
--- a/internal/pipe/prebuild/prebuild_test.go
+++ b/internal/pipe/prebuild/prebuild_test.go
@@ -3,6 +3,7 @@ package prebuild
 import (
 	"testing"
 
+	"github.com/goreleaser/goreleaser/internal/testlib"
 	"github.com/goreleaser/goreleaser/pkg/config"
 	"github.com/goreleaser/goreleaser/pkg/context"
 	"github.com/stretchr/testify/require"
@@ -31,7 +32,7 @@ func TestRun(t *testing.T) {
 		ctx := context.New(config.Project{
 			Builds: []config.Build{{Main: "{{ .Env.FOO }}"}},
 		})
-		require.EqualError(t, Pipe{}.Run(ctx), `template: tmpl:1:7: executing "tmpl" at <.Env.FOO>: map has no entry for key "FOO"`)
+		testlib.RequireTemplateError(t, Pipe{}.Run(ctx))
 	})
 }
 
diff --git a/internal/pipe/reddit/reddit_test.go b/internal/pipe/reddit/reddit_test.go
index d7633012..c123071d 100644
--- a/internal/pipe/reddit/reddit_test.go
+++ b/internal/pipe/reddit/reddit_test.go
@@ -4,6 +4,7 @@ import (
 	"testing"
 
 	"github.com/goreleaser/goreleaser/internal/testctx"
+	"github.com/goreleaser/goreleaser/internal/testlib"
 	"github.com/goreleaser/goreleaser/pkg/config"
 	"github.com/stretchr/testify/require"
 )
@@ -26,7 +27,7 @@ func TestAnnounceInvalidURLTemplate(t *testing.T) {
 			},
 		},
 	})
-	require.EqualError(t, Pipe{}.Announce(ctx), `reddit: template: tmpl:1: unexpected "}" in operand`)
+	testlib.RequireTemplateError(t, Pipe{}.Announce(ctx))
 }
 
 func TestAnnounceInvalidTitleTemplate(t *testing.T) {
@@ -37,7 +38,7 @@ func TestAnnounceInvalidTitleTemplate(t *testing.T) {
 			},
 		},
 	})
-	require.EqualError(t, Pipe{}.Announce(ctx), `reddit: template: tmpl:1: unexpected "}" in operand`)
+	testlib.RequireTemplateError(t, Pipe{}.Announce(ctx))
 }
 
 func TestAnnounceMissingEnv(t *testing.T) {
diff --git a/internal/pipe/release/body_test.go b/internal/pipe/release/body_test.go
index e1bb3766..d6f8ca39 100644
--- a/internal/pipe/release/body_test.go
+++ b/internal/pipe/release/body_test.go
@@ -8,6 +8,7 @@ import (
 	"github.com/goreleaser/goreleaser/internal/artifact"
 	"github.com/goreleaser/goreleaser/internal/golden"
 	"github.com/goreleaser/goreleaser/internal/testctx"
+	"github.com/goreleaser/goreleaser/internal/testlib"
 	"github.com/goreleaser/goreleaser/pkg/config"
 	"github.com/goreleaser/goreleaser/pkg/context"
 	"github.com/stretchr/testify/require"
@@ -85,7 +86,7 @@ func TestDescribeBodyWithInvalidHeaderTemplate(t *testing.T) {
 		},
 	})
 	_, err := describeBody(ctx)
-	require.EqualError(t, err, `template: tmpl:1: unexpected "}" in operand`)
+	testlib.RequireTemplateError(t, err)
 }
 
 func TestDescribeBodyWithInvalidFooterTemplate(t *testing.T) {
@@ -95,5 +96,5 @@ func TestDescribeBodyWithInvalidFooterTemplate(t *testing.T) {
 		},
 	})
 	_, err := describeBody(ctx)
-	require.EqualError(t, err, `template: tmpl:1: unexpected "}" in operand`)
+	testlib.RequireTemplateError(t, err)
 }
diff --git a/internal/pipe/sbom/sbom_test.go b/internal/pipe/sbom/sbom_test.go
index 607c7849..e33dbebd 100644
--- a/internal/pipe/sbom/sbom_test.go
+++ b/internal/pipe/sbom/sbom_test.go
@@ -11,6 +11,7 @@ import (
 	"github.com/goreleaser/goreleaser/internal/artifact"
 	"github.com/goreleaser/goreleaser/internal/testctx"
 	"github.com/goreleaser/goreleaser/internal/testlib"
+	"github.com/goreleaser/goreleaser/internal/tmpl"
 	"github.com/goreleaser/goreleaser/pkg/config"
 	"github.com/goreleaser/goreleaser/pkg/context"
 	"github.com/stretchr/testify/assert"
@@ -221,6 +222,7 @@ func TestSBOMCatalogArtifacts(t *testing.T) {
 		ctx            *context.Context
 		sbomPaths      []string
 		sbomNames      []string
+		expectedErrAs  any
 		expectedErrMsg string
 	}{
 		{
@@ -237,8 +239,8 @@ func TestSBOMCatalogArtifacts(t *testing.T) {
 			}),
 		},
 		{
-			desc:           "invalid args template",
-			expectedErrMsg: `cataloging artifacts failed: arg "${FOO}-{{ .foo }{{}}{": invalid template: template: tmpl:1: unexpected "}" in operand`,
+			desc:          "invalid args template",
+			expectedErrAs: &tmpl.Error{},
 			ctx: testctx.NewWithCfg(config.Project{
 				SBOMs: []config.SBOM{
 					{
@@ -415,12 +417,25 @@ func TestSBOMCatalogArtifacts(t *testing.T) {
 
 	for _, test := range tests {
 		t.Run(test.desc, func(t *testing.T) {
-			testSBOMCataloging(t, test.ctx, test.sbomPaths, test.sbomNames, test.expectedErrMsg)
+			testSBOMCataloging(
+				t,
+				test.ctx,
+				test.sbomPaths,
+				test.sbomNames,
+				test.expectedErrAs,
+				test.expectedErrMsg,
+			)
 		})
 	}
 }
 
-func testSBOMCataloging(tb testing.TB, ctx *context.Context, sbomPaths, sbomNames []string, expectedErrMsg string) {
+func testSBOMCataloging(
+	tb testing.TB,
+	ctx *context.Context,
+	sbomPaths, sbomNames []string,
+	expectedErrAs any,
+	expectedErrMsg string,
+) {
 	tb.Helper()
 	testlib.CheckPath(tb, "syft")
 	tmpdir := tb.TempDir()
@@ -501,6 +516,10 @@ func testSBOMCataloging(tb testing.TB, ctx *context.Context, sbomPaths, sbomName
 		require.Contains(tb, err.Error(), expectedErrMsg)
 		return
 	}
+	if expectedErrAs != nil {
+		require.ErrorAs(tb, Pipe{}.Run(ctx), expectedErrAs)
+		return
+	}
 
 	require.NoError(tb, Pipe{}.Run(ctx))
 
diff --git a/internal/pipe/sign/sign_test.go b/internal/pipe/sign/sign_test.go
index ef4c3027..b9f40a7a 100644
--- a/internal/pipe/sign/sign_test.go
+++ b/internal/pipe/sign/sign_test.go
@@ -18,6 +18,7 @@ import (
 	"github.com/goreleaser/goreleaser/internal/git"
 	"github.com/goreleaser/goreleaser/internal/testctx"
 	"github.com/goreleaser/goreleaser/internal/testlib"
+	"github.com/goreleaser/goreleaser/internal/tmpl"
 	"github.com/goreleaser/goreleaser/pkg/config"
 	"github.com/goreleaser/goreleaser/pkg/context"
 	"github.com/stretchr/testify/require"
@@ -104,6 +105,7 @@ func TestSignArtifacts(t *testing.T) {
 		certificateNames []string
 		expectedErrMsg   string
 		expectedErrIs    error
+		expectedErrAs    any
 		user             string
 	}{
 		{
@@ -132,8 +134,8 @@ func TestSignArtifacts(t *testing.T) {
 			}),
 		},
 		{
-			desc:           "invalid certificate template",
-			expectedErrMsg: `sign failed: artifact1: template: tmpl:1:3: executing "tmpl" at <.blah>: map has no entry for key "blah"`,
+			desc:          "invalid certificate template",
+			expectedErrAs: &tmpl.Error{},
 			ctx: testctx.NewWithCfg(config.Project{
 				Signs: []config.Sign{
 					{
@@ -145,8 +147,8 @@ func TestSignArtifacts(t *testing.T) {
 			}),
 		},
 		{
-			desc:           "invalid signature template",
-			expectedErrMsg: `sign failed: artifact1: template: tmpl:1:3: executing "tmpl" at <.blah>: map has no entry for key "blah"`,
+			desc:          "invalid signature template",
+			expectedErrAs: &tmpl.Error{},
 			ctx: testctx.NewWithCfg(config.Project{
 				Signs: []config.Sign{
 					{
@@ -158,8 +160,8 @@ func TestSignArtifacts(t *testing.T) {
 			}),
 		},
 		{
-			desc:           "invalid args template",
-			expectedErrMsg: `sign failed: artifact1: template: tmpl:1: unexpected "}" in operand`,
+			desc:          "invalid args template",
+			expectedErrAs: &tmpl.Error{},
 			ctx: testctx.NewWithCfg(config.Project{
 				Signs: []config.Sign{
 					{
@@ -174,8 +176,8 @@ func TestSignArtifacts(t *testing.T) {
 			}),
 		},
 		{
-			desc:           "invalid env template",
-			expectedErrMsg: `sign failed: artifact1: template: tmpl:1:5: executing "tmpl" at <.blah>: map has no entry for key "blah"`,
+			desc:          "invalid env template",
+			expectedErrAs: &tmpl.Error{},
 			ctx: testctx.NewWithCfg(config.Project{
 				Signs: []config.Sign{
 					{
@@ -524,12 +526,29 @@ func TestSignArtifacts(t *testing.T) {
 		}
 
 		t.Run(test.desc, func(t *testing.T) {
-			testSign(t, test.ctx, test.certificateNames, test.signaturePaths, test.signatureNames, test.user, test.expectedErrMsg, test.expectedErrIs)
+			testSign(
+				t,
+				test.ctx,
+				test.certificateNames,
+				test.signaturePaths,
+				test.signatureNames,
+				test.user,
+				test.expectedErrMsg,
+				test.expectedErrIs,
+				test.expectedErrAs,
+			)
 		})
 	}
 }
 
-func testSign(tb testing.TB, ctx *context.Context, certificateNames, signaturePaths, signatureNames []string, user, expectedErrMsg string, expectedErrIs error) {
+func testSign(
+	tb testing.TB,
+	ctx *context.Context,
+	certificateNames, signaturePaths, signatureNames []string,
+	user, expectedErrMsg string,
+	expectedErrIs error,
+	expectedErrAs any,
+) {
 	tb.Helper()
 	tmpdir := tb.TempDir()
 
@@ -639,6 +658,11 @@ func testSign(tb testing.TB, ctx *context.Context, certificateNames, signaturePa
 		return
 	}
 
+	if expectedErrAs != nil {
+		require.ErrorAs(tb, err, expectedErrAs)
+		return
+	}
+
 	require.NoError(tb, err)
 
 	// ensure all artifacts have an ID
diff --git a/internal/pipe/slack/slack_test.go b/internal/pipe/slack/slack_test.go
index 2502c641..bbeee3fb 100644
--- a/internal/pipe/slack/slack_test.go
+++ b/internal/pipe/slack/slack_test.go
@@ -5,6 +5,7 @@ import (
 	"testing"
 
 	"github.com/goreleaser/goreleaser/internal/testctx"
+	"github.com/goreleaser/goreleaser/internal/testlib"
 	"github.com/goreleaser/goreleaser/internal/yaml"
 	"github.com/goreleaser/goreleaser/pkg/config"
 	"github.com/slack-go/slack"
@@ -29,7 +30,7 @@ func TestAnnounceInvalidTemplate(t *testing.T) {
 			},
 		},
 	})
-	require.EqualError(t, Pipe{}.Announce(ctx), `slack: template: tmpl:1: unexpected "}" in operand`)
+	testlib.RequireTemplateError(t, Pipe{}.Announce(ctx))
 }
 
 func TestAnnounceMissingEnv(t *testing.T) {
diff --git a/internal/pipe/teams/teams_test.go b/internal/pipe/teams/teams_test.go
index 14198136..129075eb 100644
--- a/internal/pipe/teams/teams_test.go
+++ b/internal/pipe/teams/teams_test.go
@@ -4,6 +4,7 @@ import (
 	"testing"
 
 	"github.com/goreleaser/goreleaser/internal/testctx"
+	"github.com/goreleaser/goreleaser/internal/testlib"
 	"github.com/goreleaser/goreleaser/pkg/config"
 	"github.com/stretchr/testify/require"
 )
@@ -27,7 +28,7 @@ func TestAnnounceInvalidTemplate(t *testing.T) {
 			},
 		},
 	})
-	require.EqualError(t, Pipe{}.Announce(ctx), `teams: template: tmpl:1: unexpected "}" in operand`)
+	testlib.RequireTemplateError(t, Pipe{}.Announce(ctx))
 }
 
 func TestAnnounceMissingEnv(t *testing.T) {
diff --git a/internal/pipe/twitter/twitter_test.go b/internal/pipe/twitter/twitter_test.go
index 412a8384..1973064d 100644
--- a/internal/pipe/twitter/twitter_test.go
+++ b/internal/pipe/twitter/twitter_test.go
@@ -4,6 +4,7 @@ import (
 	"testing"
 
 	"github.com/goreleaser/goreleaser/internal/testctx"
+	"github.com/goreleaser/goreleaser/internal/testlib"
 	"github.com/goreleaser/goreleaser/pkg/config"
 	"github.com/stretchr/testify/require"
 )
@@ -26,7 +27,7 @@ func TestAnnounceInvalidTemplate(t *testing.T) {
 			},
 		},
 	})
-	require.EqualError(t, Pipe{}.Announce(ctx), `twitter: template: tmpl:1: unexpected "}" in operand`)
+	testlib.RequireTemplateError(t, Pipe{}.Announce(ctx))
 }
 
 func TestAnnounceMissingEnv(t *testing.T) {
diff --git a/internal/pipe/upx/upx_test.go b/internal/pipe/upx/upx_test.go
index f4e10970..970a285e 100644
--- a/internal/pipe/upx/upx_test.go
+++ b/internal/pipe/upx/upx_test.go
@@ -50,32 +50,32 @@ func TestRun(t *testing.T) {
 	ctx := testctx.NewWithCfg(config.Project{
 		UPXs: []config.UPX{
 			{
-				Enabled: true,
+				Enabled: "true",
 				IDs:     []string{"1"},
 			},
 			{
-				Enabled:  true,
+				Enabled:  "true",
 				IDs:      []string{"2"},
 				Compress: "best",
 			},
 			{
-				Enabled:  true,
+				Enabled:  "true",
 				IDs:      []string{"3"},
 				Compress: "9",
 			},
 			{
-				Enabled:  true,
+				Enabled:  "true",
 				IDs:      []string{"4"},
 				Compress: "8",
 				LZMA:     true,
 			},
 			{
-				Enabled: true,
+				Enabled: `{{ eq .Env.UPX "1" }}`,
 				IDs:     []string{"5"},
 				Brute:   true,
 			},
 		},
-	})
+	}, testctx.WithEnv(map[string]string{"UPX": "1"}))
 
 	tmp := t.TempDir()
 	main := filepath.Join(tmp, "main.go")
@@ -119,20 +119,42 @@ func TestRun(t *testing.T) {
 	require.NoError(t, Pipe{}.Run(ctx))
 }
 
-func TestDisabled(t *testing.T) {
-	ctx := testctx.NewWithCfg(config.Project{
-		UPXs: []config.UPX{
-			{},
-		},
+func TestEnabled(t *testing.T) {
+	t.Run("no config", func(t *testing.T) {
+		ctx := testctx.NewWithCfg(config.Project{
+			UPXs: []config.UPX{
+				{},
+			},
+		})
+		testlib.AssertSkipped(t, Pipe{}.Run(ctx))
+	})
+	t.Run("tmpl", func(t *testing.T) {
+		ctx := testctx.NewWithCfg(config.Project{
+			UPXs: []config.UPX{
+				{
+					Enabled: `{{ printf "false" }}`,
+				},
+			},
+		})
+		testlib.AssertSkipped(t, Pipe{}.Run(ctx))
+	})
+	t.Run("invalid template", func(t *testing.T) {
+		ctx := testctx.NewWithCfg(config.Project{
+			UPXs: []config.UPX{
+				{
+					Enabled: `{{ .Foo }}`,
+				},
+			},
+		})
+		testlib.RequireTemplateError(t, Pipe{}.Run(ctx))
 	})
-	testlib.AssertSkipped(t, Pipe{}.Run(ctx))
 }
 
 func TestUpxNotInstalled(t *testing.T) {
 	ctx := testctx.NewWithCfg(config.Project{
 		UPXs: []config.UPX{
 			{
-				Enabled: true,
+				Enabled: "true",
 				Binary:  "fakeupx",
 			},
 		},
diff --git a/internal/pipe/webhook/webhook_test.go b/internal/pipe/webhook/webhook_test.go
index 4f92078f..e9f47697 100644
--- a/internal/pipe/webhook/webhook_test.go
+++ b/internal/pipe/webhook/webhook_test.go
@@ -11,6 +11,7 @@ import (
 
 	"github.com/google/uuid"
 	"github.com/goreleaser/goreleaser/internal/testctx"
+	"github.com/goreleaser/goreleaser/internal/testlib"
 	"github.com/goreleaser/goreleaser/pkg/config"
 	"github.com/stretchr/testify/require"
 )
@@ -48,7 +49,7 @@ func TestAnnounceInvalidMessageTemplate(t *testing.T) {
 			},
 		},
 	})
-	require.EqualError(t, Pipe{}.Announce(ctx), `webhook: template: tmpl:1: unexpected "}" in operand`)
+	testlib.RequireTemplateError(t, Pipe{}.Announce(ctx))
 }
 
 type WebHookServerMockMessage struct {
diff --git a/internal/testlib/tmpl.go b/internal/testlib/tmpl.go
index 5d64fca8..f00f7f61 100644
--- a/internal/testlib/tmpl.go
+++ b/internal/testlib/tmpl.go
@@ -3,6 +3,7 @@ package testlib
 import (
 	"testing"
 
+	"github.com/goreleaser/goreleaser/internal/tmpl"
 	"github.com/stretchr/testify/require"
 )
 
@@ -11,6 +12,5 @@ func RequireTemplateError(tb testing.TB, err error) {
 	tb.Helper()
 
 	require.Error(tb, err)
-	require.Contains(tb, err.Error(), "template:")
-	require.Regexp(tb, "bad character|map has no entry|unexpected \"}\" in operand", err.Error())
+	require.ErrorAs(tb, err, &tmpl.Error{})
 }
diff --git a/internal/tmpl/tmpl_test.go b/internal/tmpl/tmpl_test.go
index 4248962f..6f9bf2f4 100644
--- a/internal/tmpl/tmpl_test.go
+++ b/internal/tmpl/tmpl_test.go
@@ -138,7 +138,8 @@ func TestWithArtifact(t *testing.T) {
 	t.Run("template using artifact Fields with no artifact", func(t *testing.T) {
 		t.Parallel()
 		result, err := New(ctx).Apply("{{ .Os }}")
-		require.EqualError(t, err, `template: tmpl:1:3: executing "tmpl" at <.Os>: map has no entry for key "Os"`)
+		require.ErrorAs(t, err, &Error{})
+		require.EqualError(t, err, `template: failed to apply "{{ .Os }}": map has no entry for key "Os"`)
 		require.Empty(t, result)
 	})
 }
@@ -357,16 +358,18 @@ func TestApplySingleEnvOnly(t *testing.T) {
 }
 
 func TestInvalidTemplate(t *testing.T) {
-	ctx := testctx.New(testctx.WithCurrentTag("v1.1.1"))
+	ctx := testctx.New()
 	_, err := New(ctx).Apply("{{{.Foo}")
-	require.EqualError(t, err, "template: tmpl:1: unexpected \"{\" in command")
+	require.ErrorAs(t, err, &Error{})
+	require.EqualError(t, err, `template: failed to apply "{{{.Foo}": unexpected "{" in command`)
 }
 
 func TestEnvNotFound(t *testing.T) {
 	ctx := testctx.New(testctx.WithCurrentTag("v1.2.4"))
 	result, err := New(ctx).Apply("{{.Env.FOO}}")
 	require.Empty(t, result)
-	require.EqualError(t, err, `template: tmpl:1:6: executing "tmpl" at <.Env.FOO>: map has no entry for key "FOO"`)
+	require.ErrorAs(t, err, &Error{})
+	require.EqualError(t, err, `template: failed to apply "{{.Env.FOO}}": map has no entry for key "FOO"`)
 }
 
 func TestWithExtraFields(t *testing.T) {
diff --git a/www/docs/static/latest b/www/docs/static/latest
index 80ac269b..c858d1e1 100644
--- a/www/docs/static/latest
+++ b/www/docs/static/latest
@@ -1,1 +1,1 @@
-v1.19.2
+v1.20.0
diff --git a/www/docs/static/latest-pro b/www/docs/static/latest-pro
index 7873cb2a..4f9b35fa 100644
--- a/www/docs/static/latest-pro
+++ b/www/docs/static/latest-pro
@@ -1,1 +1,1 @@
-v1.19.2-pro
+v1.20.0-pro