#!/bin/bash set -euo pipefail set +x SCRIPTPATH="$( cd "$(dirname "$0")" ; pwd -P )" BUILD_DIR="${SCRIPTPATH}/../build" VERSION=$(make -s -f $SCRIPTPATH/../Makefile version) REPO="aws/amazon-vpc-cni-k8s" PR_ID=$(uuidgen | cut -d '-' -f1) SYNC_DIR="${BUILD_DIR}/config-sync" BINARY_BASE="aws-vpc-cni" INCLUDE_NOTES=0 MANUAL_VERIFY=1 GH_CLI_VERSION="2.22.1" GH_CLI_CONFIG_PATH="${HOME}/.config/gh/config.yml" KERNEL=$(uname -s | tr '[:upper:]' '[:lower:]') OS="${KERNEL}" if [[ "${KERNEL}" == "darwin" ]]; then OS="macOS" fi USAGE=$(cat << EOM Usage: sync-to-config-folder -r Updates config folder in master branch Example: sync-to-config-folder -r "${REPO}" Optional: -r Github repo to sync to in the form of "org/name" (i.e. -r "${REPO}") -n Include application release notes in the sync PR -y Without asking for manual confirmation before creating PR to upstream EOM ) # Process our input arguments while getopts r:n:y opt; do case "${opt}" in r ) # Github repo REPO="$OPTARG" ;; n ) # Include release notes INCLUDE_NOTES=1 ;; y ) # Manual verify MANUAL_VERIFY=0 ;; \? ) echo "$USAGE" 1>&2 exit ;; esac done if [[ -z "${REPO}" ]]; then echo "Repo (-r) must be specified if no \"make repo-full-name\" target exists" fi echo $REPO # Install GitHub CLI if [[ -z $(command -v gh) ]] || [[ ! $(gh --version) =~ $GH_CLI_VERSION ]]; then mkdir -p "${BUILD_DIR}"/gh 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" tar -C "${BUILD_DIR}"/gh -xvf "${BUILD_DIR}/gh/gh.tar.gz" export PATH="${BUILD_DIR}/gh/gh_${GH_CLI_VERSION}_${OS}_amd64/bin:$PATH" if [[ ! $(gh --version) =~ $GH_CLI_VERSION ]]; then echo "❌ Failed install of github cli" exit 4 fi fi function restore_gh_config() { mv -f "${GH_CLI_CONFIG_PATH}.bkup" "${GH_CLI_CONFIG_PATH}" || : } # Set auth tokens for GitHub CLI if [[ -n $(env | grep GITHUB_TOKEN) ]] && [[ -n "${GITHUB_TOKEN}" ]]; then trap restore_gh_config EXIT INT TERM ERR mkdir -p "${HOME}/.config/gh" cp -f "${GH_CLI_CONFIG_PATH}" "${GH_CLI_CONFIG_PATH}.bkup" || : cat << EOF > "${GH_CLI_CONFIG_PATH}" hosts: github.com: oauth_token: ${GITHUB_TOKEN} user: ${GITHUB_USERNAME} EOF fi function fail() { echo "❌ Config folders sync failed" exit 5 } RELEASE_BRANCH=$(curl -s -H "Authorization: token $GITHUB_TOKEN" \ https://api.github.com/repos/aws/amazon-vpc-cni-k8s/releases | \ jq -r --arg VERSION "$VERSION" '.[] | select(.tag_name==$VERSION) | .target_commitish') make -s -f $SCRIPTPATH/../Makefile generate-cni-yaml rm -rf "${SYNC_DIR}" mkdir -p "${SYNC_DIR}" cd "${SYNC_DIR}" # Clone upstream repo and setup git parameters gh repo clone aws/amazon-vpc-cni-k8s DEFAULT_BRANCH=$(git rev-parse --abbrev-ref HEAD | tr -d '\n') CONFIG_DIR=amazon-vpc-cni-k8s/config/master cd $CONFIG_DIR REPO_NAME=$(echo ${REPO} | cut -d'/' -f2) git remote set-url origin https://"${GITHUB_USERNAME}":"${GITHUB_TOKEN}"@github.com/"${GITHUB_USERNAME}"/"${REPO_NAME}".git git config user.name "eks-networking-bot" git config user.email "eks-networking-bot@users.noreply.github.com" # Fork master branch and create sync PR FORK_RELEASE_BRANCH="${BINARY_BASE}-${VERSION}-${PR_ID}" git checkout -b "${FORK_RELEASE_BRANCH}" origin/master cp $SCRIPTPATH/../build/cni-rel-yamls/${VERSION}/aws-k8s-cni*.yaml . cp $SCRIPTPATH/../build/cni-rel-yamls/${VERSION}/cni-metrics-helper*.yaml . git add --all git commit -m "${BINARY_BASE}: ${VERSION}" PR_BODY=$(cat << EOM ## ${BINARY_BASE} ${VERSION} Automated manifest folder Sync! 🤖🤖 ### Description 📝 Updating all the generated release artifacts in master/config for master branch. EOM ) git push -u origin "${FORK_RELEASE_BRANCH}" gh pr create --title "${BINARY_BASE} ${VERSION} Automated manifest sync! 🥑" \ --body "${PR_BODY}" --repo ${REPO} echo "Manifest folder PR created for master"