mirror of
				https://github.com/fluxcd/flux2.git
				synced 2025-10-31 08:17:19 +08:00 
			
		
		
		
	 c7080d2834
			
		
	
	c7080d2834
	
	
	
		
			
			This causes the format of the checksum file generated during the release to change from `flux2_*_checksums.txt` to `flux_*_checksums.txt`. The configuration change is made through `project_name` and not via the `checksum.name_template` setting, because a single checksum file is generated during the release process. The download and/or installation script in `install/flux.sh` has been adapted to assume the new filename starting with MINOR version `0.6.0`. Signed-off-by: Hidde Beydals <hello@hidde.co>
		
			
				
	
	
		
			232 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			232 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/usr/bin/env bash
 | |
| set -e
 | |
| 
 | |
| DEFAULT_BIN_DIR="/usr/local/bin"
 | |
| BIN_DIR=${1:-"${DEFAULT_BIN_DIR}"}
 | |
| GITHUB_REPO="fluxcd/flux2"
 | |
| 
 | |
| # Helper functions for logs
 | |
| info() {
 | |
|     echo '[INFO] ' "$@"
 | |
| }
 | |
| 
 | |
| warn() {
 | |
|     echo '[WARN] ' "$@" >&2
 | |
| }
 | |
| 
 | |
| fatal() {
 | |
|     echo '[ERROR] ' "$@" >&2
 | |
|     exit 1
 | |
| }
 | |
| 
 | |
| # Set os, fatal if operating system not supported
 | |
| setup_verify_os() {
 | |
|     if [[ -z "${OS}" ]]; then
 | |
|         OS=$(uname)
 | |
|     fi
 | |
|     case ${OS} in
 | |
|         Darwin)
 | |
|             OS=darwin
 | |
|             ;;
 | |
|         Linux)
 | |
|             OS=linux
 | |
|             ;;
 | |
|         *)
 | |
|             fatal "Unsupported operating system ${OS}"
 | |
|     esac
 | |
| }
 | |
| 
 | |
| # Set arch, fatal if architecture not supported
 | |
| setup_verify_arch() {
 | |
|     if [[ -z "${ARCH}" ]]; then
 | |
|         ARCH=$(uname -m)
 | |
|     fi
 | |
|     case ${ARCH} in
 | |
|         arm|armv6l|armv7l)
 | |
|             ARCH=arm
 | |
|             ;;
 | |
|         arm64|aarch64|armv8l)
 | |
|             ARCH=arm64
 | |
|             ;;
 | |
|         amd64)
 | |
|             ARCH=amd64
 | |
|             ;;
 | |
|         x86_64)
 | |
|             ARCH=amd64
 | |
|             ;;
 | |
|         *)
 | |
|             fatal "Unsupported architecture ${ARCH}"
 | |
|     esac
 | |
| }
 | |
| 
 | |
| # Verify existence of downloader executable
 | |
| verify_downloader() {
 | |
|     # Return failure if it doesn't exist or is no executable
 | |
|     [[ -x "$(which "$1")" ]] || return 1
 | |
| 
 | |
|     # Set verified executable as our downloader program and return success
 | |
|     DOWNLOADER=$1
 | |
|     return 0
 | |
| }
 | |
| 
 | |
| # Create tempory directory and cleanup when done
 | |
| setup_tmp() {
 | |
|     TMP_DIR=$(mktemp -d -t flux-install.XXXXXXXXXX)
 | |
|     TMP_METADATA="${TMP_DIR}/flux.json"
 | |
|     TMP_HASH="${TMP_DIR}/flux.hash"
 | |
|     TMP_BIN="${TMP_DIR}/flux.tar.gz"
 | |
|     cleanup() {
 | |
|         local code=$?
 | |
|         set +e
 | |
|         trap - EXIT
 | |
|         rm -rf "${TMP_DIR}"
 | |
|         exit ${code}
 | |
|     }
 | |
|     trap cleanup INT EXIT
 | |
| }
 | |
| 
 | |
| # Find version from Github metadata
 | |
| get_release_version() {
 | |
|     METADATA_URL="https://api.github.com/repos/${GITHUB_REPO}/releases/latest"
 | |
| 
 | |
|     info "Downloading metadata ${METADATA_URL}"
 | |
|     download "${TMP_METADATA}" "${METADATA_URL}"
 | |
| 
 | |
|     VERSION_FLUX=$(grep '"tag_name":' "${TMP_METADATA}" | sed -E 's/.*"([^"]+)".*/\1/' | cut -c 2-)
 | |
|     if [[ -n "${VERSION_FLUX}" ]]; then
 | |
|         info "Using ${VERSION_FLUX} as release"
 | |
|     else
 | |
|         fatal "Unable to determine release version"
 | |
|     fi
 | |
| }
 | |
| 
 | |
| # Download from file from URL
 | |
| download() {
 | |
|     [[ $# -eq 2 ]] || fatal 'download needs exactly 2 arguments'
 | |
| 
 | |
|     case $DOWNLOADER in
 | |
|         curl)
 | |
|             curl -o "$1" -sfL "$2"
 | |
|             ;;
 | |
|         wget)
 | |
|             wget -qO "$1" "$2"
 | |
|             ;;
 | |
|         *)
 | |
|             fatal "Incorrect executable '${DOWNLOADER}'"
 | |
|             ;;
 | |
|     esac
 | |
| 
 | |
