diff --git a/cloudapi/api_test.go b/cloudapi/api_test.go index 39a67dd6a06..09402d552ff 100644 --- a/cloudapi/api_test.go +++ b/cloudapi/api_test.go @@ -12,8 +12,7 @@ import ( "time" "go.k6.io/k6/lib/fsext" - - "go.k6.io/k6/lib/consts" + "go.k6.io/k6/version" "go.k6.io/k6/lib" @@ -111,7 +110,7 @@ func TestCreateTestRun(t *testing.T) { arc := &lib.Archive{ Type: "js", - K6Version: consts.Version, + K6Version: version.SemVer, Options: lib.Options{}, FilenameURL: &url.URL{Scheme: "file", Path: "/path/to/a.js"}, Data: []byte(`// a contents`), diff --git a/internal/cmd/cloud.go b/internal/cmd/cloud.go index ac48a07b92b..2feed0aa3ed 100644 --- a/internal/cmd/cloud.go +++ b/internal/cmd/cloud.go @@ -18,7 +18,7 @@ import ( "go.k6.io/k6/errext/exitcodes" "go.k6.io/k6/internal/ui/pb" "go.k6.io/k6/lib" - "go.k6.io/k6/lib/consts" + "go.k6.io/k6/version" "github.com/fatih/color" "github.com/spf13/cobra" @@ -164,7 +164,7 @@ func (c *cmdCloud) run(cmd *cobra.Command, args []string) error { // Start cloud test run modifyAndPrintBar(c.gs, progressBar, pb.WithConstProgress(0, "Validating script options")) client := cloudapi.NewClient( - logger, cloudConfig.Token.String, cloudConfig.Host.String, consts.Version, cloudConfig.Timeout.TimeDuration()) + logger, cloudConfig.Token.String, cloudConfig.Host.String, version.SemVer, cloudConfig.Timeout.TimeDuration()) if err = client.ValidateOptions(arc.Options); err != nil { return err } diff --git a/internal/cmd/cloud_login.go b/internal/cmd/cloud_login.go index 83f95ccdba7..0de646a23eb 100644 --- a/internal/cmd/cloud_login.go +++ b/internal/cmd/cloud_login.go @@ -14,7 +14,7 @@ import ( "go.k6.io/k6/cloudapi" "go.k6.io/k6/cmd/state" "go.k6.io/k6/internal/ui" - "go.k6.io/k6/lib/consts" + "go.k6.io/k6/version" ) const cloudLoginCommandName = "login" @@ -168,7 +168,7 @@ func validateToken(gs *state.GlobalState, jsonRawConf json.RawMessage, token str gs.Logger, token, consolidatedCurrentConfig.Host.String, - consts.Version, + version.SemVer, consolidatedCurrentConfig.Timeout.TimeDuration(), ) diff --git a/internal/cmd/login_cloud.go b/internal/cmd/login_cloud.go index 6fb03a1d868..a7e17f823ed 100644 --- a/internal/cmd/login_cloud.go +++ b/internal/cmd/login_cloud.go @@ -14,7 +14,7 @@ import ( "go.k6.io/k6/cloudapi" "go.k6.io/k6/cmd/state" "go.k6.io/k6/internal/ui" - "go.k6.io/k6/lib/consts" + "go.k6.io/k6/version" ) //nolint:funlen,gocognit @@ -114,7 +114,7 @@ Please use the "k6 cloud login" command instead. gs.Logger, "", consolidatedCurrentConfig.Host.String, - consts.Version, + version.SemVer, consolidatedCurrentConfig.Timeout.TimeDuration()) var res *cloudapi.LoginResponse diff --git a/internal/cmd/options.go b/internal/cmd/options.go index daa1dcb37d6..df11dd3f9e9 100644 --- a/internal/cmd/options.go +++ b/internal/cmd/options.go @@ -9,9 +9,9 @@ import ( "gopkg.in/guregu/null.v3" "go.k6.io/k6/lib" - "go.k6.io/k6/lib/consts" "go.k6.io/k6/lib/types" "go.k6.io/k6/metrics" + "go.k6.io/k6/version" ) var ( @@ -37,7 +37,7 @@ func optionFlagSet() *pflag.FlagSet { flags.Int64("batch", 20, "max parallel batch reqs") flags.Int64("batch-per-host", 6, "max parallel batch reqs per host") flags.Int64("rps", 0, "limit requests per second") - flags.String("user-agent", fmt.Sprintf("k6/%s (https://k6.io/)", consts.Version), "user agent for http requests") + flags.String("user-agent", fmt.Sprintf("k6/%s (https://k6.io/)", version.SemVer), "user agent for http requests") flags.String("http-debug", "", "log all HTTP requests and responses. Excludes body by default. To include body use '--http-debug=full'") //nolint:lll flags.Lookup("http-debug").NoOptDefVal = "headers" flags.Bool("insecure-skip-tls-verify", false, "skip verification of TLS certificates") diff --git a/internal/cmd/outputs_cloud.go b/internal/cmd/outputs_cloud.go index 06368315f87..7fd93690a01 100644 --- a/internal/cmd/outputs_cloud.go +++ b/internal/cmd/outputs_cloud.go @@ -15,8 +15,8 @@ import ( "go.k6.io/k6/cloudapi" "go.k6.io/k6/cmd/state" "go.k6.io/k6/lib" - "go.k6.io/k6/lib/consts" "go.k6.io/k6/metrics" + "go.k6.io/k6/version" ) const ( @@ -116,7 +116,7 @@ func createCloudTest(gs *state.GlobalState, test *loadedAndConfiguredTest) error logger := gs.Logger.WithFields(logrus.Fields{"output": builtinOutputCloud.String()}) apiClient := cloudapi.NewClient( - logger, conf.Token.String, conf.Host.String, consts.Version, conf.Timeout.TimeDuration()) + logger, conf.Token.String, conf.Host.String, version.SemVer, conf.Timeout.TimeDuration()) response, err := apiClient.CreateTestRun(testRun) if err != nil { diff --git a/internal/cmd/report.go b/internal/cmd/report.go index 7dc2a767269..fdb4bda0c0a 100644 --- a/internal/cmd/report.go +++ b/internal/cmd/report.go @@ -10,14 +10,14 @@ import ( "go.k6.io/k6/internal/execution" "go.k6.io/k6/internal/usage" - "go.k6.io/k6/lib/consts" + "go.k6.io/k6/version" ) func createReport(u *usage.Usage, execScheduler *execution.Scheduler) map[string]any { execState := execScheduler.GetState() m := u.Map() - m["k6_version"] = consts.Version + m["k6_version"] = version.SemVer m["duration"] = execState.GetCurrentTestRunDuration().String() m["goos"] = runtime.GOOS m["goarch"] = runtime.GOARCH diff --git a/internal/cmd/report_test.go b/internal/cmd/report_test.go index 0b4ef1ea8dd..9748369ec0b 100644 --- a/internal/cmd/report_test.go +++ b/internal/cmd/report_test.go @@ -11,8 +11,8 @@ import ( "go.k6.io/k6/internal/lib/testutils" "go.k6.io/k6/internal/usage" "go.k6.io/k6/lib" - "go.k6.io/k6/lib/consts" "go.k6.io/k6/lib/executor" + "go.k6.io/k6/version" "gopkg.in/guregu/null.v3" ) @@ -53,7 +53,7 @@ func TestCreateReport(t *testing.T) { m := createReport(usage.New(), s) require.NoError(t, err) - assert.Equal(t, consts.Version, m["k6_version"]) + assert.Equal(t, version.SemVer, m["k6_version"]) assert.EqualValues(t, map[string]int{"shared-iterations": 1}, m["executors"]) assert.EqualValues(t, 6, m["vus_max"]) assert.EqualValues(t, 170, m["iterations"]) @@ -75,7 +75,7 @@ func TestCreateReport(t *testing.T) { m := createReport(usage.New(), s) require.NoError(t, err) - assert.Equal(t, consts.Version, m["k6_version"]) + assert.Equal(t, version.SemVer, m["k6_version"]) assert.EqualValues(t, map[string]int{"shared-iterations": 1}, m["executors"]) assert.EqualValues(t, 0, m["vus_max"]) assert.EqualValues(t, 0, m["iterations"]) @@ -97,7 +97,7 @@ func TestCreateReport(t *testing.T) { m := createReport(usage.New(), s) require.NoError(t, err) - assert.Equal(t, consts.Version, m["k6_version"]) + assert.Equal(t, version.SemVer, m["k6_version"]) assert.EqualValues(t, map[string]int{"shared-iterations": 1}, m["executors"]) assert.EqualValues(t, 0, m["vus_max"]) assert.EqualValues(t, 0, m["iterations"]) diff --git a/internal/cmd/tests/cmd_run_test.go b/internal/cmd/tests/cmd_run_test.go index ea7a8758f58..be258329380 100644 --- a/internal/cmd/tests/cmd_run_test.go +++ b/internal/cmd/tests/cmd_run_test.go @@ -31,8 +31,8 @@ import ( "go.k6.io/k6/internal/lib/testutils" "go.k6.io/k6/internal/lib/testutils/httpmultibin" "go.k6.io/k6/js/modules" - "go.k6.io/k6/lib/consts" "go.k6.io/k6/lib/fsext" + "go.k6.io/k6/version" ) func TestVersion(t *testing.T) { @@ -52,7 +52,7 @@ func TestVersion(t *testing.T) { cmd.ExecuteWithGlobalState(ts.GlobalState) stdout := ts.Stdout.String() - assert.Contains(t, stdout, "k6 v"+consts.Version) + assert.Contains(t, stdout, "k6 v"+version.SemVer) assert.Contains(t, stdout, runtime.Version()) assert.Contains(t, stdout, runtime.GOOS) assert.Contains(t, stdout, runtime.GOARCH) diff --git a/internal/cmd/ui.go b/internal/cmd/ui.go index c7ea558608d..9094b9ad1ef 100644 --- a/internal/cmd/ui.go +++ b/internal/cmd/ui.go @@ -19,9 +19,9 @@ import ( "go.k6.io/k6/cmd/state" "go.k6.io/k6/internal/metrics/engine" + "go.k6.io/k6/internal/ui" "go.k6.io/k6/internal/ui/pb" "go.k6.io/k6/lib" - "go.k6.io/k6/lib/consts" "go.k6.io/k6/output" ) @@ -56,7 +56,7 @@ func getBanner(noColor bool, isTrueColor bool) string { c = color.RGB(0xFF, 0x67, 0x1d).Add(color.Bold) } c = setColor(noColor, c) - return c.Sprint(consts.Banner()) + return c.Sprint(ui.Banner()) } // isTrueColor returns true if the terminal supports true color (24-bit color). diff --git a/internal/cmd/version.go b/internal/cmd/version.go index 364e16dfe8d..7adfe3f89fc 100644 --- a/internal/cmd/version.go +++ b/internal/cmd/version.go @@ -10,7 +10,7 @@ import ( "github.com/spf13/cobra" "go.k6.io/k6/cmd/state" "go.k6.io/k6/ext" - "go.k6.io/k6/lib/consts" + "go.k6.io/k6/version" ) const ( @@ -45,7 +45,7 @@ func fullVersion() string { // versionDetails returns the structured details about version func versionDetails() map[string]interface{} { - v := consts.Version + v := version.SemVer if !strings.HasPrefix(v, "v") { v = "v" + v } diff --git a/internal/cmd/version_test.go b/internal/cmd/version_test.go index a42b5b09eb2..1c4e80c6aea 100644 --- a/internal/cmd/version_test.go +++ b/internal/cmd/version_test.go @@ -7,7 +7,7 @@ import ( "github.com/stretchr/testify/assert" "go.k6.io/k6/internal/cmd/tests" - "go.k6.io/k6/lib/consts" + "go.k6.io/k6/version" ) func TestVersionFlag(t *testing.T) { @@ -25,7 +25,7 @@ func TestVersionFlag(t *testing.T) { // Check that the version/format string is correct assert.Contains(t, stdout, "k6 v") - assert.Contains(t, stdout, consts.Version) + assert.Contains(t, stdout, version.SemVer) assert.Contains(t, stdout, runtime.Version()) assert.Contains(t, stdout, runtime.GOOS) assert.Contains(t, stdout, runtime.GOARCH) @@ -46,7 +46,7 @@ func TestVersionSubCommand(t *testing.T) { // Check that the version/format string is correct assert.Contains(t, stdout, "k6 v") - assert.Contains(t, stdout, consts.Version) + assert.Contains(t, stdout, version.SemVer) assert.Contains(t, stdout, runtime.Version()) assert.Contains(t, stdout, runtime.GOOS) assert.Contains(t, stdout, runtime.GOARCH) @@ -75,7 +75,7 @@ func TestVersionJSONSubCommand(t *testing.T) { assert.Contains(t, details, "go_version") assert.Contains(t, details, "go_os") assert.Contains(t, details, "go_arch") - assert.Equal(t, "v"+consts.Version, details["version"]) + assert.Equal(t, "v"+version.SemVer, details["version"]) assert.Equal(t, runtime.Version(), details["go_version"]) assert.Equal(t, runtime.GOOS, details["go_os"]) assert.Equal(t, runtime.GOARCH, details["go_arch"]) diff --git a/internal/js/bundle.go b/internal/js/bundle.go index 89df5b37909..d9300b5746b 100644 --- a/internal/js/bundle.go +++ b/internal/js/bundle.go @@ -26,6 +26,7 @@ import ( "go.k6.io/k6/lib" "go.k6.io/k6/lib/consts" "go.k6.io/k6/lib/fsext" + "go.k6.io/k6/version" ) // A Bundle is a self-contained bundle of scripts and resources. @@ -176,7 +177,7 @@ func (b *Bundle) makeArchive() *lib.Archive { PwdURL: clonedPwdURL, Env: make(map[string]string, len(b.preInitState.RuntimeOptions.Env)), CompatibilityMode: b.CompatibilityMode.String(), - K6Version: consts.Version, + K6Version: version.SemVer, Goos: runtime.GOOS, } // Copy env so changes in the archive are not reflected in the source Bundle diff --git a/internal/js/bundle_test.go b/internal/js/bundle_test.go index 3a170f79c03..68e5ba697d7 100644 --- a/internal/js/bundle_test.go +++ b/internal/js/bundle_test.go @@ -27,6 +27,7 @@ import ( "go.k6.io/k6/lib/fsext" "go.k6.io/k6/lib/types" "go.k6.io/k6/metrics" + "go.k6.io/k6/version" ) const isWindows = runtime.GOOS == "windows" @@ -584,7 +585,7 @@ func TestNewBundleFromArchive(t *testing.T) { arc := &lib.Archive{ Type: "js", FilenameURL: &url.URL{Scheme: "file", Path: "/script"}, - K6Version: consts.Version, + K6Version: version.SemVer, Data: []byte(code), Options: lib.Options{VUs: null.IntFrom(999)}, PwdURL: &url.URL{Scheme: "file", Path: "/"}, @@ -948,7 +949,7 @@ func TestBundleMakeArchive(t *testing.T) { fileData, err := fsext.ReadFile(arc.Filesystems["file"], "/path/to/file.txt") require.NoError(t, err) assert.Equal(t, `hi`, string(fileData)) - assert.Equal(t, consts.Version, arc.K6Version) + assert.Equal(t, version.SemVer, arc.K6Version) assert.Equal(t, tc.cm.String(), arc.CompatibilityMode) }) } diff --git a/internal/output/cloud/output.go b/internal/output/cloud/output.go index 226e39fc8f7..331ae36e59d 100644 --- a/internal/output/cloud/output.go +++ b/internal/output/cloud/output.go @@ -15,10 +15,10 @@ import ( "go.k6.io/k6/errext" "go.k6.io/k6/internal/usage" "go.k6.io/k6/lib" - "go.k6.io/k6/lib/consts" "go.k6.io/k6/metrics" "go.k6.io/k6/output" cloudv2 "go.k6.io/k6/output/cloud/expv2" + "go.k6.io/k6/version" ) const ( @@ -141,7 +141,7 @@ func newOutput(params output.Params) (*Output, error) { } apiClient := cloudapi.NewClient( - logger, conf.Token.String, conf.Host.String, consts.Version, conf.Timeout.TimeDuration()) + logger, conf.Token.String, conf.Host.String, version.SemVer, conf.Timeout.TimeDuration()) return &Output{ config: conf, diff --git a/internal/ui/banner.go b/internal/ui/banner.go new file mode 100644 index 00000000000..760858efa23 --- /dev/null +++ b/internal/ui/banner.go @@ -0,0 +1,16 @@ +package ui + +import "strings" + +// Banner returns the ASCII-art banner with the k6 logo +func Banner() string { + banner := strings.Join([]string{ + ` /\ Grafana /‾‾/ `, + ` /\ / \ |\ __ / / `, + ` / \/ \ | |/ / / ‾‾\ `, + ` / \ | ( | (‾) |`, + ` / __________ \ |_|\_\ \_____/ `, + }, "\n") + + return banner +} diff --git a/lib/archive_test.go b/lib/archive_test.go index 9da014800c7..faa25e8bde8 100644 --- a/lib/archive_test.go +++ b/lib/archive_test.go @@ -11,12 +11,12 @@ import ( "testing" "go.k6.io/k6/internal/lib/testutils" + "go.k6.io/k6/version" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "gopkg.in/guregu/null.v3" - "go.k6.io/k6/lib/consts" "go.k6.io/k6/lib/fsext" "go.k6.io/k6/metrics" ) @@ -114,7 +114,7 @@ func TestArchiveReadWrite(t *testing.T) { t.Parallel() arc1 := &Archive{ Type: "js", - K6Version: consts.Version, + K6Version: version.SemVer, Options: Options{ VUs: null.IntFrom(12345), SystemTags: &metrics.DefaultSystemTagSet, @@ -171,7 +171,7 @@ func TestArchiveReadWrite(t *testing.T) { SystemTags: &metrics.DefaultSystemTagSet, }, FilenameURL: &url.URL{Scheme: "file", Path: fmt.Sprintf("%s/a.js", entry.Pwd)}, - K6Version: consts.Version, + K6Version: version.SemVer, Data: []byte(`// a contents`), PwdURL: &url.URL{Scheme: "file", Path: entry.Pwd}, Filesystems: map[string]fsext.Fs{ @@ -194,7 +194,7 @@ func TestArchiveReadWrite(t *testing.T) { SystemTags: &metrics.DefaultSystemTagSet, }, FilenameURL: &url.URL{Scheme: "file", Path: fmt.Sprintf("%s/a.js", entry.PwdNormAnon)}, - K6Version: consts.Version, + K6Version: version.SemVer, Data: []byte(`// a contents`), PwdURL: &url.URL{Scheme: "file", Path: entry.PwdNormAnon}, @@ -253,7 +253,7 @@ func TestUsingCacheFromCacheOnReadFs(t *testing.T) { arc := &Archive{ Type: "js", FilenameURL: &url.URL{Scheme: "file", Path: "/correct"}, - K6Version: consts.Version, + K6Version: version.SemVer, Data: []byte(`test`), PwdURL: &url.URL{Scheme: "file", Path: "/"}, Filesystems: map[string]fsext.Fs{ @@ -282,7 +282,7 @@ func TestArchiveWithDataNotInFS(t *testing.T) { arc := &Archive{ Type: "js", FilenameURL: &url.URL{Scheme: "file", Path: "/script"}, - K6Version: consts.Version, + K6Version: version.SemVer, Data: []byte(`test`), PwdURL: &url.URL{Scheme: "file", Path: "/"}, Filesystems: nil, @@ -320,7 +320,7 @@ func TestStrangePaths(t *testing.T) { } arc1 := &Archive{ Type: "js", - K6Version: consts.Version, + K6Version: version.SemVer, Options: Options{ VUs: null.IntFrom(12345), SystemTags: &metrics.DefaultSystemTagSet, @@ -363,7 +363,7 @@ func TestStdinArchive(t *testing.T) { arc := &Archive{ Type: "js", FilenameURL: &url.URL{Scheme: "file", Path: "/-"}, - K6Version: consts.Version, + K6Version: version.SemVer, Data: []byte(`test`), PwdURL: &url.URL{Scheme: "file", Path: "/"}, Filesystems: map[string]fsext.Fs{ diff --git a/lib/consts/consts.go b/lib/consts/consts.go index 82120314eba..554574f0bf2 100644 --- a/lib/consts/consts.go +++ b/lib/consts/consts.go @@ -1,22 +1,10 @@ // Package consts houses some constants needed across k6 package consts -import ( - "strings" -) +import "go.k6.io/k6/version" // Version contains the current semantic version of k6. -const Version = "0.57.0" - -// Banner returns the ASCII-art banner with the k6 logo -func Banner() string { - banner := strings.Join([]string{ - ` /\ Grafana /‾‾/ `, - ` /\ / \ |\ __ / / `, - ` / \/ \ | |/ / / ‾‾\ `, - ` / \ | ( | (‾) |`, - ` / __________ \ |_|\_\ \_____/ `, - }, "\n") - - return banner -} +// +// Deprecated: alias to support the legacy versioning API. Use the new version package, +// it will be removed as soon as the external services stop to depend on it. +const Version = version.SemVer diff --git a/lib/executor/executors_test.go b/lib/executor/executors_test.go index 0da9ef6e888..fffe4832e8f 100644 --- a/lib/executor/executors_test.go +++ b/lib/executor/executors_test.go @@ -9,13 +9,13 @@ import ( "time" "go.k6.io/k6/internal/lib/testutils" + "go.k6.io/k6/version" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "gopkg.in/guregu/null.v3" "go.k6.io/k6/lib" - "go.k6.io/k6/lib/consts" "go.k6.io/k6/lib/fsext" "go.k6.io/k6/lib/types" ) @@ -484,7 +484,7 @@ func TestArchiveRoundTripExecutorConfig(t *testing.T) { } arc1 := &lib.Archive{ Type: "js", - K6Version: consts.Version, + K6Version: version.SemVer, Options: lib.Options{ Scenarios: map[string]lib.ExecutorConfig{ "const-vus": execCfg, diff --git a/output/cloud/expv2/output.go b/output/cloud/expv2/output.go index 896d8574863..bab087e08c0 100644 --- a/output/cloud/expv2/output.go +++ b/output/cloud/expv2/output.go @@ -16,9 +16,9 @@ import ( "go.k6.io/k6/errext/exitcodes" "go.k6.io/k6/internal/cloudapi/insights" insightsOutput "go.k6.io/k6/internal/output/cloud/insights" - "go.k6.io/k6/lib/consts" "go.k6.io/k6/metrics" "go.k6.io/k6/output" + "go.k6.io/k6/version" "github.com/sirupsen/logrus" ) @@ -70,7 +70,7 @@ func New(logger logrus.FieldLogger, conf cloudapi.Config, _ *cloudapi.Client) (* // It creates a new client because in the case the backend has overwritten // the config we need to use the new set. cloudClient: cloudapi.NewClient( - logger, conf.Token.String, conf.Host.String, consts.Version, conf.Timeout.TimeDuration()), + logger, conf.Token.String, conf.Host.String, version.SemVer, conf.Timeout.TimeDuration()), }, nil } diff --git a/version/version.go b/version/version.go new file mode 100644 index 00000000000..44e9146ddee --- /dev/null +++ b/version/version.go @@ -0,0 +1,6 @@ +// Package version handles k6 versioning +package version + +// SemVer contains the current version of k6 +// represented using Semantic Versioning expression. +const SemVer = "0.56.0"