Last active
December 27, 2022 13:05
-
-
Save onuryartasi/626ddeb2e28790e5da64f59b672c9be3 to your computer and use it in GitHub Desktop.
install_kustomize
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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