diff --git a/src/cmd/linuxkit/pkg_push.go b/src/cmd/linuxkit/pkg_push.go index 2dbcc17e5..2e2cc4199 100644 --- a/src/cmd/linuxkit/pkg_push.go +++ b/src/cmd/linuxkit/pkg_push.go @@ -20,6 +20,7 @@ func pkgPush(args []string) { } force := flags.Bool("force", false, "Force rebuild") + release := flags.String("release", "", "Release the given version") p, err := pkglib.NewFromCLI(flags, args...) if err != nil { @@ -32,7 +33,9 @@ func pkgPush(args []string) { if *force { opts = append(opts, pkglib.WithBuildForce()) } - + if *release != "" { + opts = append(opts, pkglib.WithRelease(*release)) + } if err := p.Build(opts...); err != nil { fmt.Fprintf(os.Stderr, "%v\n", err) os.Exit(1) diff --git a/src/cmd/linuxkit/pkglib/build.go b/src/cmd/linuxkit/pkglib/build.go index 4bf8fa991..c570b4863 100644 --- a/src/cmd/linuxkit/pkglib/build.go +++ b/src/cmd/linuxkit/pkglib/build.go @@ -7,8 +7,9 @@ import ( ) type buildOpts struct { - force bool - push bool + force bool + push bool + release string } // BuildOpt allows callers to specify options to Build @@ -30,6 +31,14 @@ func WithBuildPush() BuildOpt { } } +// WithRelease releases as the given version after push +func WithRelease(r string) BuildOpt { + return func(bo *buildOpts) error { + bo.release = r + return nil + } +} + // Build builds the package func (p Pkg) Build(bos ...BuildOpt) error { var bo buildOpts @@ -61,9 +70,16 @@ func (p Pkg) Build(bos ...BuildOpt) error { return fmt.Errorf("Unknown arch %q", arch) } - release, err := gitCommitTag("HEAD") - if err != nil { - return err + if bo.release == "" { + r, err := gitCommitTag("HEAD") + if err != nil { + return err + } + bo.release = r + } + + if bo.release != "" && !bo.push { + return fmt.Errorf("Cannot release %q if not pushing", bo.release) } d := newDockerRunner(p.trust, p.cache) @@ -119,12 +135,12 @@ func (p Pkg) Build(bos ...BuildOpt) error { return err } - if release == "" { + if bo.release == "" { fmt.Printf("Build and push complete, not releasing, all done.\n") return nil } - relTag, err := p.ReleaseTag(release) + relTag, err := p.ReleaseTag(bo.release) if err != nil { return err } @@ -137,7 +153,7 @@ func (p Pkg) Build(bos ...BuildOpt) error { return err } - fmt.Printf("Build, push and release complete, all done.\n") + fmt.Printf("Build, push and release of %q complete, all done.\n", bo.release) return nil }