|
| 1 | +#!/bin/bash |
| 2 | +set -euo pipefail |
| 3 | +set +x |
| 4 | + |
| 5 | +SCRIPTPATH="$( cd "$(dirname "$0")" ; pwd -P )" |
| 6 | +BUILD_DIR="${SCRIPTPATH}/../build" |
| 7 | + |
| 8 | +REPO="kubernetes-sigs/aws-load-balancer-controller" |
| 9 | +HELM_CHART_NAME="aws-load-balancer-controller" |
| 10 | +HELM_CHART_BASE_BIR="${SCRIPTPATH}/../helm" |
| 11 | + |
| 12 | +CHARTS_REPO="aws/eks-charts" |
| 13 | +CHARTS_REPO_NAME=$(echo ${CHARTS_REPO} | cut -d'/' -f2) |
| 14 | + |
| 15 | +HELM_CHART_DIR="${HELM_CHART_BASE_BIR}/${HELM_CHART_NAME}" |
| 16 | +PR_ID=$(uuidgen | cut -d '-' -f1) |
| 17 | + |
| 18 | +SYNC_DIR="${BUILD_DIR}/eks-charts-sync" |
| 19 | +FORK_DIR="${SYNC_DIR}/${CHARTS_REPO_NAME}" |
| 20 | + |
| 21 | +BINARY_BASE="" |
| 22 | +INCLUDE_NOTES=0 |
| 23 | + |
| 24 | +GH_CLI_VERSION="0.10.1" |
| 25 | +GH_CLI_CONFIG_PATH="${HOME}/.config/gh/config.yml" |
| 26 | +KERNEL=$(uname -s | tr '[:upper:]' '[:lower:]') |
| 27 | +OS="${KERNEL}" |
| 28 | +if [[ "${KERNEL}" == "darwin" ]]; then |
| 29 | + OS="macOS" |
| 30 | +fi |
| 31 | + |
| 32 | +VERSION=$(echo $(grep -m 1 IMG "${SCRIPTPATH}/../Makefile") | cut -d':' -f2) |
| 33 | + |
| 34 | +USAGE=$(cat << EOM |
| 35 | + Usage: sync-to-eks-charts -r <repo> |
| 36 | + Syncs Helm chart to aws/eks-charts |
| 37 | +
|
| 38 | + Example: sync-to-eks-charts -r "${REPO}" |
| 39 | + Required: |
| 40 | + -b Binary basename (i.e. -b "${HELM_CHART_NAME}") |
| 41 | +
|
| 42 | + Optional: |
| 43 | + -r Github repo to sync to in the form of "org/name" (i.e. -r "${REPO}") |
| 44 | + -n Include application release notes in the sync PR |
| 45 | +EOM |
| 46 | +) |
| 47 | + |
| 48 | +# Process our input arguments |
| 49 | +while getopts "b:r:n" opt; do |
| 50 | + case ${opt} in |
| 51 | + r ) # Github repo |
| 52 | + REPO="$OPTARG" |
| 53 | + ;; |
| 54 | + b ) # binary basename |
| 55 | + BINARY_BASE="$OPTARG" |
| 56 | + ;; |
| 57 | + n ) # Include release notes |
| 58 | + INCLUDE_NOTES=1 |
| 59 | + ;; |
| 60 | + \? ) |
| 61 | + echo "$USAGE" 1>&2 |
| 62 | + exit |
| 63 | + ;; |
| 64 | + esac |
| 65 | +done |
| 66 | + |
| 67 | + |
| 68 | +if [[ -z "${REPO}" ]]; then |
| 69 | + echo "Repo (-r) must be specified if no \"make repo-full-name\" target exists" |
| 70 | +fi |
| 71 | + |
| 72 | +echo $REPO |
| 73 | + |
| 74 | +if [[ -z $(command -v gh) ]] || [[ ! $(gh --version) =~ $GH_CLI_VERSION ]]; then |
| 75 | + mkdir -p "${BUILD_DIR}"/gh |
| 76 | + curl -Lo "${BUILD_DIR}"/gh/gh.tar.gz "https://github.com/cli/cli/releases/download/v${GH_CLI_VERSION}/gh_${GH_CLI_VERSION}_${OS}_amd64.tar.gz" |
| 77 | + tar -C "${BUILD_DIR}"/gh -xvf "${BUILD_DIR}/gh/gh.tar.gz" |
| 78 | + export PATH="${BUILD_DIR}/gh/gh_${GH_CLI_VERSION}_${OS}_amd64/bin:$PATH" |
| 79 | + if [[ ! $(gh --version) =~ $GH_CLI_VERSION ]]; then |
| 80 | + echo "❌ Failed install of github cli" |
| 81 | + exit 4 |
| 82 | + fi |
| 83 | +fi |
| 84 | + |
| 85 | +function restore_gh_config() { |
| 86 | + mv -f "${GH_CLI_CONFIG_PATH}.bkup" "${GH_CLI_CONFIG_PATH}" || : |
| 87 | +} |
| 88 | + |
| 89 | +if [[ -n $(env | grep GITHUB_TOKEN) ]] && [[ -n "${GITHUB_TOKEN}" ]]; then |
| 90 | + trap restore_gh_config EXIT INT TERM ERR |
| 91 | + mkdir -p "${HOME}/.config/gh" |
| 92 | + cp -f "${GH_CLI_CONFIG_PATH}" "${GH_CLI_CONFIG_PATH}.bkup" || : |
| 93 | + cat << EOF > "${GH_CLI_CONFIG_PATH}" |
| 94 | +hosts: |
| 95 | + github.com: |
| 96 | + oauth_token: ${GITHUB_TOKEN} |
| 97 | + user: ${GITHUB_USERNAME} |
| 98 | +EOF |
| 99 | +fi |
| 100 | + |
| 101 | +function fail() { |
| 102 | + echo "❌ EKS charts sync failed" |
| 103 | + exit 5 |
| 104 | +} |
| 105 | + |
| 106 | +trap fail ERR TERM INT |
| 107 | + |
| 108 | +rm -rf "${SYNC_DIR}" |
| 109 | +mkdir -p "${SYNC_DIR}" |
| 110 | + |
| 111 | +cd "${SYNC_DIR}" |
| 112 | +gh repo fork $CHARTS_REPO --clone --remote |
| 113 | +cd "${FORK_DIR}" |
| 114 | +git remote set-url origin https://"${GITHUB_USERNAME}":"${GITHUB_TOKEN}"@github.com/"${GITHUB_USERNAME}"/"${CHARTS_REPO_NAME}".git |
| 115 | +DEFAULT_BRANCH=$(git rev-parse --abbrev-ref HEAD | tr -d '\n') |
| 116 | + |
| 117 | + |
| 118 | +if diff -x ".*" -r "$HELM_CHART_DIR/" "${FORK_DIR}/stable/${HELM_CHART_NAME}/" &> /dev/null ; then |
| 119 | + echo " ✅ Charts already in sync; no updates needed" |
| 120 | + exit |
| 121 | +else |
| 122 | + echo "📊 Charts are NOT in sync proceeding with PR" |
| 123 | +fi |
| 124 | + |
| 125 | +git config user.name "eks-bot" |
| 126 | +git config user.email "[email protected]" |
| 127 | + |
| 128 | +# Sync the fork |
| 129 | +git pull upstream "${DEFAULT_BRANCH}" |
| 130 | +git push -u origin "${DEFAULT_BRANCH}" |
| 131 | + |
| 132 | +FORK_RELEASE_BRANCH="${BINARY_BASE}-${VERSION}-${PR_ID}" |
| 133 | +git checkout -b "${FORK_RELEASE_BRANCH}" upstream/"${DEFAULT_BRANCH}" |
| 134 | + |
| 135 | +rm -rf "${FORK_DIR}"/stable/${HELM_CHART_NAME}/ |
| 136 | +cp -r "$HELM_CHART_DIR/" "${FORK_DIR}/stable/${HELM_CHART_NAME}/" |
| 137 | + |
| 138 | +git add --all |
| 139 | +git commit -m "${BINARY_BASE}: ${VERSION}" |
| 140 | + |
| 141 | +PR_BODY=$(cat << EOM |
| 142 | +## ${BINARY_BASE} ${VERSION} Automated Chart Sync! 🤖🤖 |
| 143 | +EOM |
| 144 | +) |
| 145 | + |
| 146 | +if [[ "${INCLUDE_NOTES}" -eq 1 ]]; then |
| 147 | + RELEASE_ID=$(curl -s -H "Authorization: token $GITHUB_TOKEN" \ |
| 148 | + https://api.github.com/repos/"${REPO}"/releases | \ |
| 149 | + jq --arg VERSION "$VERSION" '.[] | select(.tag_name==$VERSION) | .id') |
| 150 | + |
| 151 | + RELEASE_NOTES=$(curl -s -H "Authorization: token ${GITHUB_TOKEN}" \ |
| 152 | + https://api.github.com/repos/"${REPO}"/releases/"${RELEASE_ID}" | \ |
| 153 | + jq -r '.body') |
| 154 | + |
| 155 | + PR_BODY=$(cat << EOM |
| 156 | + ## ${BINARY_BASE} ${VERSION} Automated Chart Sync! 🤖🤖 |
| 157 | +
|
| 158 | + ### Release Notes 📝: |
| 159 | +
|
| 160 | + ${RELEASE_NOTES} |
| 161 | +EOM |
| 162 | +) |
| 163 | +fi |
| 164 | + |
| 165 | + git push -u origin "${FORK_RELEASE_BRANCH}" |
| 166 | + gh pr create --title "🥳 ${BINARY_BASE} ${VERSION} Automated Release! 🥑" \ |
| 167 | + --body "${PR_BODY}" --repo ${CHARTS_REPO} |
| 168 | + |
| 169 | +echo "✅ EKS charts sync complete" |
0 commit comments