|     # Abort if download command failed
 | |
|     [[ $? -eq 0 ]] || fatal 'Download failed'
 | |
| }
 | |
| 
 | |
| # Version comparison
 | |
| # Returns 0 on '=', 1 on '>', and 2 on '<'.
 | |
| # Ref: https://stackoverflow.com/a/4025065
 | |
| vercomp () {
 | |
|     if [[ $1 == $2 ]]
 | |
|     then
 | |
|         return 0
 | |
|     fi
 | |
|     local IFS=.
 | |
|     local i ver1=($1) ver2=($2)
 | |
|     # fill empty fields in ver1 with zeros
 | |
|     for ((i=${#ver1[@]}; i<${#ver2[@]}; i++))
 | |
|     do
 | |
|         ver1[i]=0
 | |
|     done
 | |
|     for ((i=0; i<${#ver1[@]}; i++))
 | |
|     do
 | |
|         if [[ -z ${ver2[i]} ]]
 | |
|         then
 | |
|             # fill empty fields in ver2 with zeros
 | |
|             ver2[i]=0
 | |
|         fi
 | |
|         if ((10#${ver1[i]} > 10#${ver2[i]}))
 | |
|         then
 | |
|             return 1
 | |
|         fi
 | |
|         if ((10#${ver1[i]} < 10#${ver2[i]}))
 | |
|         then
 | |
|             return 2
 | |
|         fi
 | |
|     done
 | |
|     return 0
 | |
| }
 | |
| 
 | |
| # Download hash from Github URL
 | |
| download_hash() {
 | |
|     HASH_URL="https://github.com/${GITHUB_REPO}/releases/download/v${VERSION_FLUX}/flux_${VERSION_FLUX}_checksums.txt"
 | |
|     # NB: support the checksum filename format prior to v0.6.0
 | |
|     set +e
 | |
|     vercomp ${VERSION_FLUX} 0.6.0
 | |
|     if [[ $? -eq 2 ]]; then
 | |
|         HASH_URL="https://github.com/${GITHUB_REPO}/releases/download/v${VERSION_FLUX}/flux2_${VERSION_FLUX}_checksums.txt"
 | |
|     fi
 | |
|     set -e
 | |
| 
 | |
|     info "Downloading hash ${HASH_URL}"
 | |
|     download "${TMP_HASH}" "${HASH_URL}"
 | |
|     HASH_EXPECTED=$(grep " flux_${VERSION_FLUX}_${OS}_${ARCH}.tar.gz$" "${TMP_HASH}")
 | |
|     HASH_EXPECTED=${HASH_EXPECTED%%[[:blank:]]*}
 | |
| }
 | |
| 
 | |
| # Download binary from Github URL
 | |
| download_binary() {
 | |
|     BIN_URL="https://github.com/${GITHUB_REPO}/releases/download/v${VERSION_FLUX}/flux_${VERSION_FLUX}_${OS}_${ARCH}.tar.gz"
 | |
|     info "Downloading binary ${BIN_URL}"
 | |
|     download "${TMP_BIN}" "${BIN_URL}"
 | |
| }
 | |
| 
 | |
| compute_sha256sum() {
 | |
|   cmd=$(which sha256sum shasum | head -n 1)
 | |
|   case $(basename "$cmd") in
 | |
|     sha256sum)
 | |
|       sha256sum "$1" | cut -f 1 -d ' '
 | |
|       ;;
 | |
|     shasum)
 | |
|       shasum -a 256 "$1" | cut -f 1 -d ' '
 | |
|       ;;
 | |
|     *)
 | |
|       fatal "Can not find sha256sum or shasum to compute checksum"
 | |
|       ;;
 | |
|   esac
 | |
| }
 | |
| 
 | |
| # Verify downloaded binary hash
 | |
| verify_binary() {
 | |
|     info "Verifying binary download"
 | |
|     HASH_BIN=$(compute_sha256sum "${TMP_BIN}")
 | |
|     HASH_BIN=${HASH_BIN%%[[:blank:]]*}
 | |
|     if [[ "${HASH_EXPECTED}" != "${HASH_BIN}" ]]; then
 | |
|         fatal "Download sha256 does not match ${HASH_EXPECTED}, got ${HASH_BIN}"
 | |
|     fi
 | |
| }
 | |
| 
 | |
| # Setup permissions and move binary
 | |
| setup_binary() {
 | |
|     chmod 755 "${TMP_BIN}"
 | |
|     info "Installing flux to ${BIN_DIR}/flux"
 | |
|     tar -xzf "${TMP_BIN}" -C "${TMP_DIR}"
 | |
| 
 | |
|     local CMD_MOVE="mv -f \"${TMP_DIR}/flux\" \"${BIN_DIR}\""
 | |
|     if [[ -w "${BIN_DIR}" ]]; then
 | |
|         eval "${CMD_MOVE}"
 | |
|     else
 | |
|         eval "sudo ${CMD_MOVE}"
 | |
|     fi
 | |
| }
 | |
| 
 | |
| # Run the install process
 | |
| {
 | |
|     setup_verify_os
 | |
|     setup_verify_arch
 | |
|     verify_downloader curl || verify_downloader wget || fatal 'Can not find curl or wget for downloading files'
 | |
|     setup_tmp
 | |
|     get_release_version
 | |
|     download_hash
 | |
|     download_binary
 | |
|     verify_binary
 | |
|     setup_binary
 | |
| }
 |