|
| 1 | +#!/bin/bash |
| 2 | +# Copyright 2020 The Kubernetes Authors. |
| 3 | +# |
| 4 | +# Licensed under the Apache License, Version 2.0 (the "License"); |
| 5 | +# you may not use this file except in compliance with the License. |
| 6 | +# You may obtain a copy of the License at |
| 7 | +# |
| 8 | +# http://www.apache.org/licenses/LICENSE-2.0 |
| 9 | +# |
| 10 | +# Unless required by applicable law or agreed to in writing, software |
| 11 | +# distributed under the License is distributed on an "AS IS" BASIS, |
| 12 | +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 13 | +# See the License for the specific language governing permissions and |
| 14 | +# limitations under the License. |
| 15 | + |
| 16 | +set -o errexit |
| 17 | +set -o nounset |
| 18 | +set -o pipefail |
| 19 | + |
| 20 | +version::get_version_vars() { |
| 21 | + GIT_COMMIT="$(git rev-parse HEAD^{commit})" |
| 22 | + |
| 23 | + if git_status=$(git status --porcelain 2>/dev/null) && [[ -z ${git_status} ]]; then |
| 24 | + GIT_TREE_STATE="clean" |
| 25 | + else |
| 26 | + GIT_TREE_STATE="dirty" |
| 27 | + fi |
| 28 | + |
| 29 | + # stolen from k8s.io/hack/lib/version.sh |
| 30 | + # Use git describe to find the version based on tags. |
| 31 | + if GIT_VERSION=$(git describe --tags --abbrev=14 2>/dev/null); then |
| 32 | + # This translates the "git describe" to an actual semver.org |
| 33 | + # compatible semantic version that looks something like this: |
| 34 | + # v1.1.0-alpha.0.6+84c76d1142ea4d |
| 35 | + # |
| 36 | + # TODO: We continue calling this "git version" because so many |
| 37 | + # downstream consumers are expecting it there. |
| 38 | + DASHES_IN_VERSION=$(echo "${GIT_VERSION}" | sed "s/[^-]//g") |
| 39 | + if [[ "${DASHES_IN_VERSION}" == "---" ]] ; then |
| 40 | + # We have distance to subversion (v1.1.0-subversion-1-gCommitHash) |
| 41 | + GIT_VERSION=$(echo "${GIT_VERSION}" | sed "s/-\([0-9]\{1,\}\)-g\([0-9a-f]\{14\}\)$/.\1\-\2/") |
| 42 | + elif [[ "${DASHES_IN_VERSION}" == "--" ]] ; then |
| 43 | + # We have distance to base tag (v1.1.0-1-gCommitHash) |
| 44 | + GIT_VERSION=$(echo "${GIT_VERSION}" | sed "s/-g\([0-9a-f]\{14\}\)$/-\1/") |
| 45 | + fi |
| 46 | + if [[ "${GIT_TREE_STATE}" == "dirty" ]]; then |
| 47 | + # git describe --dirty only considers changes to existing files, but |
| 48 | + # that is problematic since new untracked .go files affect the build, |
| 49 | + # so use our idea of "dirty" from git status instead. |
| 50 | + GIT_VERSION+="-dirty" |
| 51 | + fi |
| 52 | + |
| 53 | + |
| 54 | + # Try to match the "git describe" output to a regex to try to extract |
| 55 | + # the "major" and "minor" versions and whether this is the exact tagged |
| 56 | + # version or whether the tree is between two tagged versions. |
| 57 | + if [[ "${GIT_VERSION}" =~ ^v([0-9]+)\.([0-9]+)(\.[0-9]+)?([-].*)?([+].*)?$ ]]; then |
| 58 | + GIT_MAJOR=${BASH_REMATCH[1]} |
| 59 | + GIT_MINOR=${BASH_REMATCH[2]} |
| 60 | + fi |
| 61 | + |
| 62 | + # If GIT_VERSION is not a valid Semantic Version, then refuse to build. |
| 63 | + if ! [[ "${GIT_VERSION}" =~ ^v([0-9]+)\.([0-9]+)(\.[0-9]+)?(-[0-9A-Za-z.-]+)?(\+[0-9A-Za-z.-]+)?$ ]]; then |
| 64 | + echo "GIT_VERSION should be a valid Semantic Version. Current value: ${GIT_VERSION}" |
| 65 | + echo "Please see more details here: https://semver.org" |
| 66 | + exit 1 |
| 67 | + fi |
| 68 | + fi |
| 69 | + |
| 70 | + GIT_RELEASE_TAG=$(git describe --abbrev=0 --tags) |
| 71 | + GIT_RELEASE_COMMIT=$(git rev-list -n 1 ${GIT_RELEASE_TAG}) |
| 72 | +} |
| 73 | + |
| 74 | +# stolen from k8s.io/hack/lib/version.sh and modified |
| 75 | +# Prints the value that needs to be passed to the -ldflags parameter of go build |
| 76 | +version::ldflags() { |
| 77 | + version::get_version_vars |
| 78 | + |
| 79 | + local -a ldflags |
| 80 | + function add_ldflag() { |
| 81 | + local key=${1} |
| 82 | + local val=${2} |
| 83 | + ldflags+=( |
| 84 | + "-X 'sigs.k8s.io/cluster-api/cmd/version.${key}=${val}'" |
| 85 | + ) |
| 86 | + } |
| 87 | + |
| 88 | + add_ldflag "buildDate" "$(date ${SOURCE_DATE_EPOCH:+"--date=@${SOURCE_DATE_EPOCH}"} -u +'%Y-%m-%dT%H:%M:%SZ')" |
| 89 | + add_ldflag "gitCommit" "${GIT_COMMIT}" |
| 90 | + add_ldflag "gitTreeState" "${GIT_TREE_STATE}" |
| 91 | + add_ldflag "gitMajor" "${GIT_MAJOR}" |
| 92 | + add_ldflag "gitMinor" "${GIT_MINOR}" |
| 93 | + add_ldflag "gitVersion" "${GIT_VERSION}" |
| 94 | + add_ldflag "gitReleaseCommit" "${GIT_RELEASE_COMMIT}" |
| 95 | + |
| 96 | + # The -ldflags parameter takes a single string, so join the output. |
| 97 | + echo "${ldflags[*]-}" |
| 98 | +} |
| 99 | + |
| 100 | +version::ldflags |
0 commit comments