Skip to content

Instantly share code, notes, and snippets.

@onuryartasi
Last active December 27, 2022 13:05
Show Gist options
  • Save onuryartasi/626ddeb2e28790e5da64f59b672c9be3 to your computer and use it in GitHub Desktop.
Save onuryartasi/626ddeb2e28790e5da64f59b672c9be3 to your computer and use it in GitHub Desktop.
install_kustomize
#!/usr/bin/env bash
# Copyright 2022 The Kubernetes Authors.
# SPDX-License-Identifier: Apache-2.0
# If no argument is given -> Downloads the most recently released
# kustomize binary to your current working directory.
# (e.g. 'install_kustomize.sh')
#
# If one argument is given ->
# If that argument is in the format of #.#.#, downloads the specified
# version of the kustomize binary to your current working directory.
# If that argument is something else, downloads the most recently released
# kustomize binary to the specified directory.
# (e.g. 'install_kustomize.sh 3.8.2' or 'install_kustomize.sh $(go env GOPATH)/bin')
#
# If two arguments are given -> Downloads the specified version of the
# kustomize binary to the specified directory.
# (e.g. 'install_kustomize.sh 3.8.2 $(go env GOPATH)/bin')
#
# Fails if the file already exists.
set -e
# Unset CDPATH to restore default cd behavior. An exported CDPATH can
# cause cd to output the current directory to STDOUT.
unset CDPATH
while getopts v:p:t: flag
do
case "${flag}" in
v) version=${OPTARG};;
p) path=${OPTARG};;
t) token=${OPTARG};;
esac
done
where=$PWD
release_url=https://api.github.com/repos/kubernetes-sigs/kustomize/releases
if [ -n "$version" ]; then
echo "testttt"
if [[ "$version" =~ ^[0-9]+(\.[0-9]+){2}$ ]]; then
versionv=v$version
release_url=${release_url}/tags/kustomize%2F$versionv
elif [ -n "$path" ]; then
echo "The first argument should be the requested version."
exit 1
else
where="$version"
fi
fi
if [ -n "$path" ]; then
where="$path"
fi
if ! test -d "$where"; then
echo "$where does not exist. Create it first."
exit 1
fi
# Emulates `readlink -f` behavior, as this is not available by default on MacOS
# See: https://stackoverflow.com/questions/1055671/how-can-i-get-the-behavior-of-gnus-readlink-f-on-a-mac
function readlink_f {
TARGET_FILE=$1
cd "$(dirname "$TARGET_FILE")"
TARGET_FILE=$(basename "$TARGET_FILE")
# Iterate down a (possible) chain of symlinks
while [ -L "$TARGET_FILE" ]
do
TARGET_FILE=$(readlink "$TARGET_FILE")
cd "$(dirname "$TARGET_FILE")"
TARGET_FILE=$(readlink "$TARGET_FILE")
done
# Compute the canonicalized name by finding the physical path
# for the directory we're in and appending the target file.
PHYS_DIR=$(pwd -P)
RESULT=$PHYS_DIR/$TARGET_FILE
echo "$RESULT"
}
function find_release_url() {
local releases=$1
local opsys=$2
local arch=$3
echo "${releases}" |\
grep "browser_download.*${opsys}_${arch}" |\
cut -d '"' -f 4 |\
sort -V | tail -n 1
}
where="$(readlink_f "$where")/"
if [ -f "${where}kustomize" ]; then
echo "${where}kustomize exists. Remove it first."
exit 1
elif [ -d "${where}kustomize" ]; then
echo "${where}kustomize exists and is a directory. Remove it first."
exit 1
fi
tmpDir=$(mktemp -d)
if [[ ! "$tmpDir" || ! -d "$tmpDir" ]]; then
echo "Could not create temp dir."
exit 1
fi
function cleanup {
rm -rf "$tmpDir"
}
trap cleanup EXIT ERR
pushd "$tmpDir" >& /dev/null
opsys=windows
if [[ "$OSTYPE" == linux* ]]; then
opsys=linux
elif [[ "$OSTYPE" == darwin* ]]; then
opsys=darwin
fi
# Supported values of 'arch': amd64, arm64, ppc64le, s390x
case $(uname -m) in
x86_64)
arch=amd64
;;
arm64|aarch64)
arch=arm64
;;
ppc64le)
arch=ppc64le
;;
s390x)
arch=s390x
;;
*)
arch=amd64
;;
esac
if [ -n "$token" ]; then
echo "token found"
releases=$(curl -H "Authorization: token ${token}" -s "$release_url")
else
releases=$(curl -s "$release_url")
fi
if [[ $releases == *"API rate limit exceeded"* ]]; then
echo "Github rate-limiter failed the request. Either authenticate or wait a couple of minutes."
exit 1
fi
RELEASE_URL="$(find_release_url "$releases" "$opsys" "$arch")"
if [[ "$arch" == "arm64" ]] && [[ -z "$RELEASE_URL" ]] ; then
# fallback to the old behavior of downloading amd64 binaries on aarch64 systems.
# People might have qemu-binfmt-misc installed, so it worked for them previously.
echo "Version $version does not exist for ${opsys}/arm64, trying ${opsys}/amd64 instead."
arch=amd64
RELEASE_URL="$(find_release_url "$releases" "$opsys" "amd64")"
fi
if [[ -z "$RELEASE_URL" ]]; then
echo "Version $version does not exist or is not available for ${opsys}/${arch}."
exit 1
fi
if [ -n "$token" ]; then
curl -H "Authorization: token ${token}" -sLO "$RELEASE_URL"
else
curl -sLO "$RELEASE_URL"
fi
tar xzf ./kustomize_v*_${opsys}_${arch}.tar.gz
cp ./kustomize "$where"
popd >& /dev/null
"${where}kustomize" version
echo "kustomize installed to ${where}kustomize"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment