Skip to content

Commit 00dd13d

Browse files
chore(goreleaser): fix release asset names (#547)
* chore(goreleaser): fix release asset names
1 parent 88c49b7 commit 00dd13d

4 files changed

Lines changed: 144 additions & 10 deletions

File tree

.github/workflows/ci.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ jobs:
1111
steps:
1212
- name: Checkout code
1313
uses: actions/checkout@v5
14+
- name: Configure git identity
15+
run: |
16+
git config user.name "CI"
17+
git config user.email "ci@localhost"
1418
- name: Set up Go ${{ matrix.go-version }}
1519
uses: actions/setup-go@v6
1620
with:

.goreleaser.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ builds:
3535
archives:
3636
-
3737
name_template: >-
38-
{{.Binary}}_{{.Version}}_{{.Os}}_{{.Arch}}
38+
{{.Binary}}_{{.Version}}_
3939
{{- if eq .Os "darwin"}}macOS
4040
{{- else if eq .Os "linux"}}Linux
4141
{{- else if eq .Os "windows"}}Windows

magefiles/targets/release_test.go

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
//go:build go1.24
2+
3+
// These tests fail on older Go versions because of the change in go.mod format.
4+
// But it doesn't matter because we only call release with modern go versions.
5+
6+
package targets
7+
8+
import (
9+
"fmt"
10+
"os"
11+
"path/filepath"
12+
"strings"
13+
"testing"
14+
)
15+
16+
// expectedReleaseFiles lists the release artifacts goreleaser should produce.
17+
// Each entry uses %s as a placeholder for the version string.
18+
var expectedReleaseFiles = []string{
19+
"mage_%s_checksums.txt",
20+
"mage_%s_DragonFlyBSD-64bit.tar.gz",
21+
"mage_%s_FreeBSD-64bit.tar.gz",
22+
"mage_%s_FreeBSD-ARM.tar.gz",
23+
"mage_%s_FreeBSD-ARM64.tar.gz",
24+
"mage_%s_Linux-64bit.tar.gz",
25+
"mage_%s_Linux-ARM.tar.gz",
26+
"mage_%s_Linux-ARM64.tar.gz",
27+
"mage_%s_macOS-64bit.tar.gz",
28+
"mage_%s_macOS-ARM64.tar.gz",
29+
"mage_%s_NetBSD-64bit.tar.gz",
30+
"mage_%s_NetBSD-ARM.tar.gz",
31+
"mage_%s_NetBSD-ARM64.tar.gz",
32+
"mage_%s_OpenBSD-64bit.tar.gz",
33+
"mage_%s_OpenBSD-ARM64.tar.gz",
34+
"mage_%s_Windows-64bit.zip",
35+
"mage_%s_Windows-ARM64.zip",
36+
}
37+
38+
func TestRelease(t *testing.T) {
39+
if testing.Short() {
40+
t.Skip("skipping release test in short mode")
41+
}
42+
43+
// goreleaser must run from the repo root where .goreleaser.yml lives.
44+
repoRoot, err := filepath.Abs(filepath.Join("..", ".."))
45+
if err != nil {
46+
t.Fatal(err)
47+
}
48+
origDir, err := os.Getwd()
49+
if err != nil {
50+
t.Fatal(err)
51+
}
52+
if err := os.Chdir(repoRoot); err != nil {
53+
t.Fatal(err)
54+
}
55+
t.Cleanup(func() { _ = os.RemoveAll(filepath.Join(repoRoot, "dist")) })
56+
t.Cleanup(func() { _ = os.Chdir(origDir) })
57+
58+
const tag = "v1.0.99"
59+
60+
dryRun := true
61+
if err := Release(tag, &dryRun); err != nil {
62+
t.Fatal(err)
63+
}
64+
65+
// goreleaser strips the leading "v" from the tag for artifact names.
66+
version := strings.TrimPrefix(tag, "v")
67+
68+
entries, err := os.ReadDir("dist")
69+
if err != nil {
70+
t.Fatal(err)
71+
}
72+
73+
// Build expected set, initially marking each as not found.
74+
expected := make(map[string]bool, len(expectedReleaseFiles))
75+
for _, pattern := range expectedReleaseFiles {
76+
expected[fmt.Sprintf(pattern, version)] = false
77+
}
78+
79+
// Walk dist/ and match release artifacts.
80+
for _, e := range entries {
81+
if e.IsDir() {
82+
continue
83+
}
84+
name := e.Name()
85+
isArtifact := strings.HasSuffix(name, ".tar.gz") ||
86+
strings.HasSuffix(name, ".zip") ||
87+
strings.HasSuffix(name, "_checksums.txt")
88+
if !isArtifact {
89+
continue
90+
}
91+
if _, ok := expected[name]; ok {
92+
expected[name] = true
93+
} else {
94+
t.Errorf("unexpected release artifact: %s", name)
95+
}
96+
}
97+
98+
for name, found := range expected {
99+
if !found {
100+
t.Errorf("expected release artifact not found: %s", name)
101+
}
102+
}
103+
}

magefiles/targets/targets.go

Lines changed: 36 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,25 @@ func Install() error {
5454
var releaseTag = regexp.MustCompile(`^v1\.\d+\.\d+$`)
5555

5656
// Release generates a new release. Expects a version tag in v1.x.x format.
57-
func Release(tag string) (err error) {
58-
mg.Deps(Tools)
57+
// If dryRun is true, it creates a local tag and runs goreleaser without
58+
// publishing, then deletes the tag. This can be used to verify release artifacts.
59+
func Release(tag string, dryRun *bool) (err error) {
60+
if err := installTool("goreleaser"); err != nil {
61+
return err
62+
}
5963

6064
if !releaseTag.MatchString(tag) {
6165
return errors.New("TAG environment variable must be in semver v1.x.x format, but was " + tag)
6266
}
6367

68+
if dryRun != nil && *dryRun {
69+
if err := sh.RunV("git", "tag", "-a", tag, "-m", tag); err != nil {
70+
return err
71+
}
72+
defer func() { _ = sh.RunV("git", "tag", "--delete", tag) }()
73+
return sh.RunV("goreleaser", "release", "--skip=publish", "--skip=validate", "--clean")
74+
}
75+
6476
if err := sh.RunV("git", "tag", "-a", tag, "-m", tag); err != nil {
6577
return err
6678
}
@@ -73,31 +85,46 @@ func Release(tag string) (err error) {
7385
_ = sh.RunV("git", "push", "--delete", "origin", tag)
7486
}
7587
}()
76-
return sh.RunV("goreleaser", "release")
88+
return sh.RunV("goreleaser", "release", "--clean")
7789
}
7890

7991
// Clean removes the temporarily generated files from Release.
8092
func Clean() error {
8193
return sh.Rm("dist")
8294
}
8395

84-
var goTools = []string{
85-
"github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.11.2",
86-
"github.com/goreleaser/goreleaser/v2@v2.14.3",
96+
var goTools = map[string]string{
97+
"lint": "github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.11.2",
98+
"goreleaser": "github.com/goreleaser/goreleaser/v2@v2.14.3",
8799
}
88100

89101
// Tools installs the dev tools used by mage, such as golangci-lint.
90102
func Tools() error {
91103
for _, tool := range goTools {
92-
if err := sh.Run("go", "install", tool); err != nil {
93-
return fmt.Errorf("failed to install %s: %w", tool, err)
104+
if err := installTool(tool); err != nil {
105+
return err
94106
}
95107
}
96108
return nil
97109
}
98110

111+
func installTool(tool string) error {
112+
version, ok := goTools[tool]
113+
if !ok {
114+
return fmt.Errorf("unknown tool %q", tool)
115+
}
116+
if err := sh.Run("go", "install", version); err != nil {
117+
return fmt.Errorf("failed to install %s: %w", version, err)
118+
}
119+
return nil
120+
}
121+
99122
// Lint runs golangci-lint on the codebase.
100123
func Lint() error {
101-
mg.Deps(Tools)
124+
err := installTool("lint")
125+
if err != nil {
126+
return err
127+
}
128+
102129
return sh.RunV("golangci-lint", "run")
103130
}

0 commit comments

Comments
 (0)