#!/usr/bin/env bash ### Install PR ### # # This script takes a GitHub pull request number as an argument and loads the # images into a local Kubernetes cluster. It then installs the CLI so that it # can be used to install with any specific configuration needed. # # It requires a GitHub personal access token in the $GITHUB_TOKEN environment # variable. set -eo pipefail # Read script flags and arguments while : do case $1 in -h|--help) echo "Install Linkerd with the changes made in a GitHub Pull Request." echo "" echo "Usage:" echo " --cluster: The name of the cluster to use" echo "" echo " # Install Linkerd into the current cluster" echo " bin/install-pr 1234" echo "" echo " # Install Linkerd into the current k3d cluster" echo " bin/install-pr --k3d 1234" echo "" echo " # Install Linkerd into the current KinD cluster" echo " bin/install-pr --kind 1234" echo "" echo " # Install Linkerd into the 'pr-1234' k3d cluster" echo " bin/install-pr --k3d --cluster pr-1234 1234" exit 0 ;; --cluster) cluster=$2 shift ;; --kind) is_kind=1 ;; --k3d) is_k3d=1 ;; -?*) echo "Error: Unknown option: $1" >&2 exit 1 ;; *) break esac shift done pr=$1 if [ -z "$pr" ] then echo "Error: ${0##*/} accepts 1 argument" >&2 echo "Usage:" >&2 echo " ${0##*/} ####" >&2 exit 1 fi if [ -z "$GITHUB_TOKEN" ] then # shellcheck disable=SC2016 echo 'Error: Generate a personal access token at https://github.com/settings/tokens and set it in the $GITHUB_TOKEN env var' exit 1 fi linkerd2_pulls_url="https://api.github.com/repos/linkerd/linkerd2/pulls" linkerd2_integration_url="https://api.github.com/repos/linkerd/linkerd2/actions/workflows/integration_tests.yml" # Get the URL for downloading the artifacts archive auth="Authorization: token $GITHUB_TOKEN" branch=$(curl -sL -H "$auth" "$linkerd2_pulls_url/$pr" | jq -r '.head.ref') artifacts=$(curl -sL -H "$auth" "$linkerd2_integration_url/runs?branch=$branch" | jq -r '.workflow_runs[0].artifacts_url') archive=$(curl -sL -H "$auth" "$artifacts" | jq -r '.artifacts[0].archive_download_url') bindir=$( cd "${BASH_SOURCE[0]%/*}" && pwd ) dir=$(mktemp -d -t "linkerd-pr-$pr.XXXXXXXXXX") cd "$dir" || exit echo "### Downloading images ###" curl -L -o archive.zip -H "$auth" "$archive" unzip -o archive.zip -d image-archives/ echo "### Loading images into Docker ###" image=$(docker load -i image-archives/cli-bin.tar | sed 's/Loaded image: //') tag=$(echo "$image" | cut -f 2 -d ":") if [ $is_kind ] || [ $is_k3d ] then distro="k3d" if [ $is_kind ] then distro="kind" fi "$bindir"/image-load --"$distro" --archive "$cluster" else for image in cni-plugin controller debug grafana proxy web do image=$(docker load -i "image-archives/$image.tar" | sed 's/Loaded image: //') docker push "$image" done fi cd - rm -rf "$dir" case $(uname) in Darwin) platform="darwin" ;; Linux) platform="linux" ;; *) platform="windows" ;; esac linkerd=$("$bindir"/docker-pull-binaries "$tag" | awk -v platform=$platform '$0 ~ platform') echo "" echo "Linkerd CLI available:" echo "$linkerd"