loading...
Cover image for Forcing a kubernetes version during build

Forcing a kubernetes version during build

chuck_ha profile image Chuck Ha ・2 min read
Date: November, 19th, 2018
Kubernetes: https://github.com/kubernetes/kubernetes/commit/8848740f6d0f84c2c4c5165736e12425551a6207
The current release is just before v1.13.0 so the newest tag is v1.14.0-alpha.

When a Kubernetes binary is built with bazel it will set a default version on the binary for you. That is, when you run kubectl version the version is populated automatically.

However, sometimes you want a custom version, probably for testing purposes. For example, if you are testing kubeadm's upgrade feature it helps to force a version to avoid some annoying behavior.

Bazel calculates this version through a script that is defined by a flag called --workspace_status_command. That argument is specified in the .bazelrc file.

print-workspace-status.sh calls a bash function and prints some version information in a very specific format that bazel uses.

If you want to customize this, you have two options.

Option 1 You can define a custom --workspace_status_command script that generates these versions with whatever versions you want

Create this file as workspace-status.sh and make it executable chmod +x workspace-status.sh.

#!/usr/bin/env bash

cat <<EOF
gitCommit $(git rev-parse "HEAD^{commit}")
gitTreeState clean
gitVersion v2.0.0
gitMajor 2
gitMinor 0
buildDate $(date \
  ${SOURCE_DATE_EPOCH:+"--date=@${SOURCE_DATE_EPOCH}"} \
 -u +'%Y-%m-%dT%H:%M:%SZ')
EOF

Now run bazel build --workspace_status_command=./workspace-status.sh //cmd/kubeadm and you can see it works when you run kubeadm version and get this output:

kubeadm version
kubeadm version: &version.Info{Major:"2", Minor:"0", GitVersion:"v2.0.0", GitCommit:"679d4397cfdb386ebd3ae4bcb9972273b3f75ca3", GitTreeState:"clean", BuildDate:"2018-11-19T20:43:30Z", GoVersion:"go1.11.2", Compiler:"gc", Platform:"darwin/amd64"}

Option 2

You can define an environment variable, KUBE_GIT_VERSION_FILE, that defines a file in which the versions are already specified.

Create a file called version.txt and put the following contents in it:

KUBE_GIT_COMMIT=abcd
KUBE_GIT_TREE_STATE="clean"
KUBE_GIT_VERSION="v2.0.3"
KUBE_GIT_MAJOR=2
KUBE_GIT_MINOR=0

Now get that file as an environment variable with export KUBE_GIT_VERSION_FILE=version.txt and run bazel build //cmd/kubeadm.

Then when you run kubeadm version you will see:

$ kubeadm version
kubeadm version: &version.Info{Major:"2", Minor:"0", GitVersion:"v2.0.3", GitCommit:"abcd", GitTreeState:"clean", BuildDate:"2018-11-19T20:58:25Z", GoVersion:"go1.11.2", Compiler:"gc", Platform:"darwin/amd64"}

Posted on by:

chuck_ha profile

Chuck Ha

@chuck_ha

This is just the dev side of my life. I try to get out and see the sun at least occasionally. Instagram is where I document that kind of stuff.

Discussion

pic
Editor guide