autoscaler/cluster-autoscaler/hack/update-vendor.sh

230 lines
7.3 KiB
Bash
Executable File

#env /usr/bin/bash
set -o errexit
set -o pipefail
set -o nounset
shopt -s lastpipe
if [[ $(basename $(pwd)) != "cluster-autoscaler" ]];then
echo "The script must be run in cluster-autoscaler directory"
exit 1
fi
if ! which jq > /dev/null; then
echo "This script requires jq command to be available"
exit 1
fi
SCRIPT_NAME=$(basename "$0")
K8S_FORK=${K8S_FORK:-"git@github.com:kubernetes/kubernetes.git"}
K8S_REV="master"
BATCH_MODE="false"
TARGET_MODULE=${TARGET_MODULE:-k8s.io/autoscaler/cluster-autoscaler}
VERIFY_COMMAND=${VERIFY_COMMAND:-"go test -mod=vendor ./..."}
OVERRIDE_GO_VERSION="false"
ARGS="$@"
OPTS=`getopt -o f::r::d::v::b::o:: --long k8sfork::,k8srev::,workdir::,batch::,override-go-version:: -n $SCRIPT_NAME -- "$@"`
if [ $? != 0 ] ; then echo "Failed parsing options." >&2 ; exit 1 ; fi
eval set -- "$OPTS"
while true; do
case "$1" in
-f | --k8sfork ) K8S_FORK="$2"; shift; shift ;;
-r | --k8srev ) K8S_REV="$2"; shift; shift ;;
-d | --workdir ) WORK_DIR="$2"; shift; shift ;;
-b | --batch ) BATCH_MODE="true"; shift; shift ;;
-o | --override-go-version) OVERRIDE_GO_VERSION="true"; shift; shift ;;
-v ) VERBOSE=1; shift; if [[ "$1" == "v" ]]; then VERBOSE=2; shift; fi; ;;
-- ) shift; break ;;
* ) break ;;
esac
done
export GO111MODULE=on
set -o errexit
WORK_DIR="${WORK_DIR:-$(mktemp -d /tmp/ca-update-vendor.XXXX)}"
echo "Operating in ${WORK_DIR}"
if [ ! -d $WORK_DIR ]; then
echo "Work dir ${WORK_DIR} does not exist"
exit 1
fi
LOG_FILE="${LOG_FILE:-${WORK_DIR}/ca-update-vendor.log}"
echo "Sending logs to: ${LOG_FILE}"
if [ -z "${BASH_XTRACEFD:-}" ]; then
exec 19> "${LOG_FILE}"
export BASH_XTRACEFD="19"
fi
set -x
EXPECTED_ERROR_MARKER="${WORK_DIR}/expected_error"
# Try
set +o errexit
(
set -o errexit
rm -f $EXPECTED_ERROR_MARKER
K8S_REPO="${WORK_DIR}/kubernetes"
if [ -d ${K8S_REPO} ]; then
pushd ${K8S_REPO} >/dev/null
if [[ "$(git remote get-url origin)" != "${K8S_FORK}" ]]; then
echo "Mismated checked out k8s repo; deleting"
rm -rf "${K8S_REPO}"
fi
popd >/dev/null
fi
echo "Updating vendor against ${K8S_FORK}:${K8S_REV}"
if [ ! -d ${K8S_REPO} ]; then
echo "Cloning ${K8S_FORK} into ${K8S_REPO}"
git clone --depth 1 ${K8S_FORK} ${K8S_REPO} >&${BASH_XTRACEFD} 2>&1
fi
pushd ${K8S_REPO} >/dev/null
git fetch --depth 1 origin ${K8S_REV} >&${BASH_XTRACEFD} 2>&1
git checkout FETCH_HEAD >&${BASH_XTRACEFD} 2>&1
K8S_REV_PARSED=$(git rev-parse FETCH_HEAD)
popd >/dev/null
function err_rerun() {
touch ${EXPECTED_ERROR_MARKER}
echo "$*"
if [[ "${BATCH_MODE}" == "false" ]]; then
echo "Fix errors and rerun script:"
echo " $0 -d${WORK_DIR} -f${K8S_FORK} -r${K8S_REV}"
fi
exit 1
}
# Deleting old stuff
rm -rf vendor
rm -f go.mod
rm -f go.sum
# Base CA go.mod on one from k8s.io/kuberntes
cp $K8S_REPO/go.mod .
# Check go version
REQUIRED_GO_VERSION=$(cat go.mod |grep '^go ' |tr -s ' ' |cut -d ' ' -f 2)
USED_GO_VERSION=$(go version |sed 's/.*go\([0-9]\+\.[0-9]\+\).*/\1/')
if [[ "${REQUIRED_GO_VERSION}" != "${USED_GO_VERSION}" ]];then
if [[ "${OVERRIDE_GO_VERSION}" == "false" ]]; then
err_rerun "Invalid go version ${USED_GO_VERSION}; required go version is ${REQUIRED_GO_VERSION}."
else
echo "Overriding go version found in go.mod file. Expected go version ${REQUIRED_GO_VERSION}, using ${USED_GO_VERSION}"
fi
fi
# Fix module name and staging modules links
sed -i "s#module k8s.io/kubernetes#module ${TARGET_MODULE}#" go.mod
sed -i "s#\\./staging#${K8S_REPO}/staging#" go.mod
function list_dependencies() {
local_tmp_dir=$(mktemp -d "${WORK_DIR}/list_dependencies.XXXX")
local go_dep_file="$1"
local tmp_file="${local_tmp_dir}/list_dependencies.tmp"
rm -f ${tmp_file}
go mod edit -json ${go_dep_file} |jq -r '.Replace[]? | select(.New.Version != null)| "\(.Old.Path) \(.New.Version)"' >> ${tmp_file}
go mod edit -json ${go_dep_file} |jq -r '.Require[]? | "\(.Path) \(.Version)"' >> ${tmp_file}
cat ${tmp_file} |sort |uniq
}
function version_gt() {
test "$(printf '%s\n' "$@" | sort -V | head -n 1)" != "$1";
}
GO_MOD_EXTRA_FILES="$(shopt -s nullglob;echo go.mod-extra*)"
OLD_EXTRA_FOUND="false"
for go_mod_extra in ${GO_MOD_EXTRA_FILES}; do
list_dependencies ${go_mod_extra} | while read extra_path extra_version; do
list_dependencies go.mod | while read source_path source_version; do
if [[ "${source_path}" == "${extra_path}" ]]; then
if ! version_gt $extra_version $source_version; then
echo "Extra dependency ${source_path} already used by k8s in >= version ${source_version}"
OLD_EXTRA_FOUND="true"
fi
fi
done
done
done
if [[ "${OLD_EXTRA_FOUND}" == "true" ]]; then
err_rerun "Extra dependencies found in one of go.mod-extra files"
fi
# Add dependencies from go.mod-extra to go.mod
# Propagate require entries to both require and replace
for go_mod_extra in ${GO_MOD_EXTRA_FILES}; do
go mod edit -json ${go_mod_extra} | jq -r '.Require[]? | "-require \(.Path)@\(.Version)"' | xargs -t -r go mod edit >&${BASH_XTRACEFD} 2>&1
go mod edit -json ${go_mod_extra} | jq -r '.Require[]? | "-replace \(.Path)=\(.Path)@\(.Version)"' | xargs -t -r go mod edit >&${BASH_XTRACEFD} 2>&1
# And add explicit replace entries
go mod edit -json ${go_mod_extra} | jq -r '.Replace[]? | "-replace \(.Old.Path)=\(.New.Path)@\(.New.Version)"' | sed "s/@null//g" |xargs -t -r go mod edit >&${BASH_XTRACEFD} 2>&1
done
# Add k8s.io/kubernetes dependency
go mod edit -require k8s.io/kubernetes@v0.0.0
go mod edit -replace k8s.io/kubernetes=${K8S_REPO}
# Fail if there are implicit dependencies
list_dependencies go.mod > ${WORK_DIR}/packages-before-tidy
go mod tidy -v >&${BASH_XTRACEFD} 2>&1
list_dependencies go.mod > ${WORK_DIR}/packages-after-tidy
IMPLICIT_FOUND="false"
set +o pipefail
diff -u ${WORK_DIR}/packages-before-tidy ${WORK_DIR}/packages-after-tidy | grep -v '\+\+\+ ' | grep '^\+' | cut -b 2- |while read line; do
IMPLICIT_FOUND="true"
echo "Implicit dependency found: ${line}"
done
set -o pipefail
if [[ "${IMPLICIT_FOUND}" == "true" ]]; then
err_rerun "Implicit dependencies missing from go.mod-extra"
fi
echo "Running go mod vendor"
go mod vendor
echo "Running ${VERIFY_COMMAND}"
if ! ${VERIFY_COMMAND} >&${BASH_XTRACEFD} 2>&1; then
err_rerun "Verify command failed"
fi
# Commit go.mod* and vendor
git reset . >&${BASH_XTRACEFD} 2>&1
git add vendor go.mod go.sum >&${BASH_XTRACEFD} 2>&1
if ! git diff --quiet --cached; then
echo "Commiting vendor, go.mod and go.sum"
git commit -m "Updating vendor against ${K8S_FORK}:${K8S_REV} (${K8S_REV_PARSED})" >&${BASH_XTRACEFD} 2>&1
else
echo "No changes after vendor update; skipping commit"
fi
if ! git diff --quiet; then
echo "Uncommited changes (manual fixes?) still present in repository - please commit those"
fi
echo "Operation finished successfully"
if [[ "$(basename "${WORK_DIR}" | cut -d '.' -f 1)" == "ca-update-vendor" ]];then
echo "Deleting working directory ${WORK_DIR}"
rm -rf ${WORK_DIR}
else
echo "Preserving working directory ${WORK_DIR}"
fi
)
# Catch
err=$?
if [[ $err -ne 0 ]]; then
if [ ! -f "${EXPECTED_ERROR_MARKER}" ]; then
echo
echo "Unexpected error occured; check $LOG_FILE"
fi
fi
exit $err