Skip to content

Commit 909d786

Browse files
authored
Merge pull request #9 from grafana/8-use-semantic-versioning
feat: use semantic versioning
2 parents 18275c9 + e288d34 commit 909d786

File tree

12 files changed

+188
-90
lines changed

12 files changed

+188
-90
lines changed

.github/workflows/distro.yml

+4-13
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,6 @@
44
# A new release is made if a new version of k6 or one or more of the extensions
55
# has been released since the last distribution release.
66
#
7-
# The distro release workflow should be scheduled once a day.
8-
# More than one distribution release cannot be made in one day,
9-
# because the release version is the date.
10-
#
117
# Usage
128
# -----
139
#
@@ -21,7 +17,7 @@
2117
# ```
2218
# on:
2319
# schedule:
24-
# - cron: "0 0 * * *"
20+
# - cron: "10 */2 * * *"
2521
#
2622
# jobs:
2723
# distro:
@@ -134,17 +130,12 @@ jobs:
134130
- name: Latest Release Notes
135131
id: latest
136132
run: |
137-
if gh api /repos/${{github.repository}}/releases/tag/$(date +%y.%m.%d) > /dev/null 2>/dev/null; then
138-
echo "today=true" >> "$GITHUB_OUTPUT"
139-
else
140-
if gh api --jq .body /repos/${{github.repository}}/releases/latest > ${{env.NOTES_LATEST}} 2>/dev/null; then
141-
echo "notes=${{env.NOTES_LATEST}}" >> "$GITHUB_OUTPUT"
142-
fi
133+
if gh api --jq .body /repos/${{github.repository}}/releases/latest > ${{env.NOTES_LATEST}} 2>/dev/null; then
134+
echo "notes=${{env.NOTES_LATEST}}" >> "$GITHUB_OUTPUT"
143135
fi
144136
145137
- name: Build Distro
146-
uses: grafana/[email protected]
147-
if: ${{ steps.latest.outputs.today != 'true' }}
138+
uses: grafana/[email protected]
148139
id: build
149140
with:
150141
args: "${{ inputs.args }}"

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ k6dist [flags] [registry-location]
107107
108108
```
109109
--distro-name string distro name (default detect)
110-
--distro-version string distro version (default current date in YY.MM.DD format)
110+
--distro-version string distro version (default generated)
111111
--platform strings target platforms (default [linux/amd64,darwin/amd64,windows/amd64])
112112
--executable string executable file name (default "dist/{{.Name}}_{{.OS}}_{{.Arch}}/k6{{.ExeExt}}")
113113
--archive string archive file name (default "dist/{{.Name}}_{{.Version}}_{{.OS}}_{{.Arch}}{{.ZipExt}}")

build.go

+34-25
Original file line numberDiff line numberDiff line change
@@ -11,30 +11,35 @@ import (
1111
"path/filepath"
1212
"strings"
1313

14+
"github.com/Masterminds/semver/v3"
1415
"github.com/grafana/k6dist/internal/registry"
1516
"github.com/grafana/k6foundry"
1617
)
1718

18-
func detectChange(registry registry.Registry, latest string) (bool, error) {
19+
var initialVersion = semver.MustParse("v0.1.0") //nolint:gochecknoglobals
20+
21+
func detectChange(reg registry.Registry, latest string) (bool, *semver.Version, error) {
1922
if len(latest) == 0 {
20-
return true, nil
23+
return true, initialVersion, nil
2124
}
2225

2326
contents, err := os.ReadFile(filepath.Clean(latest)) //nolint:forbidigo
2427
if err != nil {
25-
return false, err
28+
return false, nil, err
2629
}
2730

28-
found, modules, err := parseNotes(contents)
31+
found, version, modules, err := parseNotes(contents)
2932
if err != nil {
30-
return false, err
33+
return false, nil, err
3134
}
3235

3336
if !found {
34-
return false, nil
37+
return true, initialVersion, nil
3538
}
3639

37-
return registry.AddLatest(modules), nil
40+
bumped := reg.AddLatest(modules, version)
41+
42+
return !bumped.Equal(version), bumped, nil
3843
}
3944

4045
func newBuilder(ctx context.Context, modules registry.Modules) (k6foundry.Builder, error) {
@@ -58,75 +63,79 @@ func newBuilder(ctx context.Context, modules registry.Modules) (k6foundry.Builde
5863
}
5964

6065
// Build builds k6 binaries and archives based on opts parameter.
61-
func Build(ctx context.Context, opts *Options) (bool, error) {
66+
func Build(ctx context.Context, opts *Options) (bool, *semver.Version, error) {
6267
opts.setDefaults()
6368

6469
registry, err := registry.LoadRegistry(ctx, opts.Registry)
6570
if err != nil {
66-
return false, err
71+
return false, nil, err
6772
}
6873

69-
changed, err := detectChange(registry, opts.NotesLatest)
74+
changed, version, err := detectChange(registry, opts.NotesLatest)
7075
if err != nil {
71-
return false, err
76+
return false, nil, err
7277
}
7378

7479
if !changed {
75-
return false, nil
80+
return false, nil, nil
81+
}
82+
83+
if opts.Version != nil {
84+
version = opts.Version
7685
}
7786

78-
notes, err := expandNotes(opts.Name, opts.Version, registry, opts.NotesTemplate)
87+
notes, err := expandNotes(opts.Name, version, registry, opts.NotesTemplate)
7988
if err != nil {
80-
return false, err
89+
return false, nil, err
8190
}
8291

83-
filename, err := expandAsTargetPath("notes", opts.Notes, newInstsanceData(opts.Name, opts.Version, &Platform{}))
92+
filename, err := expandAsTargetPath("notes", opts.Notes, newInstsanceData(opts.Name, version, &Platform{}))
8493
if err != nil {
85-
return false, err
94+
return false, nil, err
8695
}
8796

8897
if err := os.WriteFile(filename, []byte(notes), 0o600); err != nil { //nolint:forbidigo
89-
return false, err
98+
return false, nil, err
9099
}
91100

92101
modules := registry.ToModules()
93102
k6Version, mods := modules.ToFoundry()
94103

95104
builder, err := newBuilder(ctx, modules)
96105
if err != nil {
97-
return false, err
106+
return false, nil, err
98107
}
99108

100109
for _, platform := range opts.Platforms {
101-
data := newInstsanceData(opts.Name, opts.Version, platform)
110+
data := newInstsanceData(opts.Name, version, platform)
102111

103112
filename, err := expandAsTargetPath("executable", opts.Executable, data)
104113
if err != nil {
105-
return false, err
114+
return false, nil, err
106115
}
107116

108117
err = buildExecutable(ctx, builder, platform, k6Version, mods, filename)
109118
if err != nil {
110-
return false, err
119+
return false, nil, err
111120
}
112121

113122
err = createDockerfile(filename, opts.DockerfileTemplate, opts.Dockerfile)
114123
if err != nil {
115-
return false, err
124+
return false, nil, err
116125
}
117126

118127
archive, err := expandAsTargetPath("archive", opts.Archive, data)
119128
if err != nil {
120-
return false, err
129+
return false, nil, err
121130
}
122131

123132
err = buildArchive(archive, filename, opts.Readme, opts.License)
124133
if err != nil {
125-
return false, err
134+
return false, nil, err
126135
}
127136
}
128137

129-
return true, nil
138+
return true, version, nil
130139
}
131140

132141
func buildExecutable(

cmd/action.go

+8-5
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"path/filepath"
88
"strings"
99

10+
"github.com/Masterminds/semver/v3"
1011
"github.com/google/shlex"
1112
"github.com/spf13/pflag"
1213
)
@@ -57,7 +58,7 @@ func ghinput(args []string, flag *pflag.Flag) []string {
5758
}
5859

5960
//nolint:forbidigo
60-
func emitOutput(changed bool, version string) error {
61+
func emitOutput(changed bool, version *semver.Version) error {
6162
ghOutput := os.Getenv("GITHUB_OUTPUT")
6263
if len(ghOutput) == 0 {
6364
return nil
@@ -75,11 +76,13 @@ func emitOutput(changed bool, version string) error {
7576
return err
7677
}
7778

78-
slog.Debug("Emit version", "version", version)
79+
if version != nil {
80+
slog.Debug("Emit version", "version", version.Original())
7981

80-
_, err = fmt.Fprintf(file, "version=%s\n", version)
81-
if err != nil {
82-
return err
82+
_, err = fmt.Fprintf(file, "version=%s\n", version.Original())
83+
if err != nil {
84+
return err
85+
}
8386
}
8487

8588
return file.Close()

cmd/cmd.go

+17-17
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ import (
1010
"path/filepath"
1111
"runtime"
1212
"strings"
13-
"time"
1413

14+
"github.com/Masterminds/semver/v3"
1515
"github.com/grafana/k6dist"
1616
"github.com/spf13/cobra"
1717
)
@@ -25,6 +25,7 @@ type options struct {
2525
verbose bool
2626
single bool
2727
platforms []string
28+
version string
2829
}
2930

3031
var defaultPlatforms = []string{ //nolint:gochecknoglobals
@@ -50,12 +51,12 @@ func New(levelVar *slog.LevelVar) *cobra.Command {
5051
return preRun(args, levelVar, opts)
5152
},
5253
RunE: func(cmd *cobra.Command, _ []string) error {
53-
changed, err := run(cmd, opts)
54+
changed, version, err := run(cmd, opts)
5455
if err != nil {
5556
return err
5657
}
5758

58-
return emitOutput(changed, opts.Version)
59+
return emitOutput(changed, version)
5960
},
6061
}
6162

@@ -66,7 +67,7 @@ func New(levelVar *slog.LevelVar) *cobra.Command {
6667
flags.SortFlags = false
6768

6869
flags.StringVar(&opts.Name, "distro-name", "", "distro name (default detect)")
69-
flags.StringVar(&opts.Version, "distro-version", "", "distro version (default current date in YY.MM.DD format)")
70+
flags.StringVar(&opts.version, "distro-version", "", "distro version (default generated)")
7071
flags.StringSliceVar(&opts.platforms, "platform", defaultPlatforms, "target platforms")
7172
flags.StringVar(&opts.Executable, "executable", k6dist.DefaultExecutableTemplate, "executable file name")
7273
flags.StringVar(&opts.Archive, "archive", k6dist.DefaultArchiveTemplate, "archive file name")
@@ -107,8 +108,13 @@ func preRun(args []string, levelVar *slog.LevelVar, opts *options) error {
107108
opts.Name = guessName(opts.Registry)
108109
}
109110

110-
if len(opts.Version) == 0 {
111-
opts.Version = defaultDate()
111+
if len(opts.version) > 0 {
112+
ver, err := semver.NewVersion(opts.version)
113+
if err != nil {
114+
return err
115+
}
116+
117+
opts.Version = ver
112118
}
113119

114120
if len(opts.Readme) == 0 {
@@ -133,22 +139,22 @@ func preRun(args []string, levelVar *slog.LevelVar, opts *options) error {
133139
return nil
134140
}
135141

136-
func run(_ *cobra.Command, opts *options) (bool, error) {
142+
func run(_ *cobra.Command, opts *options) (bool, *semver.Version, error) {
137143
if len(opts.Name) == 0 {
138144
cwd, err := os.Getwd() //nolint:forbidigo
139145
if err != nil {
140-
return false, err
146+
return false, nil, err
141147
}
142148

143149
opts.Name = filepath.Base(cwd)
144150
}
145151

146-
changed, err := k6dist.Build(context.TODO(), &opts.Options)
152+
changed, version, err := k6dist.Build(context.TODO(), &opts.Options)
147153
if err != nil {
148-
return false, err
154+
return false, nil, err
149155
}
150156

151-
return changed, nil
157+
return changed, version, nil
152158
}
153159

154160
func guessName(source string) string {
@@ -196,12 +202,6 @@ func findLicense() string {
196202
return findTextFile("LICENSE")
197203
}
198204

199-
func defaultDate() string {
200-
now := time.Now()
201-
202-
return now.Format("06.01.02")
203-
}
204-
205205
func parsePlatforms(values []string) ([]*k6dist.Platform, error) {
206206
platforms := make([]*k6dist.Platform, 0, len(values))
207207

go.mod

+1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ module github.com/grafana/k6dist
33
go 1.22.4
44

55
require (
6+
github.com/Masterminds/semver/v3 v3.3.0
67
github.com/go-task/slim-sprig/v3 v3.0.0
78
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510
89
github.com/grafana/clireadme v0.1.0

go.sum

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
github.com/Masterminds/semver/v3 v3.3.0 h1:B8LGeaivUe71a5qox1ICM/JLl0NqZSW5CHyL+hmvYS0=
2+
github.com/Masterminds/semver/v3 v3.3.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM=
13
github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
24
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
35
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=

0 commit comments

Comments
 (0)