diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e7737f2d..5782d24a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -38,7 +38,7 @@ jobs: - name: Lint run: | - make shellcheck cuelint check-buildkit-version docslint + make shellcheck cuelint docslint - name: Markdown Lint uses: avto-dev/markdown-lint@v1 diff --git a/.goreleaser.yml b/.goreleaser.yml index 36c9471d..f8b3d6b1 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -5,14 +5,14 @@ before: - go mod download builds: - - - env: + - env: - CGO_ENABLED=0 main: ./cmd/dagger binary: dagger ldflags: - -s -w - - -X go.dagger.io/dagger/cmd/dagger/cmd.version={{.Version}} + - -X go.dagger.io/dagger/version.Version={{.Version}} + - -X go.dagger.io/dagger/version.Revision={{.ShortCommit}} goos: - linux - windows @@ -22,8 +22,7 @@ builds: - arm64 archives: - - - name_template: "{{ .ProjectName }}_{{ .Tag }}_{{ .Os }}_{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}{{ if .Mips }}_{{ .Mips }}{{ end }}" + - name_template: "{{ .ProjectName }}_{{ .Tag }}_{{ .Os }}_{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}{{ if .Mips }}_{{ .Mips }}{{ end }}" replacements: files: - LICENSE @@ -33,7 +32,7 @@ archives: format: zip checksum: - name_template: 'checksums.txt' + name_template: "checksums.txt" snapshot: name_template: "{{ .Tag }}-next" @@ -42,15 +41,14 @@ changelog: sort: asc filters: exclude: - - '^docs:' - - '^doc:' - - '^test:' - - '^tests:' - - '^Merge pull request' + - "^docs:" + - "^doc:" + - "^test:" + - "^tests:" + - "^Merge pull request" brews: - - - tap: + - tap: owner: dagger name: homebrew-tap commit_author: @@ -63,15 +61,13 @@ brews: system "#{bin}/dagger version" blobs: - - - provider: s3 + - provider: s3 region: us-east-1 bucket: dagger-io folder: "dagger/releases/{{ .Version }}" publishers: - - - name: publish-version + - name: publish-version cmd: sh -c "echo {{ .Version }} | aws s3 cp - s3://dagger-io/dagger/latest_version" env: - PATH={{ .Env.PATH }} diff --git a/Makefile b/Makefile index 00c5e1e8..a11c410f 100644 --- a/Makefile +++ b/Makefile @@ -1,13 +1,15 @@ +GIT_REVISION := $(shell git rev-parse --short HEAD) + .PHONY: all all: dagger .PHONY: dagger dagger: - CGO_ENABLED=0 go build -o ./cmd/dagger/ -ldflags '-s -w' ./cmd/dagger/ + CGO_ENABLED=0 go build -o ./cmd/dagger/ -ldflags '-s -w -X go.dagger.io/dagger/version.Revision=$(GIT_REVISION)' ./cmd/dagger/ .PHONY: dagger-debug dagger-debug: - go build -race -o ./cmd/dagger/dagger-debug ./cmd/dagger/ + go build -race -o ./cmd/dagger/dagger-debug -ldflags '-X go.dagger.io/dagger/version.Revision=$(GIT_REVISION)' ./cmd/dagger/ .PHONY: test test: @@ -31,14 +33,7 @@ shellcheck: shellcheck ./universe/*.bats ./universe/*.bash .PHONY: lint -lint: shellcheck cuelint golint check-buildkit-version docslint - -.PHONY: check-buildkit-version -check-buildkit-version: - @test \ - "$(shell grep buildkit ./go.mod | cut -d' ' -f2)" = \ - "$(shell grep ' = "v' ./util/buildkitd/buildkitd.go | sed -E 's/^.*version.*=.*\"(v.*)\"/\1/' )" \ - || { echo buildkit version mismatch go.mod != util/buildkitd/buildkitd.go ; exit 1; } +lint: shellcheck cuelint golint docslint .PHONY: integration integration: core-integration universe-test diff --git a/cmd/dagger/cmd/common/track.go b/cmd/dagger/cmd/common/track.go new file mode 100644 index 00000000..30078487 --- /dev/null +++ b/cmd/dagger/cmd/common/track.go @@ -0,0 +1,87 @@ +package common + +import ( + "context" + "crypto/sha256" + "fmt" + "strings" + + "github.com/go-git/go-git/v5" + "github.com/spf13/cobra" + "go.dagger.io/dagger/state" + "go.dagger.io/dagger/telemetry" +) + +// TrackCommand sends telemetry about a command execution +func TrackCommand(ctx context.Context, cmd *cobra.Command, props ...*telemetry.Property) chan struct{} { + props = append([]*telemetry.Property{ + { + Name: "command", + Value: commandName(cmd), + }, + }, props...) + + return telemetry.TrackAsync(ctx, "Command Executed", props...) +} + +func commandName(cmd *cobra.Command) string { + parts := []string{} + for c := cmd; c.Parent() != nil; c = c.Parent() { + parts = append([]string{c.Name()}, parts...) + } + return strings.Join(parts, " ") +} + +// TrackWorkspaceCommand is like TrackCommand but includes workspace and +// optionally environment metadata. +func TrackWorkspaceCommand(ctx context.Context, cmd *cobra.Command, w *state.Workspace, env *state.State, props ...*telemetry.Property) chan struct{} { + props = append([]*telemetry.Property{ + { + // Hash the repository URL for privacy + Name: "git_repository_hash", + Value: hash(gitRepoURL(w.Path)), + }, + { + // The workspace path might contain the username (e.g. /home/user/workspace), so we hash itfor privacy. + Name: "workspace_path_hash", + Value: hash(w.Path), + }, + }, props...) + + if env != nil { + props = append([]*telemetry.Property{ + { + Name: "environment_name", + Value: env.Name, + }, + }, props...) + } + + return TrackCommand(ctx, cmd, props...) +} + +// hash returns the sha256 digest of the string +func hash(s string) string { + return fmt.Sprintf("%x", sha256.Sum256([]byte(s))) +} + +// gitRepoURL returns the git repository remote, if any. +func gitRepoURL(path string) string { + repo, err := git.PlainOpenWithOptions(path, &git.PlainOpenOptions{ + DetectDotGit: true, + }) + if err != nil { + return "" + } + + origin, err := repo.Remote("origin") + if err != nil { + return "" + } + + if urls := origin.Config().URLs; len(urls) > 0 { + return urls[0] + } + + return "" +} diff --git a/cmd/dagger/cmd/compute.go b/cmd/dagger/cmd/compute.go index 2c758223..2557f0de 100644 --- a/cmd/dagger/cmd/compute.go +++ b/cmd/dagger/cmd/compute.go @@ -38,6 +38,8 @@ var computeCmd = &cobra.Command{ lg := logger.New() ctx := lg.WithContext(cmd.Context()) + doneCh := common.TrackCommand(ctx, cmd) + st := &state.State{ Name: "FIXME", Path: args[0], @@ -191,6 +193,8 @@ var computeCmd = &cobra.Command{ return nil }) + <-doneCh + if err != nil { lg.Fatal().Err(err).Msg("failed to up environment") } diff --git a/cmd/dagger/cmd/doc.go b/cmd/dagger/cmd/doc.go index e76aa2b9..932f2d3b 100644 --- a/cmd/dagger/cmd/doc.go +++ b/cmd/dagger/cmd/doc.go @@ -269,6 +269,8 @@ var docCmd = &cobra.Command{ lg := logger.New() ctx := lg.WithContext(cmd.Context()) + doneCh := common.TrackCommand(ctx, cmd) + format := viper.GetString("format") if format != textFormat && format != markdownFormat && @@ -297,6 +299,8 @@ var docCmd = &cobra.Command{ } p := Parse(ctx, packageName, val) fmt.Printf("%s", p.Format(format)) + + <-doneCh }, } diff --git a/cmd/dagger/cmd/edit.go b/cmd/dagger/cmd/edit.go index 60e5d5a7..ab37dbdc 100644 --- a/cmd/dagger/cmd/edit.go +++ b/cmd/dagger/cmd/edit.go @@ -37,6 +37,12 @@ var editCmd = &cobra.Command{ workspace := common.CurrentWorkspace(ctx) st := common.CurrentEnvironmentState(ctx, workspace) + lg = lg.With(). + Str("environment", st.Name). + Logger() + + doneCh := common.TrackWorkspaceCommand(ctx, cmd, workspace, st) + data, err := yaml.Marshal(st) if err != nil { lg.Fatal().Err(err).Msg("unable to marshal state") @@ -80,6 +86,8 @@ var editCmd = &cobra.Command{ return nil }) + <-doneCh + if err != nil { lg.Fatal().Err(err).Str("environment", st.Name).Msg("invalid input") } diff --git a/cmd/dagger/cmd/init.go b/cmd/dagger/cmd/init.go index f16975ba..be8438a2 100644 --- a/cmd/dagger/cmd/init.go +++ b/cmd/dagger/cmd/init.go @@ -5,6 +5,7 @@ import ( "github.com/spf13/cobra" "github.com/spf13/viper" + "go.dagger.io/dagger/cmd/dagger/cmd/common" "go.dagger.io/dagger/cmd/dagger/logger" "go.dagger.io/dagger/state" ) @@ -36,10 +37,13 @@ var initCmd = &cobra.Command{ dir = cwd } - _, err := state.Init(ctx, dir) + workspace, err := state.Init(ctx, dir) if err != nil { lg.Fatal().Err(err).Msg("failed to initialize workspace") } + + <-common.TrackWorkspaceCommand(ctx, cmd, workspace, nil) + }, } diff --git a/cmd/dagger/cmd/input/container.go b/cmd/dagger/cmd/input/container.go index d9b9eb4c..a9e4b994 100644 --- a/cmd/dagger/cmd/input/container.go +++ b/cmd/dagger/cmd/input/container.go @@ -3,7 +3,6 @@ package input import ( "github.com/spf13/cobra" "github.com/spf13/viper" - "go.dagger.io/dagger/cmd/dagger/cmd/common" "go.dagger.io/dagger/cmd/dagger/logger" "go.dagger.io/dagger/state" ) @@ -23,7 +22,7 @@ var containerCmd = &cobra.Command{ lg := logger.New() ctx := lg.WithContext(cmd.Context()) - updateEnvironmentInput(ctx, common.NewClient(ctx, false), args[0], state.DockerInput(args[1])) + updateEnvironmentInput(ctx, cmd, args[0], state.DockerInput(args[1])) }, } diff --git a/cmd/dagger/cmd/input/dir.go b/cmd/dagger/cmd/input/dir.go index 1b17b45a..0f404bb7 100644 --- a/cmd/dagger/cmd/input/dir.go +++ b/cmd/dagger/cmd/input/dir.go @@ -43,7 +43,7 @@ var dirCmd = &cobra.Command{ p = "./" + p } - updateEnvironmentInput(ctx, common.NewClient(ctx, false), args[0], + updateEnvironmentInput(ctx, cmd, args[0], state.DirInput( p, viper.GetStringSlice("include"), diff --git a/cmd/dagger/cmd/input/git.go b/cmd/dagger/cmd/input/git.go index 006293b9..5cddefa0 100644 --- a/cmd/dagger/cmd/input/git.go +++ b/cmd/dagger/cmd/input/git.go @@ -3,7 +3,6 @@ package input import ( "github.com/spf13/cobra" "github.com/spf13/viper" - "go.dagger.io/dagger/cmd/dagger/cmd/common" "go.dagger.io/dagger/cmd/dagger/logger" "go.dagger.io/dagger/state" ) @@ -33,7 +32,7 @@ var gitCmd = &cobra.Command{ subDir = args[3] } - updateEnvironmentInput(ctx, common.NewClient(ctx, false), args[0], state.GitInput(args[1], ref, subDir)) + updateEnvironmentInput(ctx, cmd, args[0], state.GitInput(args[1], ref, subDir)) }, } diff --git a/cmd/dagger/cmd/input/json.go b/cmd/dagger/cmd/input/json.go index 34e5fffd..f5c47325 100644 --- a/cmd/dagger/cmd/input/json.go +++ b/cmd/dagger/cmd/input/json.go @@ -3,7 +3,6 @@ package input import ( "github.com/spf13/cobra" "github.com/spf13/viper" - "go.dagger.io/dagger/cmd/dagger/cmd/common" "go.dagger.io/dagger/cmd/dagger/logger" "go.dagger.io/dagger/state" ) @@ -25,7 +24,7 @@ var jsonCmd = &cobra.Command{ updateEnvironmentInput( ctx, - common.NewClient(ctx, false), + cmd, args[0], state.JSONInput(readInput(ctx, args[1])), ) diff --git a/cmd/dagger/cmd/input/list.go b/cmd/dagger/cmd/input/list.go index 8bd4d350..6221ae0c 100644 --- a/cmd/dagger/cmd/input/list.go +++ b/cmd/dagger/cmd/input/list.go @@ -40,6 +40,8 @@ var listCmd = &cobra.Command{ Str("environment", st.Name). Logger() + doneCh := common.TrackWorkspaceCommand(ctx, cmd, workspace, st) + c, err := client.New(ctx, "", false) if err != nil { lg.Fatal().Err(err).Msg("unable to create client") @@ -77,6 +79,8 @@ var listCmd = &cobra.Command{ return nil }) + <-doneCh + if err != nil { lg.Fatal().Err(err).Msg("failed to query environment") } diff --git a/cmd/dagger/cmd/input/root.go b/cmd/dagger/cmd/input/root.go index f77ff73a..44d9e2e1 100644 --- a/cmd/dagger/cmd/input/root.go +++ b/cmd/dagger/cmd/input/root.go @@ -8,11 +8,11 @@ import ( "github.com/rs/zerolog/log" "github.com/spf13/cobra" "github.com/spf13/viper" - "go.dagger.io/dagger/client" "go.dagger.io/dagger/cmd/dagger/cmd/common" "go.dagger.io/dagger/environment" "go.dagger.io/dagger/solver" "go.dagger.io/dagger/state" + "go.dagger.io/dagger/telemetry" ) // Cmd exposes the top-level command @@ -35,12 +35,23 @@ func init() { ) } -func updateEnvironmentInput(ctx context.Context, cl *client.Client, target string, input state.Input) { - lg := log.Ctx(ctx) +func updateEnvironmentInput(ctx context.Context, cmd *cobra.Command, target string, input state.Input) { + lg := *log.Ctx(ctx) workspace := common.CurrentWorkspace(ctx) st := common.CurrentEnvironmentState(ctx, workspace) + lg = lg.With(). + Str("environment", st.Name). + Logger() + + doneCh := common.TrackWorkspaceCommand(ctx, cmd, workspace, st, &telemetry.Property{ + Name: "input_target", + Value: target, + }) + + cl := common.NewClient(ctx, false) + st.SetInput(target, input) err := cl.Do(ctx, st, func(ctx context.Context, env *environment.Environment, s solver.Solver) error { @@ -52,12 +63,14 @@ func updateEnvironmentInput(ctx context.Context, cl *client.Client, target strin return nil }) + <-doneCh + if err != nil { - lg.Fatal().Err(err).Str("environment", st.Name).Msg("invalid input") + lg.Fatal().Err(err).Msg("invalid input") } if err := workspace.Save(ctx, st); err != nil { - lg.Fatal().Err(err).Str("environment", st.Name).Msg("cannot update environment") + lg.Fatal().Err(err).Msg("cannot update environment") } } diff --git a/cmd/dagger/cmd/input/secret.go b/cmd/dagger/cmd/input/secret.go index b1d794f3..b33a4230 100644 --- a/cmd/dagger/cmd/input/secret.go +++ b/cmd/dagger/cmd/input/secret.go @@ -6,7 +6,6 @@ import ( "github.com/spf13/cobra" "github.com/spf13/viper" - "go.dagger.io/dagger/cmd/dagger/cmd/common" "go.dagger.io/dagger/cmd/dagger/logger" "go.dagger.io/dagger/state" "golang.org/x/term" @@ -44,7 +43,7 @@ var secretCmd = &cobra.Command{ updateEnvironmentInput( ctx, - common.NewClient(ctx, false), + cmd, args[0], state.SecretInput(secret), ) diff --git a/cmd/dagger/cmd/input/text.go b/cmd/dagger/cmd/input/text.go index 1bd8daae..bfe63cd8 100644 --- a/cmd/dagger/cmd/input/text.go +++ b/cmd/dagger/cmd/input/text.go @@ -3,7 +3,6 @@ package input import ( "github.com/spf13/cobra" "github.com/spf13/viper" - "go.dagger.io/dagger/cmd/dagger/cmd/common" "go.dagger.io/dagger/cmd/dagger/logger" "go.dagger.io/dagger/state" ) @@ -25,7 +24,7 @@ var textCmd = &cobra.Command{ updateEnvironmentInput( ctx, - common.NewClient(ctx, false), + cmd, args[0], state.TextInput(readInput(ctx, args[1])), ) diff --git a/cmd/dagger/cmd/input/yaml.go b/cmd/dagger/cmd/input/yaml.go index 977cd5ba..a4204eaa 100644 --- a/cmd/dagger/cmd/input/yaml.go +++ b/cmd/dagger/cmd/input/yaml.go @@ -3,7 +3,6 @@ package input import ( "github.com/spf13/cobra" "github.com/spf13/viper" - "go.dagger.io/dagger/cmd/dagger/cmd/common" "go.dagger.io/dagger/cmd/dagger/logger" "go.dagger.io/dagger/state" ) @@ -25,7 +24,7 @@ var yamlCmd = &cobra.Command{ updateEnvironmentInput( ctx, - common.NewClient(ctx, false), + cmd, args[0], state.YAMLInput(readInput(ctx, args[1])), ) diff --git a/cmd/dagger/cmd/list.go b/cmd/dagger/cmd/list.go index e19589cf..c7224cd2 100644 --- a/cmd/dagger/cmd/list.go +++ b/cmd/dagger/cmd/list.go @@ -30,6 +30,8 @@ var listCmd = &cobra.Command{ ctx := lg.WithContext(cmd.Context()) workspace := common.CurrentWorkspace(ctx) + doneCh := common.TrackWorkspaceCommand(ctx, cmd, workspace, nil) + environments, err := workspace.List(ctx) if err != nil { lg. @@ -44,6 +46,8 @@ var listCmd = &cobra.Command{ line := fmt.Sprintf("%s\t%s\t", e.Name, formatPath(e.Path)) fmt.Fprintln(w, line) } + + <-doneCh }, } diff --git a/cmd/dagger/cmd/new.go b/cmd/dagger/cmd/new.go index 70ece746..a86cb6f5 100644 --- a/cmd/dagger/cmd/new.go +++ b/cmd/dagger/cmd/new.go @@ -32,12 +32,15 @@ var newCmd = &cobra.Command{ } name := args[0] - _, err := workspace.Create(ctx, name, state.Plan{ + st, err := workspace.Create(ctx, name, state.Plan{ Package: viper.GetString("package"), }) + if err != nil { lg.Fatal().Err(err).Msg("failed to create environment") } + + <-common.TrackWorkspaceCommand(ctx, cmd, workspace, st) }, } diff --git a/cmd/dagger/cmd/output/list.go b/cmd/dagger/cmd/output/list.go index e1852069..6d39e3ee 100644 --- a/cmd/dagger/cmd/output/list.go +++ b/cmd/dagger/cmd/output/list.go @@ -34,11 +34,19 @@ var listCmd = &cobra.Command{ workspace := common.CurrentWorkspace(ctx) st := common.CurrentEnvironmentState(ctx, workspace) + lg = lg.With(). + Str("environment", st.Name). + Logger() + + doneCh := common.TrackWorkspaceCommand(ctx, cmd, workspace, st) + cl := common.NewClient(ctx, false) err := cl.Do(ctx, st, func(ctx context.Context, env *environment.Environment, s solver.Solver) error { return ListOutputs(ctx, env, true) }) + <-doneCh + if err != nil { lg.Fatal().Err(err).Msg("failed to scan outputs") } diff --git a/cmd/dagger/cmd/query.go b/cmd/dagger/cmd/query.go index 5d7390cf..afc569f0 100644 --- a/cmd/dagger/cmd/query.go +++ b/cmd/dagger/cmd/query.go @@ -30,8 +30,6 @@ var queryCmd = &cobra.Command{ lg := logger.New() ctx := lg.WithContext(cmd.Context()) - cueOpts := parseQueryFlags() - workspace := common.CurrentWorkspace(ctx) state := common.CurrentEnvironmentState(ctx, workspace) @@ -39,11 +37,14 @@ var queryCmd = &cobra.Command{ Str("environment", state.Name). Logger() + cueOpts := parseQueryFlags() cuePath := cue.MakePath() if len(args) > 0 { cuePath = cue.ParsePath(args[0]) } + doneCh := common.TrackWorkspaceCommand(ctx, cmd, workspace, state) + cl := common.NewClient(ctx, false) cueVal := compiler.NewValue() @@ -62,6 +63,8 @@ var queryCmd = &cobra.Command{ return nil }) + <-doneCh + if err != nil { lg.Fatal().Err(err).Msg("failed to query environment") } diff --git a/cmd/dagger/cmd/up.go b/cmd/dagger/cmd/up.go index b438edd6..51a1c552 100644 --- a/cmd/dagger/cmd/up.go +++ b/cmd/dagger/cmd/up.go @@ -37,6 +37,12 @@ var upCmd = &cobra.Command{ workspace := common.CurrentWorkspace(ctx) st := common.CurrentEnvironmentState(ctx, workspace) + lg = lg.With(). + Str("environment", st.Name). + Logger() + + doneCh := common.TrackWorkspaceCommand(ctx, cmd, workspace, st) + cl := common.NewClient(ctx, viper.GetBool("no-cache")) err := cl.Do(ctx, st, func(ctx context.Context, env *environment.Environment, s solver.Solver) error { @@ -57,6 +63,8 @@ var upCmd = &cobra.Command{ return output.ListOutputs(ctx, env, term.IsTerminal(int(os.Stdout.Fd()))) }) + <-doneCh + if err != nil { lg.Fatal().Err(err).Msg("failed to up environment") } diff --git a/cmd/dagger/cmd/version.go b/cmd/dagger/cmd/version.go index b4f1acdc..3537cc95 100644 --- a/cmd/dagger/cmd/version.go +++ b/cmd/dagger/cmd/version.go @@ -1,14 +1,12 @@ package cmd import ( - "errors" "fmt" "io/ioutil" "net/http" "os" "path" "runtime" - "runtime/debug" "strings" "time" @@ -16,19 +14,16 @@ import ( "github.com/mitchellh/go-homedir" "github.com/spf13/cobra" "github.com/spf13/viper" + "go.dagger.io/dagger/version" "golang.org/x/term" ) const ( - defaultVersion = "devel" - versionFile = "~/.config/dagger/version-check" - versionURL = "https://releases.dagger.io/dagger/latest_version" + versionFile = "~/.config/dagger/version-check" + versionURL = "https://releases.dagger.io/dagger/latest_version" ) -// set by goreleaser or other builder using -// -ldflags='-X go.dagger.io/dagger/cmd/dagger/cmd.version=' var ( - version = defaultVersion versionMessage = "" ) @@ -40,12 +35,9 @@ var versionCmd = &cobra.Command{ PersistentPostRun: func(*cobra.Command, []string) {}, Args: cobra.NoArgs, Run: func(cmd *cobra.Command, args []string) { - if bi, ok := debug.ReadBuildInfo(); ok && version == defaultVersion { - // No specific version provided via version - version = bi.Main.Version - } - fmt.Printf("dagger version %v %s/%s\n", - version, + fmt.Printf("dagger %s (%s) %s/%s\n", + version.Version, + version.Revision, runtime.GOOS, runtime.GOARCH, ) @@ -99,18 +91,6 @@ func isCheckOutdated(path string) bool { return !time.Now().Before(nextCheck) } -func getCurrentVersion() (*goVersion.Version, error) { - if version != defaultVersion { - return goVersion.NewVersion(version) - } - - if build, ok := debug.ReadBuildInfo(); ok { - // Also return error if version == (devel) - return goVersion.NewVersion(build.Main.Version) - } - return nil, errors.New("could not read dagger version") -} - func getLatestVersion(currentVersion *goVersion.Version) (*goVersion.Version, error) { req, err := http.NewRequest("GET", versionURL, nil) if err != nil { @@ -139,7 +119,7 @@ func getLatestVersion(currentVersion *goVersion.Version) (*goVersion.Version, er // Compare the binary version with the latest version online // Return the latest version if current is outdated func isVersionLatest() (string, error) { - currentVersion, err := getCurrentVersion() + currentVersion, err := goVersion.NewVersion(version.Version) if err != nil { return "", err } @@ -156,7 +136,7 @@ func isVersionLatest() (string, error) { } func checkVersion() { - if version == defaultVersion { + if version.Version == version.DevelopmentVersion { // running devel version return } diff --git a/go.mod b/go.mod index 14cb4198..4b1872ba 100644 --- a/go.mod +++ b/go.mod @@ -9,21 +9,22 @@ require ( github.com/Azure/go-autorest/autorest/azure/auth v0.4.2 // indirect github.com/KromDaniel/jonson v0.0.0-20180630143114-d2f9c3c389db github.com/containerd/console v1.0.2 + github.com/containerd/containerd v1.5.3 // indirect github.com/docker/distribution v2.7.1+incompatible github.com/docker/libnetwork v0.8.0-dev.2.0.20200917202933-d0951081b35f // indirect github.com/emicklei/proto v1.9.0 // indirect github.com/fatih/color v1.9.0 // indirect + github.com/go-git/go-git/v5 v5.4.2 github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 + github.com/google/uuid v1.3.0 github.com/hashicorp/go-retryablehttp v0.6.6 // indirect github.com/hashicorp/go-version v1.3.0 github.com/jaguilar/vt100 v0.0.0-20150826170717-2703a27b14ea - github.com/kr/text v0.2.0 // indirect github.com/mattn/go-colorable v0.1.8 // indirect github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db github.com/mitchellh/go-homedir v1.1.0 github.com/moby/buildkit v0.9.0-rc1 github.com/morikuni/aec v1.0.0 - github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect github.com/opencontainers/go-digest v1.0.0 github.com/rs/zerolog v1.23.0 github.com/smartystreets/assertions v1.0.0 // indirect @@ -42,7 +43,6 @@ require ( golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e google.golang.org/grpc v1.39.0 - gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b ) diff --git a/go.sum b/go.sum index 5fc4d744..dfc6d284 100644 --- a/go.sum +++ b/go.sum @@ -116,19 +116,24 @@ github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEY github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg38RRsjT5y8= github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2ow3VK6a9Lg= github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn69iY6URG00= -github.com/Microsoft/hcsshim v0.8.16 h1:8/auA4LFIZFTGrqfKhGBSXwM6/4X1fHa/xniyEHu8ac= github.com/Microsoft/hcsshim v0.8.16/go.mod h1:o5/SZqmR7x9JNKsW3pu+nqHm0MF8vbA+VxGOoXdC600= +github.com/Microsoft/hcsshim v0.8.18 h1:cYnKADiM1869gvBpos3YCteeT6sZLB48lB5dmMMs8Tg= +github.com/Microsoft/hcsshim v0.8.18/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU= github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7 h1:YoJbenK9C67SkzkDfmQuVln04ygHj3vjZfd9FL+GmQQ= +github.com/ProtonMail/go-crypto v0.0.0-20210428141323-04723f9f07d7/go.mod h1:z4/9nQmJSSwwds7ejkxaJwO37dru3geImFUdJlaLzQo= 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/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= +github.com/acomagu/bufpipe v1.0.3 h1:fxAGrHZTgQ9w5QqVItgzwj235/uYZYgbXitB+dLupOk= +github.com/acomagu/bufpipe v1.0.3/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4= github.com/agext/levenshtein v1.2.3 h1:YB2fHEn0UJagG8T1rrWknE3ZQzWM06O8AMAatNn7lmo= github.com/agext/levenshtein v1.2.3/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -136,12 +141,16 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA= +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +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-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= github.com/aws/aws-sdk-go v1.37.18 h1:SRdWLg+DqMFWX8HB3UvXyAoZpw9IDIUYnSTwgzOYbqg= @@ -220,8 +229,10 @@ github.com/containerd/containerd v1.5.0-beta.1/go.mod h1:5HfvG1V2FsKesEGQ17k5/T7 github.com/containerd/containerd v1.5.0-beta.3/go.mod h1:/wr9AVtEM7x9c+n0+stptlo/uBBoBORwEx6ardVcmKU= github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09ZvgqEq8EfBp/m3lcVZIvPHhI= github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s= -github.com/containerd/containerd v1.5.2 h1:MG/Bg1pbmMb61j3wHCFWPxESXHieiKr2xG64px/k8zQ= +github.com/containerd/containerd v1.5.1/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= github.com/containerd/containerd v1.5.2/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= +github.com/containerd/containerd v1.5.3 h1:mfKOepNDIJ3EiBTEyHFpEqB6YSOSkGcjPDIu7cD+YzY= +github.com/containerd/containerd v1.5.3/go.mod h1:sx18RgvW6ABJ4iYUw7Q5x7bgFOAB9B6G7+yO0XBc4zw= github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= @@ -350,6 +361,8 @@ github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT github.com/emicklei/proto v1.6.15/go.mod h1:rn1FgRS/FANiZdD2djyH7TMA9jdRDcYQ9IEN9yvjX0A= github.com/emicklei/proto v1.9.0 h1:l0QiNT6Qs7Yj0Mb4X6dnWBQer4ebei2BFcgQLbGqUDc= github.com/emicklei/proto v1.9.0/go.mod h1:rn1FgRS/FANiZdD2djyH7TMA9jdRDcYQ9IEN9yvjX0A= +github.com/emirpasic/gods v1.12.0 h1:QAUIPSaCu4G+POclxeqb3F+WPpdKqFGlw36+yOzGlrg= +github.com/emirpasic/gods v1.12.0/go.mod h1:YfzfFFoVP/catgzJb4IKIqXjX78Ha8FMSDh3ymbK86o= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -363,6 +376,7 @@ github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5Kwzbycv github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk= github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= @@ -373,6 +387,17 @@ github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXt github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0= +github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= +github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4= +github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= +github.com/go-git/go-billy/v5 v5.2.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= +github.com/go-git/go-billy/v5 v5.3.1 h1:CPiOUAzKtMRvolEKw+bG1PLRpT7D3LIs3/3ey4Aiu34= +github.com/go-git/go-billy/v5 v5.3.1/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= +github.com/go-git/go-git-fixtures/v4 v4.2.1 h1:n9gGL1Ct/yIw+nfsfr8s4+sbhT+Ncu2SubfXjIWgci8= +github.com/go-git/go-git-fixtures/v4 v4.2.1/go.mod h1:K8zd3kDUAykwTdDCr+I0per6Y6vMiRR/nnVTBtavnB0= +github.com/go-git/go-git/v5 v5.4.2 h1:BXyZu9t0VkbiHtqrsvdq39UDhGJTl1h55VW6CSC4aY4= +github.com/go-git/go-git/v5 v5.4.2/go.mod h1:gQ1kArt6d+n+BGd+/B/I74HwRTLhth2+zti4ihgckDc= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -488,8 +513,9 @@ github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3 github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 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.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs= github.com/google/uuid v1.2.0/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/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= @@ -577,10 +603,15 @@ github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJ github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= +github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/ishidawataru/sctp v0.0.0-20210226210310-f2269e66cdee/go.mod h1:co9pwDoBCm1kGxawmb4sPq0cSIOOWNPT4KnHotMP1Zg= github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= +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.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= @@ -597,6 +628,8 @@ github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/X 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/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351 h1:DowS9hvgyYSX4TO5NpyC606/Z4SxnNYbT+WX27or6Ck= +github.com/kevinburke/ssh_config v0.0.0-20201106050909-4977a11b4351/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= @@ -632,6 +665,8 @@ github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= +github.com/matryer/is v1.2.0 h1:92UTHpy8CDwaJ08GqLDzhhuixiBUUD1p3AU6PHddz4A= +github.com/matryer/is v1.2.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8= @@ -696,7 +731,6 @@ github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8m github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= @@ -821,6 +855,7 @@ github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiB github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= +github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/serialx/hashring v0.0.0-20190422032157-8b2912629002/go.mod h1:/yeG0My1xr/u+HZrFQ1tOQQQQrOawfyMUH13ai5brBc= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= @@ -910,6 +945,8 @@ github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1 github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= github.com/willf/bitset v1.1.11 h1:N7Z7E9UvjW+sGsEl7k/SJrvY2reP1A07MrGuCjIOjRE= github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= +github.com/xanzy/ssh-agent v0.3.0 h1:wUMzuKtKilRgBAD1sUb8gOwwRr2FGoBVumcjoOACClI= +github.com/xanzy/ssh-agent v0.3.0/go.mod h1:3s9xbODqPuuhK9JV1R321M/FlMZSBvE5aY6eAcqrDh0= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= @@ -978,6 +1015,7 @@ golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190418165655-df01cb2cc480/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -993,8 +1031,9 @@ golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2 h1:It14KIkyBFYkHkwZ7k45minvA9aorojkyjGk9KJ5B/w= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b h1:7mWr3k41Qtv8XlltBkDkl8LoP3mpSgBW8BUoxtEdbXg= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= 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= @@ -1080,6 +1119,7 @@ golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= +golang.org/x/net v0.0.0-20210326060303-6b1517762897/go.mod h1:uSPa2vr4CLtc/ILN5odXGNXS6mhrKVzTaCXzk9m6W3k= golang.org/x/net v0.0.0-20210331212208-0fccb6fa2b5c h1:KHUzaHIpjWVlVVNh65G3hhuj3KB1HnjY6Cq5cTvRQT8= golang.org/x/net v0.0.0-20210331212208-0fccb6fa2b5c/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1189,8 +1229,9 @@ golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57 h1:F5Gozwx4I1xtr/sr/8CFbb57iKi3297KFs0QDbGN60A= golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210502180810-71e4cd670f79 h1:RX8C8PRZc2hTIod4ds8ij+/4RQX3AqhYj3uOHmyaz4E= +golang.org/x/sys v0.0.0-20210502180810-71e4cd670f79/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -1357,8 +1398,9 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/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= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= @@ -1376,6 +1418,8 @@ gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76 gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/urfave/cli.v1 v1.20.0 h1:NdAVW6RYxDif9DhDHaAortIu956m2c0v+09AZBPTbE0= gopkg.in/urfave/cli.v1 v1.20.0/go.mod h1:vuBzUtMdQeixQj8LVd+/98pzhxNGQoyuPBlsXHOQNO0= +gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= +gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/telemetry/telemetry b/telemetry/telemetry new file mode 100755 index 00000000..130da4f9 Binary files /dev/null and b/telemetry/telemetry differ diff --git a/telemetry/telemetry.go b/telemetry/telemetry.go new file mode 100644 index 00000000..76a8373f --- /dev/null +++ b/telemetry/telemetry.go @@ -0,0 +1,156 @@ +package telemetry + +import ( + "bytes" + "context" + "encoding/json" + "net/http" + "os" + "runtime" + "time" + + "github.com/google/uuid" + "github.com/mitchellh/go-homedir" + "github.com/rs/zerolog/log" + "go.dagger.io/dagger/version" +) + +const ( + apiKey = "cb9777c166aefe4b77b31f961508191c" + telemetryURL = "https://t.dagger.io/v1" +) + +type Property struct { + Name string + Value interface{} +} + +func TrackAsync(ctx context.Context, eventName string, properties ...*Property) chan struct{} { + doneCh := make(chan struct{}, 1) + go func() { + defer close(doneCh) + Track(ctx, eventName, properties...) + }() + return doneCh +} + +func Track(ctx context.Context, eventName string, properties ...*Property) { + lg := log.Ctx(ctx). + With(). + Str("event", eventName). + Logger() + + if telemetryDisabled() || isCI() { + return + } + + deviceID, err := getDeviceID() + if err != nil { + lg.Trace().Err(err).Msg("failed to get device id") + return + } + + // Base properties + props := map[string]interface{}{ + "dagger_version": version.Version, + "dagger_revision": version.Revision, + "os": runtime.GOOS, + "arch": runtime.GOARCH, + } + + // Merge extra properties + for _, p := range properties { + props[p.Name] = p.Value + } + lg = lg.With().Fields(props).Logger() + + ev := &event{ + DeviceID: deviceID, + EventType: eventName, + Time: time.Now().Unix(), + AppVersion: version.Version, + OSName: runtime.GOOS, + Platform: runtime.GOARCH, + IP: "$remote", // Use "$remote" to use the IP address on the upload request + EventProperties: props, + } + + p := &payload{ + APIKey: apiKey, + Events: []*event{ev}, + } + + b := new(bytes.Buffer) + if err := json.NewEncoder(b).Encode(p); err != nil { + lg.Trace().Err(err).Msg("failed to encode payload") + return + } + + req, err := http.NewRequest("POST", telemetryURL, b) + if err != nil { + lg.Trace().Err(err).Msg("failed to prepare request") + } + + req.Header = map[string][]string{ + "Content-Type": {"application/json"}, + "Accept": {"*/*"}, + } + + resp, err := http.DefaultClient.Do(req) + if err != nil { + lg.Trace().Err(err).Msg("failed to send telemetry event") + return + } + resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + lg.Trace().Str("status", resp.Status).Msg("telemetry request failed") + return + } + + lg.Trace().Msg("telemetry event") +} + +type payload struct { + APIKey string `json:"api_key,omitempty"` + Events []*event `json:"events"` +} + +type event struct { + UserID string `json:"user_id,omitempty"` + DeviceID string `json:"device_id,omitempty"` + EventType string `json:"event_type,omitempty"` + Time int64 `json:"time,omitempty"` + AppVersion string `json:"app_version,omitempty"` + Platform string `json:"platform,omitempty"` + OSName string `json:"os_name,omitempty"` + OSVersion string `json:"os_version,omitempty"` + IP string `json:"ip,omitempty"` + EventProperties map[string]interface{} `json:"event_properties,omitempty"` +} + +func isCI() bool { + return os.Getenv("CI") != "" || // GitHub Actions, Travis CI, CircleCI, Cirrus CI, GitLab CI, AppVeyor, CodeShip, dsari + os.Getenv("BUILD_NUMBER") != "" || // Jenkins, TeamCity + os.Getenv("RUN_ID") != "" // TaskCluster, dsari +} + +func telemetryDisabled() bool { + return os.Getenv("DAGGER_TELEMETRY_DISABLE") != "" || // dagger specific env + os.Getenv("DO_NOT_TRACK") != "" // https://consoledonottrack.com/ +} + +func getDeviceID() (string, error) { + idFile, err := homedir.Expand("~/.config/dagger/cli_id") + if err != nil { + return "", err + } + id, err := os.ReadFile(idFile) + if err != nil { + id = []byte(uuid.New().String()) + if err := os.WriteFile(idFile, id, 0600); err != nil { + return "", err + } + } + return string(id), nil +} diff --git a/util/buildkitd/buildkitd.go b/util/buildkitd/buildkitd.go index 8587d0a3..6a111d30 100644 --- a/util/buildkitd/buildkitd.go +++ b/util/buildkitd/buildkitd.go @@ -5,6 +5,7 @@ import ( "errors" "fmt" "os/exec" + "runtime/debug" "strings" "time" @@ -14,14 +15,33 @@ import ( "github.com/rs/zerolog/log" ) +var ( + // vendoredVersion is filled in by init() + vendoredVersion string +) + const ( image = "moby/buildkit" - version = "v0.9.0-rc1" - imageVersion = image + ":" + version containerName = "dagger-buildkitd" volumeName = "dagger-buildkitd" ) +func init() { + bi, ok := debug.ReadBuildInfo() + if !ok { + panic("unable to retrieve build info") + } + for _, d := range bi.Deps { + if d.Path == "github.com/moby/buildkit" { + vendoredVersion = d.Version + break + } + } + if vendoredVersion == "" { + panic("failed to solve vendored buildkit version") + } +} + func Start(ctx context.Context) (string, error) { lg := log.Ctx(ctx) @@ -40,11 +60,11 @@ func Start(ctx context.Context) (string, error) { lg.Debug().Str("version", currentVersion).Msg("detected buildkit version") } - if currentVersion != version { + if currentVersion != vendoredVersion { if currentVersion != "" { lg. Info(). - Str("version", version). + Str("version", vendoredVersion). Msg("upgrading buildkit") if err := remvoveBuildkit(ctx); err != nil { return "", err @@ -52,7 +72,7 @@ func Start(ctx context.Context) (string, error) { } else { lg. Info(). - Str("version", version). + Str("version", vendoredVersion). Msg("starting buildkit") } if err := startBuildkit(ctx); err != nil { @@ -85,14 +105,15 @@ func startBuildkit(ctx context.Context) error { lg := log. Ctx(ctx). With(). - Str("version", version). + Str("version", vendoredVersion). Logger() lg.Debug().Msg("pulling buildkit image") + // #nosec cmd := exec.CommandContext(ctx, "docker", "pull", - imageVersion, + image+":"+vendoredVersion, ) output, err := cmd.CombinedOutput() if err != nil { @@ -108,6 +129,7 @@ func startBuildkit(ctx context.Context) error { // in order for containers to be able to reach localhost. // This is required for things such as kubectl being able to // reach a KinD/minikube cluster locally + // #nosec cmd = exec.CommandContext(ctx, "docker", "run", @@ -117,7 +139,7 @@ func startBuildkit(ctx context.Context) error { "-v", volumeName+":/var/lib/buildkit", "--name", containerName, "--privileged", - imageVersion, + image+":"+vendoredVersion, ) output, err = cmd.CombinedOutput() if err != nil { @@ -145,10 +167,10 @@ func waitBuildkit(ctx context.Context) error { } defer c.Close() - // Try to connect every 100ms up to 50 times (5 seconds total) + // Try to connect every 100ms up to 100 times (10 seconds total) const ( retryPeriod = 100 * time.Millisecond - retryAttempts = 50 + retryAttempts = 100 ) for retry := 0; retry < retryAttempts; retry++ { diff --git a/version/version.go b/version/version.go new file mode 100644 index 00000000..2d135778 --- /dev/null +++ b/version/version.go @@ -0,0 +1,14 @@ +package version + +const ( + DevelopmentVersion = "devel" +) + +var ( + // Version holds the complete version number. Filled in at linking time. + Version = DevelopmentVersion + + // Revision is filled with the VCS (e.g. git) revision being used to build + // the program at linking time. + Revision = "" +)