Release Helm Charts #6
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Release Helm Charts | |
on: | |
workflow_dispatch: | |
inputs: | |
version: | |
description: "Release version (eg: 2.1.1)" | |
required: true | |
type: string | |
charts_dir: | |
description: "Charts directory" | |
required: true | |
default: 'helm' | |
type: string | |
env: | |
PACKAGE_DIR: dist | |
# Only allow one instance of this workflow to run at a time | |
concurrency: | |
group: "pages" | |
cancel-in-progress: true | |
jobs: | |
verify: | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4 | |
- name: Make sure charts directory exists and contains Helm charts | |
env: | |
CHARTS_DIR: ${{ inputs.charts_dir }} | |
run: find $CHARTS_DIR -maxdepth 2 -mindepth 2 -type f -name "Chart.yaml" | |
- name: Verify release version is a valid SemVer version string | |
env: | |
VERSION: ${{ inputs.version }} | |
# regex is from the semver.org list of suggested regex strings https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string | |
run: echo $VERSION | grep -qP '^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$' | |
- name: Ensure a git tag for this version does not already exist | |
env: | |
VERSION: v${{ inputs.version }} | |
run: | | |
if [ $(git tag -l "$VERSION") ]; then | |
echo "Git tag matching release version '$VERSION' already exists" | |
false | |
else | |
true | |
fi | |
- name: Ensure a Github release for this version does not already exist | |
env: | |
VERSION: v${{ inputs.version }} | |
GH_TOKEN: ${{ github.token }} | |
run: | | |
export API_RESULT=$(gh api --silent \ | |
-H "Accept: application/vnd.github+json" \ | |
-H "X-Github-Api-Version: 2022-11-28" \ | |
/repos/${{ github.repository }}/releases/tags/${VERSION} 2>&1) | |
if [[ "$API_RESULT" == *"Not Found"* ]]; then | |
true | |
else | |
echo "Release for version '$VERSION' already exists on Github" | |
false | |
fi | |
release: | |
needs: verify | |
# Provision a Github token with repository and pages write permissions | |
permissions: | |
contents: write | |
pages: write | |
id-token: write | |
# Use the github-pages environment. The actions/deploy-pages workflow fails with a | |
# "Invalid environment node id" error if an environment is not specified. | |
# https://github.com/actions/deploy-pages/issues/271 | |
environment: | |
name: github-pages | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout | |
uses: actions/checkout@v4 | |
- name: Configure git | |
run: | | |
git config user.name "$GITHUB_ACTOR" | |
git config user.email "[email protected]" | |
- name: Create a git tag for the release | |
uses: EndBug/add-and-commit@v9 | |
with: | |
message: "Nemesis v${{ inputs.version }}" | |
push: true | |
tag: "v${{ inputs.version }}" | |
- name: Install Helm | |
env: | |
GITHUB_TOKEN: ${{ github.token }} | |
uses: azure/setup-helm@v3 | |
- name: Add chart dependency repositories | |
env: | |
CHARTS_DIR: ${{ inputs.charts_dir }} | |
run: | | |
charts=($(find $CHARTS_DIR -maxdepth 2 -mindepth 2 -type f -name "Chart.yaml" -printf '%h\n')) | |
for chart in "${charts[@]}"; do | |
repos=($(helm dependency list $chart | head -n '-1' | tail -n '+2' | cut -f3)) | |
for repo in "${repos[@]}"; do | |
name=$(echo $repo | grep -o '[^/]*$') | |
helm repo add $name $repo | |
done | |
done | |
- name: Package Helm charts | |
env: | |
PACKAGE_DIR: ${{ env.PACKAGE_DIR }} | |
CHARTS_DIR: ${{ inputs.charts_dir }} | |
run: | | |
mkdir -p $PACKAGE_DIR | |
find $CHARTS_DIR -maxdepth 2 -mindepth 2 -type f -name "Chart.yaml" -printf '%h\n' | xargs -I % bash -c "helm package -d $PACKAGE_DIR %" | |
- name: Pull in previous index.yaml file if it exists | |
env: | |
PACKAGE_DIR: ${{ env.PACKAGE_DIR }} | |
GH_TOKEN: ${{ github.token }} | |
run: | | |
PAGES_URL=$(gh api \ | |
-H "Accept: application/vnd.github+json" \ | |
-H "X-GitHub-Api-Version: 2022-11-28" \ | |
/repos/${{ github.repository }}/pages \ | |
| jq -r '.html_url') | |
if [[ "$PAGES_URL" != "null" ]]; then | |
HTTP_STATUS=$(curl -sL -w '%{http_code}' "${PAGES_URL%/}/index.yaml" -o ${PACKAGE_DIR}/index.yaml) | |
if [[ "$HTTP_STATUS" != "200" ]]; then | |
rm ${PACKAGE_DIR}/index.yaml | |
fi | |
fi | |
- name: Update Helm repository index.yaml file | |
env: | |
PACKAGE_DIR: ${{ env.PACKAGE_DIR }} | |
CHART_BASE_URL: ${{ github.server_url }}/${{ github.repository }}/releases/download/v${{ inputs.version }} | |
run: | | |
if [ -f ${PACKAGE_DIR}/index.yaml ]; then | |
helm repo index $PACKAGE_DIR --merge ${PACKAGE_DIR}/index.yaml --url $CHART_BASE_URL | |
else | |
helm repo index $PACKAGE_DIR --url $CHART_BASE_URL | |
fi | |
- name: Create Github release with the Helm charts | |
env: | |
PACKAGE_DIR: ${{ env.PACKAGE_DIR }} | |
VERSION: v${{ inputs.version }} | |
GH_TOKEN: ${{ github.token }} | |
run: gh release create ${VERSION} -R ${{ github.repository }} -t "Nemesis $VERSION" -n "Nemesis $VERSION release" $PACKAGE_DIR/*.tgz | |
- name: Remove packaged Helm charts | |
env: | |
PACKAGE_DIR: ${{ env.PACKAGE_DIR }} | |
run: rm -f ${PACKAGE_DIR}/*.tgz | |
- name: Setup Github pages | |
uses: actions/configure-pages@v4 | |
- name: Create Github pages artifact | |
uses: actions/upload-pages-artifact@v3 | |
with: | |
path: ${{ env.PACKAGE_DIR }} | |
- name: Deploy Helm chart repository to Github pages | |
uses: actions/deploy-pages@v4 | |
- name: Remove Github release and tag on failure | |
continue-on-error: true | |
if: ${{ failure() }} | |
env: | |
VERSION: v${{ inputs.version }} | |
GH_TOKEN: ${{ github.token }} | |
run: gh release delete -R ${{ github.repository }} $VERSION -y --cleanup-tag |