#!/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 cluster='' is_kind=false is_k3d=false # Read script flags and arguments while : do case $1 in -h|--help) echo "Install Linkerd with the changes made in a GitHub Pull Request. Usage: --cluster: The name of the cluster to use # Install Linkerd into the current cluster bin/install-pr 1234 # Install Linkerd into the current k3d cluster bin/install-pr --k3d 1234 # Install Linkerd into the current KinD cluster bin/install-pr --kind 1234 # Install Linkerd into the 'pr-1234' k3d cluster bin/install-pr --k3d --cluster pr-1234 1234" exit 0 ;; --cluster) cluster=$2 shift ;; --kind) is_kind=true ;; --k3d) is_k3d=true ;; -?*) echo "Error: Unknown option: $1" >&2 exit 1 ;; *) break esac shift done pr=$1 if [ -z "$pr" ]; then echo "Error: ${0##*/} accepts 1 argument Usage: ${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' bindir=$( cd "${BASH_SOURCE[0]%/*}" && pwd ) # Get the URL for downloading the artifacts archive auth="Authorization: token $GITHUB_TOKEN" branch=$("$bindir"/scurl -H "$auth" "$linkerd2_pulls_url/$pr" | jq -r '.head.ref') artifacts=$("$bindir"/scurl -H "$auth" "$linkerd2_integration_url/runs?branch=$branch" | jq -r '.workflow_runs[0].artifacts_url') archive=$("$bindir"/scurl -H "$auth" "$artifacts" | jq -r '.artifacts[0].archive_download_url') dir=$(mktemp -d -t "linkerd-pr-$pr.XXXXXXXXXX") # shellcheck source=_docker.sh . "$bindir"/_docker.sh cd "$dir" || exit echo '### Downloading images ###' "$bindir"/scurl -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 ":") for image in "${DOCKER_IMAGES[@]}" do docker load -i "image-archives/$image.tar" done if [ "$is_kind" = true ] || [ "$is_k3d" = true ]; then # When importing into k3d or kind, the images must be renamed to use the # proper registry so that users don't have to change the default install # output. docker_rename_registry "$tag" 'ghcr.io/linkerd' 'cr.l5d.io/linkerd' distro=k3d if [ "$is_kind" = true ]; then distro=kind fi export TAG=$tag "$bindir"/image-load --"$distro" --cluster "$cluster" else # The images were built with the ghcr.io registry so when pushing to a # remote cluster for testing, no renaming needs to occur. for image in "${DOCKER_IMAGES[@]}" do docker push "$image" done fi cd - rm -rf "$dir" case $(uname) in Darwin) platform=darwin ;; Linux) platform=linux ;; *) platform=windows ;; esac # Images created based off PRs use the ghcr.io registry, so override the # default here when pulling the binary. export DOCKER_REGISTRY=ghcr.io/linkerd linkerd=$("$bindir"/docker-pull-binaries "$tag" | awk -v platform=$platform '$0 ~ platform') echo " Linkerd CLI available: $linkerd"