It turns out that that's simply the most useful information about the version
that was built.
For a git tree, it includes information about the closest release, number of
commits since the release, enough of the SHA1 to find the exact commit and
whether the tree was clean or dirty at build time.
For a build from tarball, it will include information of which release was built
and, when using a tarball from a not released commit (e.g. downloading
"master.tar.gz" from GitHub, not recommended!) it will include the -dev prefix
to indicate that was not an official release. (That's as good as we can get with
it.)
If additional information is required, it can be found with -version=raw.
Tested:
- Built from the git tree:
$ _output/go/bin/kubecfg -version
Kubernetes v0.2-29-gd916051e9db865
$ _output/go/bin/kubecfg -version=raw
version.Info{Major:"0", Minor:"2+", GitVersion:"v0.2-29-gd916051e9db865", GitCommit:"d916051e9db8650899acb9415a4e285e3e3a1f87", GitTreeState:"clean"}
- Built it from a dirty git tree:
$ { echo 'package version'; echo 'var X = 1'; } >pkg/version/sillyvar.go
$ make
$ _output/go/bin/kubecfg -version
Kubernetes v0.2-29-gd916051e9db865-dirty
$ _output/go/bin/kubecfg -version=raw
version.Info{Major:"0", Minor:"2+", GitVersion:"v0.2-29-gd916051e9db865-dirty", GitCommit:"d916051e9db8650899acb9415a4e285e3e3a1f87", GitTreeState:"dirty"}
- Tag it v0.3 and build it:
$ git tag -a v0.3 -m 'Release Kubernetes v0.3'
$ make
$ _output/go/bin/kubecfg -version
Kubernetes v0.3
$ _output/go/bin/kubecfg -version=raw
version.Info{Major:"0", Minor:"3", GitVersion:"v0.3", GitCommit:"d916051e9db8650899acb9415a4e285e3e3a1f87", GitTreeState:"clean"}
- Built it from a tarball:
$ wget -O kubernetes.tgz https://api.github.com/repos/filbranden/kubernetes/tarball/version_string1
$ tar xvf kubernetes.tgz
$ cd filbranden-kubernetes-*/
$ make
$ _output/go/bin/kubecfg -version
Kubernetes v0.2-dev
$ _output/go/bin/kubecfg -version=raw
version.Info{Major:"0", Minor:"2+", GitVersion:"v0.2-dev", GitCommit:"", GitTreeState:"not a git tree"}
- Built it with `go get`:
# I need to prefetch the tree to replace the official tree with mine:
$ mkdir -p ${TMPDIR}/gopath/src/github.com/
$ ln -sf filbranden ${TMPDIR}/gopath/src/github.com/GoogleCloudPlatform
# Now run `go get` to build kubecfg:
$ GOPATH=${TMPDIR}/gopath go get github.com/filbranden/kubernetes/cmd/kubecfg
# Check the version:
$ ${TMPDIR}/gopath/bin/kubecfg -version
Kubernetes v0.2-dev
$ ${TMPDIR}/gopath/bin/kubecfg -version=raw
version.Info{Major:"0", Minor:"2+", GitVersion:"v0.2-dev", GitCommit:"", GitTreeState:"not a git tree"}
Signed-off-by: Filipe Brandenburger <filbranden@google.com>
Now it is possible to push these variables through ldflags:
- gitMajor
- gitMinor
- gitVersion (from latest annotated tag, output of git describe)
- gitCommit (renamed commitFromGit, intended to have the full sha1)
- gitTreeState (either "clean" or "dirty")
These are spawned into its separate source file, since they are meant to
be updated separately when a new version is released.
Also use the notation vX.Y+ for when git information is not present.
(This is consistent with the kernel build, e.g. Linux 3.15+ means its
version is >= 3.15 and < 3.16.)
v2: Added comments to the individual fields in pkg/version/base.go
Tested:
- Built it and checked the -version output:
$ hack/build-go.sh
$ output/go/bin/kubelet -version
Kubernetes version 0.1+, build c328679ef8aa
Signed-off-by: Filipe Brandenburger <filbranden@google.com>
because it causes a runtime panic if a binary which has its own implementation
of "-version" flag tries to reuse a package library which indirectly depend on
"pkg/version".
e.g. If such an user-defined binary tires to link "pkg/api" or "pkg/client",
the binary fails with a runtime panic "flag redefined: version".
Tested: Passed -version argument to kubelet (and all other binaries):
$ output/go/bin/kubecfg -version
Kubernetes version 0.1, build 6454a541fd56
Signed-off-by: Filipe Brandenburger <filbranden@google.com>