From d0abfe0b92f865ee991a3124d40c15aea31eff3b Mon Sep 17 00:00:00 2001 From: Stephen J Day Date: Thu, 29 Jan 2015 15:32:49 -0800 Subject: [PATCH] Report version in registry binary We've added support to the registry command to report the current version of the distribution package. The version package is generated with a shell script that gets the latest tag and add "+unknown". This allows builds from "go get" and "go install" to have a rough version number. Generated periodically, it will provide a decent indication of what code built the binary. For more accurate versioning, one can build with the "binaries" make target. Linker flags are used to replace the version string with the actual current tag at build time. Signed-off-by: Stephen J Day --- .gitignore | 3 +++ Makefile | 23 +++++++++++++++++------ cmd/registry/main.go | 17 +++++++++++++++++ version/version.go | 11 +++++++++++ version/version.sh | 22 ++++++++++++++++++++++ 5 files changed, 70 insertions(+), 6 deletions(-) create mode 100644 version/version.go create mode 100755 version/version.sh diff --git a/.gitignore b/.gitignore index daf913b1b..306a8fba0 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,6 @@ _testmain.go *.exe *.test *.prof + +# never checkin from the bin file (for now) +bin/* diff --git a/Makefile b/Makefile index d853dacab..e3477e83f 100644 --- a/Makefile +++ b/Makefile @@ -1,15 +1,26 @@ -# This project makefile is around for generating peices of documentation and -# code. For most purposes, running it is not necessary. +# Set an output prefix, which is the local directory if not specified +PREFIX?=$(shell pwd) -.PHONY: clean +# Used to populate version variable in main package. +GO_LDFLAGS=-ldflags "-X `go list ./version`.Version `git describe --match 'v[0-9]*' --dirty='.m' --always`" + +.PHONY: clean binaries .DEFAULT: default default: - @echo Please read the make targets before using this Makefile. It is \ - currently only used for documentation and autogenerated files. + @echo Please read the make targets before using this Makefile. AUTHORS: .mailmap .git/ORIG_HEAD .git/FETCH_HEAD .git/HEAD git log --format='%aN <%aE>' | sort -fu >> $@ +# This only needs to be generated by hand when cutting full releases. +version/version.go: + ./version/version.sh > $@ + +${PREFIX}/bin/registry: version/version.go $(shell find . -type f -name '*.go') + go build -o $@ ${GO_LDFLAGS} ./cmd/registry + +binaries: ${PREFIX}/bin/registry + clean: - rm -rf AUTHORS \ No newline at end of file + rm -rf ${PREFIX}/bin/registry diff --git a/cmd/registry/main.go b/cmd/registry/main.go index 436b8f77b..c19a122fa 100644 --- a/cmd/registry/main.go +++ b/cmd/registry/main.go @@ -3,6 +3,7 @@ package main import ( "flag" "fmt" + "io" "net/http" _ "net/http/pprof" "os" @@ -19,12 +20,24 @@ import ( _ "github.com/docker/distribution/storagedriver/filesystem" _ "github.com/docker/distribution/storagedriver/inmemory" _ "github.com/docker/distribution/storagedriver/s3" + "github.com/docker/distribution/version" ) +var showVersion bool + +func init() { + flag.BoolVar(&showVersion, "version", false, "show the version and exit") +} + func main() { flag.Usage = usage flag.Parse() + if showVersion { + printVersion(os.Stdout) + return + } + config, err := resolveConfiguration() if err != nil { fatalf("configuration error: %v", err) @@ -46,6 +59,10 @@ func usage() { flag.PrintDefaults() } +func printVersion(w io.Writer) { + fmt.Fprintln(w, os.Args[0], version.Package, version.Version) +} + func fatalf(format string, args ...interface{}) { fmt.Fprintf(os.Stderr, format+"\n", args...) usage() diff --git a/version/version.go b/version/version.go new file mode 100644 index 000000000..2e96cd68f --- /dev/null +++ b/version/version.go @@ -0,0 +1,11 @@ +package version + +// Package is the overall, canonical project import path under which the +// package was built. +var Package = "github.com/docker/distribution" + +// Version indicates which version of the binary is running. This is set to +// the latest release tag by hand, always suffixed by "+unknown". During +// build, it will be replaced by the actual version. The value here will be +// used if the registry is run after a go get based install. +var Version = "v2.0.0-alpha.1+unknown" diff --git a/version/version.sh b/version/version.sh new file mode 100755 index 000000000..53e29ce9b --- /dev/null +++ b/version/version.sh @@ -0,0 +1,22 @@ +#!/bin/sh + +# This bash script outputs the current, desired content of version.go, using +# git describe. For best effect, pipe this to the target file. Generally, this +# only needs to updated for releases. The actual value of will be replaced +# during build time if the makefile is used. + +set -e + +cat <