mirror of https://github.com/helm/helm
				
				
				
			
			You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							233 lines
						
					
					
						
							6.5 KiB
						
					
					
				
			
		
		
	
	
							233 lines
						
					
					
						
							6.5 KiB
						
					
					
				#!/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/helm/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/helm/helm/releases/${DESIRED_VERSION:-latest}"
 | 
						|
  if type "curl" > /dev/null; then
 | 
						|
    TAG=$(curl -SsL $release_url | awk '/\/tag\//' | grep -v no-underline | 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\//' | grep -v no-underline | 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://get.helm.sh/$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_FILE} 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/helm/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/helm/helm/issues/2977
 | 
						|
cleanup() {
 | 
						|
  if [[ -d "${HELM_TMP_ROOT:-}" ]]; then
 | 
						|
    rm -rf "$HELM_TMP_ROOT"
 | 
						|
  fi
 | 
						|
}
 | 
						|
 | 
						|
# 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
 |