Skip to content

Commit d6560a6

Browse files
committed
Add workflow to auto sync aws-load-balancer-controller helm chart to eks-chatrs
1 parent 2f525fd commit d6560a6

File tree

1 file changed

+169
-0
lines changed

1 file changed

+169
-0
lines changed

scripts/sync-to-eks-charts.sh

Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,169 @@
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

Comments
 (0)