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 <stephen.day@docker.com>
This commit is contained in:
Stephen J Day 2015-01-29 15:32:49 -08:00
parent c4406baf8a
commit d0abfe0b92
5 changed files with 70 additions and 6 deletions

3
.gitignore vendored
View file

@ -22,3 +22,6 @@ _testmain.go
*.exe *.exe
*.test *.test
*.prof *.prof
# never checkin from the bin file (for now)
bin/*

View file

@ -1,15 +1,26 @@
# This project makefile is around for generating peices of documentation and # Set an output prefix, which is the local directory if not specified
# code. For most purposes, running it is not necessary. 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: default
default: default:
@echo Please read the make targets before using this Makefile. It is \ @echo Please read the make targets before using this Makefile.
currently only used for documentation and autogenerated files.
AUTHORS: .mailmap .git/ORIG_HEAD .git/FETCH_HEAD .git/HEAD AUTHORS: .mailmap .git/ORIG_HEAD .git/FETCH_HEAD .git/HEAD
git log --format='%aN <%aE>' | sort -fu >> $@ 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: clean:
rm -rf AUTHORS rm -rf ${PREFIX}/bin/registry

View file

@ -3,6 +3,7 @@ package main
import ( import (
"flag" "flag"
"fmt" "fmt"
"io"
"net/http" "net/http"
_ "net/http/pprof" _ "net/http/pprof"
"os" "os"
@ -19,12 +20,24 @@ import (
_ "github.com/docker/distribution/storagedriver/filesystem" _ "github.com/docker/distribution/storagedriver/filesystem"
_ "github.com/docker/distribution/storagedriver/inmemory" _ "github.com/docker/distribution/storagedriver/inmemory"
_ "github.com/docker/distribution/storagedriver/s3" _ "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() { func main() {
flag.Usage = usage flag.Usage = usage
flag.Parse() flag.Parse()
if showVersion {
printVersion(os.Stdout)
return
}
config, err := resolveConfiguration() config, err := resolveConfiguration()
if err != nil { if err != nil {
fatalf("configuration error: %v", err) fatalf("configuration error: %v", err)
@ -46,6 +59,10 @@ func usage() {
flag.PrintDefaults() flag.PrintDefaults()
} }
func printVersion(w io.Writer) {
fmt.Fprintln(w, os.Args[0], version.Package, version.Version)
}
func fatalf(format string, args ...interface{}) { func fatalf(format string, args ...interface{}) {
fmt.Fprintf(os.Stderr, format+"\n", args...) fmt.Fprintf(os.Stderr, format+"\n", args...)
usage() usage()

11
version/version.go Normal file
View file

@ -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"

22
version/version.sh Executable file
View file

@ -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 <<EOF
package version
// Package is the overall, canonical project import path under which the
// package was built.
var Package = "$(go list)"
// 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 = "$(git describe --match 'v[0-9]*' --dirty='.m' --always)+unknown"
EOF