forked from ansible/awx-operator
-
Notifications
You must be signed in to change notification settings - Fork 0
/
install_kustomize.sh
executable file
·178 lines (145 loc) · 4.48 KB
/
install_kustomize.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
#!/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
where=$PWD
release_url=https://api.github.com/repos/kubernetes-sigs/kustomize/releases
if [ -n "$1" ]; then
if [[ "$1" =~ ^[0-9]+(\.[0-9]+){2}$ ]]; then
version=v$1
release_url=${release_url}/tags/kustomize%2F$version
elif [ -n "$2" ]; then
echo "The first argument should be the requested version."
exit 1
else
where="$1"
fi
fi
if [ -n "$2" ]; then
where="$2"
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
# You can authenticate by exporting the GITHUB_TOKEN in the environment
if [[ -z "${GITHUB_TOKEN}" ]]; then
releases=$(curl -s "$release_url")
else
releases=$(curl -s "$release_url" --header "Authorization: Bearer ${GITHUB_TOKEN}")
fi
if [[ $releases == *"Bad credentials"* ]]; then
echo "Authentication failed: Invalid GITHUB_TOKEN. Please check or remove your token."
exit 1
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
curl -sLO "$RELEASE_URL"
tar xzf ./kustomize_v*_${opsys}_${arch}.tar.gz
cp ./kustomize "$where"
popd >& /dev/null
"${where}kustomize" version
echo "kustomize installed to ${where}kustomize"