Skip to content

Commit c181168

Browse files
authored
Merge pull request #470 from docker/x/releaser
feat: release automation works with signed commits
2 parents c25a9c4 + 8fe5b08 commit c181168

File tree

3 files changed

+32
-29
lines changed

3 files changed

+32
-29
lines changed

x/release/command.go

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
package main
1616

1717
import (
18+
"context"
1819
"fmt"
1920
"io/fs"
2021
"os"
@@ -53,7 +54,7 @@ func ReleaseCommand(cfg Config) (*cobra.Command, error) {
5354
bump := &cobra.Command{
5455
Use: "bump [OPTIONS] <module>",
5556
Args: cobra.ExactArgs(1),
56-
RunE: func(_ *cobra.Command, args []string) error {
57+
RunE: func(cmd *cobra.Command, args []string) error {
5758
mod := args[0]
5859
data, err := newRepoData(cfg.EnableModulesWithPreReleaseVersion)
5960
if err != nil {
@@ -67,9 +68,9 @@ func ReleaseCommand(cfg Config) (*cobra.Command, error) {
6768
if !ok {
6869
return fmt.Errorf("module %s not found", mod)
6970
}
70-
return helper.BumpModule(mod, opts.level, modData, &projectFS{opts: opts, beforeCommitHook: cfg.BeforeCommitHook, logger: logging.NewDefaultLogger("")})
71+
return helper.BumpModule(cmd.Context(), mod, opts.level, modData, &projectFS{opts: opts, beforeCommitHook: cfg.BeforeCommitHook, logger: logging.NewDefaultLogger("")})
7172
}
72-
return helper.BumpIterative(mod, opts.level, data, &projectFS{opts: opts, beforeCommitHook: cfg.BeforeCommitHook, logger: logging.NewDefaultLogger("")})
73+
return helper.BumpIterative(cmd.Context(), mod, opts.level, data, &projectFS{opts: opts, beforeCommitHook: cfg.BeforeCommitHook, logger: logging.NewDefaultLogger("")})
7374
},
7475
}
7576

@@ -136,7 +137,7 @@ func (m projectFS) BumpModInFile(filename, mod, version string) (bool, error) {
136137
return needsAction, os.WriteFile(filename, out, perm)
137138
}
138139

139-
func (m projectFS) GitTag(tag string) error {
140+
func (m projectFS) GitTag(ctx context.Context, tag string) error {
140141
var prefix string
141142
if m.skipGit {
142143
prefix = "[skip] "
@@ -145,16 +146,16 @@ func (m projectFS) GitTag(tag string) error {
145146
if m.dryRun || m.skipGit {
146147
return nil
147148
}
148-
if err := gitTag(tag); err != nil {
149+
if err := gitTag(ctx, tag); err != nil {
149150
return err
150151
}
151152
if !m.noPropagate && !m.dryRun {
152-
return gitPushTags()
153+
return gitPushTags(ctx)
153154
}
154155
return nil
155156
}
156157

157-
func (m projectFS) GitCommit(commit string) error {
158+
func (m projectFS) GitCommit(ctx context.Context, commit string) error {
158159
if !m.dryRun && m.beforeCommitHook != nil {
159160
if err := m.beforeCommitHook(); err != nil {
160161
return err
@@ -168,7 +169,7 @@ func (m projectFS) GitCommit(commit string) error {
168169
if m.dryRun || m.skipGit {
169170
return nil
170171
}
171-
return gitCommit(commit)
172+
return gitCommit(ctx, commit)
172173
}
173174

174175
func newRepoData(versionExtraAllowList []string) (helper.RepoData, error) {
@@ -260,24 +261,24 @@ func getLatestVersion(modName string) (string, error) {
260261
return strings.TrimPrefix(latest, prefix), nil
261262
}
262263

263-
func gitTag(tag string) error {
264-
cmd := exec.Command("git", "tag", tag)
264+
func gitTag(ctx context.Context, tag string) error {
265+
cmd := exec.CommandContext(ctx, "git", "tag", tag, "-m", tag)
265266
if out, err := cmd.CombinedOutput(); err != nil {
266267
return fmt.Errorf("git tag (%s): %s", err, string(out))
267268
}
268269
return nil
269270
}
270271

271-
func gitPushTags() error {
272-
cmd := exec.Command("git", "push", "--tags")
272+
func gitPushTags(ctx context.Context) error {
273+
cmd := exec.CommandContext(ctx, "git", "push", "--tags")
273274
if out, err := cmd.CombinedOutput(); err != nil {
274275
return fmt.Errorf("git push --tags (%s): %s", err, string(out))
275276
}
276277
return nil
277278
}
278279

279-
func gitCommit(commit string) error {
280-
cmd := exec.Command("git", "commit", "-am", commit)
280+
func gitCommit(ctx context.Context, commit string) error {
281+
cmd := exec.CommandContext(ctx, "git", "commit", "-am", commit)
281282
if out, err := cmd.CombinedOutput(); err != nil {
282283
return fmt.Errorf("git commit (%s): %s", err, string(out))
283284
}

x/release/helper/release.go

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
package helper
1616

1717
import (
18+
"context"
1819
"errors"
1920
"fmt"
2021
"path/filepath"
@@ -63,12 +64,12 @@ func AllowedLevels() string {
6364
return strings.Join(quoted, ", ")
6465
}
6566

66-
func BumpIterative(mod string, level Level, repo RepoData, i FS) error {
67+
func BumpIterative(ctx context.Context, mod string, level Level, repo RepoData, i FS) error {
6768
data, ok := repo[mod]
6869
if !ok {
6970
return fmt.Errorf("module %s not found", mod)
7071
}
71-
if err := BumpModule(mod, level, data, i); err != nil {
72+
if err := BumpModule(ctx, mod, level, data, i); err != nil {
7273
return err
7374
}
7475
queue := data.downstreams
@@ -98,7 +99,7 @@ func BumpIterative(mod string, level Level, repo RepoData, i FS) error {
9899
}
99100
// We always propagate as patch release. The alternative is to not propagate at all and manually
100101
// re-run the release automation with the desired type of version bump on the specific sub module.
101-
if err := BumpModule(nextMod, Patch, data, i); err != nil {
102+
if err := BumpModule(ctx, nextMod, Patch, data, i); err != nil {
102103
return err
103104
}
104105
repo.RemoveModule(nextMod)
@@ -108,19 +109,19 @@ func BumpIterative(mod string, level Level, repo RepoData, i FS) error {
108109
}
109110

110111
type FS interface {
111-
GitTag(tag string) error
112-
GitCommit(msg string) error
112+
GitTag(ctx context.Context, tag string) error
113+
GitCommit(ctx context.Context, msg string) error
113114
BumpModInFile(path, module, version string) (bool, error)
114115
}
115116

116-
func BumpModule(mod string, level Level, data ModData, i FS) error {
117+
func BumpModule(ctx context.Context, mod string, level Level, data ModData, i FS) error {
117118
release, err := data.GetNextVersion(level)
118119
if err != nil {
119120
return err
120121
}
121122

122123
tag := mod + "/" + release
123-
if err := i.GitTag(tag); err != nil {
124+
if err := i.GitTag(ctx, tag); err != nil {
124125
return err
125126
}
126127
needsCommit := false
@@ -136,7 +137,7 @@ func BumpModule(mod string, level Level, data ModData, i FS) error {
136137
if !needsCommit {
137138
return nil
138139
}
139-
return i.GitCommit("chore: bump " + tag)
140+
return i.GitCommit(ctx, "chore: bump "+tag)
140141
}
141142

142143
type RepoData map[string]ModData

x/release/helper/release_test.go

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package helper
22

33
import (
4+
"context"
45
"strings"
56
"testing"
67

@@ -13,7 +14,7 @@ func Test_bumpIterative(t *testing.T) {
1314
t.Run("bump module with cascading dependencies", func(t *testing.T) {
1415
repo := newMockRepoData()
1516
m := &mockFS{}
16-
assert.NoError(t, BumpIterative("x", Major, repo, m))
17+
assert.NoError(t, BumpIterative(t.Context(), "x", Major, repo, m))
1718
assert.ElementsMatch(t, m.tagsCreated, []string{
1819
"x/v1.0.0-do.not.use",
1920
"plugin/v0.1.1",
@@ -37,7 +38,7 @@ func Test_bumpIterative(t *testing.T) {
3738
t.Run("bump module with direct dependencies", func(t *testing.T) {
3839
repo := newMockRepoData()
3940
m := &mockFS{}
40-
assert.NoError(t, BumpIterative("plugin", Patch, repo, m))
41+
assert.NoError(t, BumpIterative(t.Context(), "plugin", Patch, repo, m))
4142
assert.ElementsMatch(t, m.tagsCreated, []string{
4243
"plugin/v0.1.1",
4344
"runtime/v0.2.4",
@@ -51,7 +52,7 @@ func Test_bumpIterative(t *testing.T) {
5152
t.Run("bump module without dependencies", func(t *testing.T) {
5253
repo := newMockRepoData()
5354
m := &mockFS{}
54-
assert.NoError(t, BumpIterative("runtime", Patch, repo, m))
55+
assert.NoError(t, BumpIterative(t.Context(), "runtime", Patch, repo, m))
5556
assert.ElementsMatch(t, m.tagsCreated, []string{
5657
"runtime/v0.2.4",
5758
})
@@ -75,7 +76,7 @@ func Test_bumpModule(t *testing.T) {
7576
t.Run("bump module with version metadata and dependencies", func(t *testing.T) {
7677
repo := newMockRepoData()
7778
m := &mockFS{}
78-
assert.NoError(t, BumpModule("x", Patch, repo["x"], m))
79+
assert.NoError(t, BumpModule(t.Context(), "x", Patch, repo["x"], m))
7980
assert.ElementsMatch(t, m.tagsCreated, []string{"x/v0.0.4-do.not.use"})
8081
assert.ElementsMatch(t, m.bumps, []bump{
8182
{"runtime/go.mod", "x", "v0.0.4-do.not.use"},
@@ -89,7 +90,7 @@ func Test_bumpModule(t *testing.T) {
8990
t.Run("bump module without version metadata and no dependencies", func(t *testing.T) {
9091
repo := newMockRepoData()
9192
m := &mockFS{}
92-
assert.NoError(t, BumpModule("runtime", Patch, repo["runtime"], m))
93+
assert.NoError(t, BumpModule(t.Context(), "runtime", Patch, repo["runtime"], m))
9394
assert.ElementsMatch(t, m.tagsCreated, []string{"runtime/v0.2.4"})
9495
assert.ElementsMatch(t, m.bumps, []bump{})
9596
})
@@ -110,7 +111,7 @@ type mockFS struct {
110111
commits []string
111112
}
112113

113-
func (m *mockFS) GitCommit(commit string) error {
114+
func (m *mockFS) GitCommit(_ context.Context, commit string) error {
114115
m.commits = append(m.commits, commit)
115116
return nil
116117
}
@@ -121,7 +122,7 @@ type bump struct {
121122
version string
122123
}
123124

124-
func (m *mockFS) GitTag(tag string) error {
125+
func (m *mockFS) GitTag(_ context.Context, tag string) error {
125126
m.tagsCreated = append(m.tagsCreated, tag)
126127
return nil
127128
}

0 commit comments

Comments
 (0)