| #!/usr/bin/env bash |
| |
| # Copyright 2016 The Kubernetes Authors All rights reserved. |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| # The install script is based off of the MIT-licensed script from glide, |
| # the package manager for Go: https://github.com/Masterminds/glide.sh/blob/master/get |
| |
| PROJECT_NAME="helm" |
| |
| : ${HELM_INSTALL_DIR:="/usr/local/bin"} |
| |
| # initArch discovers the architecture for this system. |
| initArch() { |
| ARCH=$(uname -m) |
| case $ARCH in |
| armv5*) ARCH="armv5";; |
| armv6*) ARCH="armv6";; |
| armv7*) ARCH="armv7";; |
| aarch64) ARCH="arm64";; |
| x86) ARCH="386";; |
| x86_64) ARCH="amd64";; |
| i686) ARCH="386";; |
| i386) ARCH="386";; |
| esac |
| } |
| |
| # initOS discovers the operating system for this system. |
| initOS() { |
| OS=$(echo `uname`|tr '[:upper:]' '[:lower:]') |
| |
| case "$OS" in |
| # Minimalist GNU for Windows |
| mingw*) OS='windows';; |
| esac |
| } |
| |
| # runs the given command as root (detects if we are root already) |
| runAsRoot() { |
| local CMD="$*" |
| |
| if [ $EUID -ne 0 ]; then |
| CMD="sudo $CMD" |
| fi |
| |
| $CMD |
| } |
| |
| # verifySupported checks that the os/arch combination is supported for |
| # binary builds. |
| verifySupported() { |
| local supported="darwin-386\ndarwin-amd64\nlinux-386\nlinux-amd64\nlinux-arm\nlinux-arm64\nlinux-ppc64le\nwindows-386\nwindows-amd64" |
| if ! echo "${supported}" | grep -q "${OS}-${ARCH}"; then |
| echo "No prebuilt binary for ${OS}-${ARCH}." |
| echo "To build from source, go to https://github.com/kubernetes/helm" |
| exit 1 |
| fi |
| |
| if ! type "curl" > /dev/null && ! type "wget" > /dev/null; then |
| echo "Either curl or wget is required" |
| exit 1 |
| fi |
| } |
| |
| # checkDesiredVersion checks if the desired version is available. |
| checkDesiredVersion() { |
| # Use the GitHub releases webpage for the project to find the desired version for this project. |
| local release_url="https://github.com/kubernetes/helm/releases/${DESIRED_VERSION:-latest}" |
| if type "curl" > /dev/null; then |
| TAG=$(curl -SsL $release_url | awk '/\/tag\//' | cut -d '"' -f 2 | awk '{n=split($NF,a,"/");print a[n]}' | awk 'a !~ $0{print}; {a=$0}') |
| elif type "wget" > /dev/null; then |
| TAG=$(wget -q -O - $release_url | awk '/\/tag\//' | cut -d '"' -f 2 | awk '{n=split($NF,a,"/");print a[n]}' | awk 'a !~ $0{print}; {a=$0}') |
| fi |
| if [ "x$TAG" == "x" ]; then |
| echo "Cannot determine ${DESIRED_VERSION} tag." |
| exit 1 |
| fi |
| } |
| |
| # checkHelmInstalledVersion checks which version of helm is installed and |
| # if it needs to be changed. |
| checkHelmInstalledVersion() { |
| if [[ -f "${HELM_INSTALL_DIR}/${PROJECT_NAME}" ]]; then |
| local version=$(helm version | grep '^Client' | cut -d'"' -f2) |
| if [[ "$version" == "$TAG" ]]; then |
| echo "Helm ${version} is already ${DESIRED_VERSION:-latest}" |
| return 0 |
| else |
| echo "Helm ${TAG} is available. Changing from version ${version}." |
| return 1 |
| fi |
| else |
| return 1 |
| fi |
| } |
| |
| # downloadFile downloads the latest binary package and also the checksum |
| # for that binary. |
| downloadFile() { |
| HELM_DIST="helm-$TAG-$OS-$ARCH.tar.gz" |
| DOWNLOAD_URL="https://kubernetes-helm.storage.googleapis.com/$HELM_DIST" |
| CHECKSUM_URL="$DOWNLOAD_URL.sha256" |
| HELM_TMP_ROOT="$(mktemp -dt helm-installer-XXXXXX)" |
| HELM_TMP_FILE="$HELM_TMP_ROOT/$HELM_DIST" |
| HELM_SUM_FILE="$HELM_TMP_ROOT/$HELM_DIST.sha256" |
| echo "Downloading $DOWNLOAD_URL" |
| if type "curl" > /dev/null; then |
| curl -SsL "$CHECKSUM_URL" -o "$HELM_SUM_FILE" |
| elif type "wget" > /dev/null; then |
| wget -q -O "$HELM_SUM_FILE" "$CHECKSUM_URL" |
| fi |
| if type "curl" > /dev/null; then |
| curl -SsL "$DOWNLOAD_URL" -o "$HELM_TMP_FILE" |
| elif type "wget" > /dev/null; then |
| wget -q -O "$HELM_TMP_FILE" "$DOWNLOAD_URL" |
| fi |
| } |
| |
| # installFile verifies the SHA256 for the file, then unpacks and |
| # installs it. |
| installFile() { |
| HELM_TMP="$HELM_TMP_ROOT/$PROJECT_NAME" |
| local sum=$(openssl sha1 -sha256 ${HELM_TMP_FILE} | awk '{print $2}') |
| local expected_sum=$(cat ${HELM_SUM_FILE}) |
| if [ "$sum" != "$expected_sum" ]; then |
| echo "SHA sum of $HELM_TMP does not match. Aborting." |
| exit 1 |
| fi |
| |
| mkdir -p "$HELM_TMP" |
| tar xf "$HELM_TMP_FILE" -C "$HELM_TMP" |
| HELM_TMP_BIN="$HELM_TMP/$OS-$ARCH/$PROJECT_NAME" |
| echo "Preparing to install into ${HELM_INSTALL_DIR}" |
| runAsRoot cp "$HELM_TMP_BIN" "$HELM_INSTALL_DIR" |
| } |
| |
| # fail_trap is executed if an error occurs. |
| fail_trap() { |
| result=$? |
| if [ "$result" != "0" ]; then |
| if [[ -n "$INPUT_ARGUMENTS" ]]; then |
| echo "Failed to install $PROJECT_NAME with the arguments provided: $INPUT_ARGUMENTS" |
| help |
| else |
| echo "Failed to install $PROJECT_NAME" |
| fi |
| echo -e "\tFor support, go to https://github.com/kubernetes/helm." |
| fi |
| cleanup |
| exit $result |
| } |
| |
| # testVersion tests the installed client to make sure it is working. |
| testVersion() { |
| set +e |
| echo "$PROJECT_NAME installed into $HELM_INSTALL_DIR/$PROJECT_NAME" |
| HELM="$(which $PROJECT_NAME)" |
| if [ "$?" = "1" ]; then |
| echo "$PROJECT_NAME not found. Is $HELM_INSTALL_DIR on your "'$PATH?' |
| exit 1 |
| fi |
| set -e |
| echo "Run '$PROJECT_NAME init' to configure $PROJECT_NAME." |
| } |
| |
| # help provides possible cli installation arguments |
| help () { |
| echo "Accepted cli arguments are:" |
| echo -e "\t[--help|-h ] ->> prints this help" |
| echo -e "\t[--version|-v <desired_version>] . When not defined it defaults to latest" |
| echo -e "\te.g. --version v2.4.0 or -v latest" |
| } |
| |
| # cleanup temporary files to avoid https://github.com/kubernetes/helm/issues/2977 |
| cleanup() { |
| rm -rf "$HELM_TMP_ROOT" |
| } |
| |
| # Execution |
| |
| #Stop execution on any error |
| trap "fail_trap" EXIT |
| set -e |
| |
| # Parsing input arguments (if any) |
| export INPUT_ARGUMENTS="${@}" |
| set -u |
| while [[ $# -gt 0 ]]; do |
| case $1 in |
| '--version'|-v) |
| shift |
| if [[ $# -ne 0 ]]; then |
| export DESIRED_VERSION="${1}" |
| else |
| echo -e "Please provide the desired version. e.g. --version v2.4.0 or -v latest" |
| exit 0 |
| fi |
| ;; |
| '--help'|-h) |
| help |
| exit 0 |
| ;; |
| *) exit 1 |
| ;; |
| esac |
| shift |
| done |
| set +u |
| |
| initArch |
| initOS |
| verifySupported |
| checkDesiredVersion |
| if ! checkHelmInstalledVersion; then |
| downloadFile |
| installFile |
| fi |
| testVersion |
| cleanup |