From b1975505e5302ea312d120ee7a0e9c3735481c4d Mon Sep 17 00:00:00 2001 From: Michel Hollands Date: Tue, 16 Apr 2024 14:44:41 +0100 Subject: [PATCH] Add CI to publish helm chart Signed-off-by: Michel Hollands --- .github/workflows/helm-release.yml | 161 +++++++++++++++++++++++++++++ 1 file changed, 161 insertions(+) create mode 100644 .github/workflows/helm-release.yml diff --git a/.github/workflows/helm-release.yml b/.github/workflows/helm-release.yml new file mode 100644 index 0000000..c0de7b2 --- /dev/null +++ b/.github/workflows/helm-release.yml @@ -0,0 +1,161 @@ +name: Release Helm chart +on: + workflow_dispatch: +env: + CR_CONFIGFILE: "${{ github.workspace }}/source/.github/configs/cr.yaml" + CT_CONFIGFILE: "${{ github.workspace }}/source/.github/configs/ct.yaml" + CR_INDEX_PATH: "${{ github.workspace }}/.cr-index" + CR_PACKAGE_PATH: "${{ github.workspace }}/.cr-release-packages" + CR_TOOL_PATH: "${{ github.workspace }}/.cr-tool" + CR_VERSION: "1.5.0" +jobs: + setup: + runs-on: ubuntu-latest + outputs: + changed: ${{ steps.list-changed.outputs.changed }} + chartpath: ${{ steps.list-changed.outputs.chartpath }} + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + path: source + + - name: Install chart-testing + uses: helm/chart-testing-action@v2 + + - name: List changed charts + id: list-changed + run: | + cd source + + latest_tag=$( if ! git describe --tags --abbrev=0 --match='helm-chart/*' 2> /dev/null ; then git rev-list --max-parents=0 --first-parent HEAD; fi ) + + echo "Running: ct list-changed --config ${CT_CONFIGFILE} --since ${latest_tag} --target-branch ${{ github.ref_name }}" + changed=$(ct list-changed --config "${CT_CONFIGFILE}" --since "${latest_tag}" --target-branch "${{ github.ref_name }}") + echo "${changed}" + + num_changed=$(wc -l <<< ${changed}) + if [[ "${num_changed}" -gt "1" ]] ; then + echo "More than one chart changed, exiting" + exit 1 + fi + if [[ -n "${changed}" ]]; then + name=$(yq ".name" < ${changed}/Chart.yaml) + version=$(yq ".version" < ${changed}/Chart.yaml) + tagname="v${version}" + + if [ $(git tag -l "${tagname}") ]; then + echo "Tag ${tagname} already exists, skipping release" + echo "changed=false" >> $GITHUB_OUTPUT + else + echo "Releasing ${changed}" + echo "changed=true" >> $GITHUB_OUTPUT + echo "chartpath=${changed}" >> $GITHUB_OUTPUT + fi + else + echo "No charts have changed, skipping release" + echo "changed=false" >> $GITHUB_OUTPUT + fi + + release: + needs: [setup] + runs-on: ubuntu-latest + if: needs.setup.outputs.changed == 'true' + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + path: source + + - name: Configure Git + run: | + cd source + git config user.name "$GITHUB_ACTOR" + git config user.email "$GITHUB_ACTOR@users.noreply.github.com" + + - name: Checkout helm-charts + uses: actions/checkout@v4 + with: + fetch-depth: 0 + repository: grafana/helm-charts + path: helm-charts + token: "${{ secrets.GH_BOT_ACCESS_TOKEN }}" + + - name: Configure Git for helm-charts + run: | + cd helm-charts + git config user.name "$GITHUB_ACTOR" + git config user.email "$GITHUB_ACTOR@users.noreply.github.com" + + - name: Set up Helm + uses: azure/setup-helm@v4 + with: + token: ${{ secrets.GITHUB_TOKEN }} + + - name: Parse Chart.yaml + id: parse-chart + run: | + cd source + changed="${{ needs.setup.outputs.chartpath }}" + description=$(yq ".description" < ${changed}/Chart.yaml) + name=$(yq ".name" < ${changed}/Chart.yaml) + version=$(yq ".version" < ${changed}/Chart.yaml) + + echo "chartpath=${changed}" >> $GITHUB_OUTPUT + echo "desc=${description}" >> $GITHUB_OUTPUT + echo "tagname=v${version}" >> $GITHUB_OUTPUT + echo "packagename=${name}-${version}" >> $GITHUB_OUTPUT + + - name: Install CR tool + run: | + mkdir "${CR_TOOL_PATH}" + mkdir "${CR_PACKAGE_PATH}" + mkdir "${CR_INDEX_PATH}" + curl -sSLo cr.tar.gz "https://github.com/helm/chart-releaser/releases/download/v${CR_VERSION}/chart-releaser_${CR_VERSION}_linux_amd64.tar.gz" + tar -xzf cr.tar.gz -C "${CR_TOOL_PATH}" + rm -f cr.tar.gz + + - name: Create Helm package + run: | + cd source + helm repo add grafana https://grafana.github.io/helm-charts + helm repo add minio https://charts.min.io + + "${CR_TOOL_PATH}/cr" package "${{ steps.parse-chart.outputs.chartpath }}" --config "${CR_CONFIGFILE}" --package-path "${CR_PACKAGE_PATH}" + + - name: Make a release on this repo + uses: softprops/action-gh-release@v2 + with: + name: ${{ steps.parse-chart.outputs.tagname }} + repository: grafana/meta-monitoring-chart + tag_name: ${{ steps.parse-chart.outputs.tagname }} + token: ${{ secrets.GH_BOT_ACCESS_TOKEN }} + generate_release_notes: true + files: | + ${{ env.CR_PACKAGE_PATH }}/${{ steps.parse-chart.outputs.packagename }}.tgz + + # Note that this creates a release in grafana/helm-charts with a new tag. + # The tag name in grafana/helm-charts is -, while the + # tag name for grafana/meta-monitoring-chart is . + - name: Make release on Helm Charts + uses: softprops/action-gh-release@v2 + with: + name: ${{ steps.parse-chart.outputs.packagename }} + repository: grafana/helm-charts + tag_name: ${{ steps.parse-chart.outputs.packagename }} + token: ${{ secrets.GH_BOT_ACCESS_TOKEN }} + body: | + ${{ steps.parse-chart.outputs.desc }} + + Source commit: https://github.com/${{ github.repository }}/commit/${{ github.sha }} + + Tag on source: https://github.com/${{ github.repository }}/releases/tag/${{ steps.parse-chart.outputs.tagname }} + files: | + ${{ env.CR_PACKAGE_PATH }}/${{ steps.parse-chart.outputs.packagename }}.tgz + + - name: Update helm-charts index.yaml + run: | + cd helm-charts + "${CR_TOOL_PATH}/cr" index --config "${CR_CONFIGFILE}" --token "${{ secrets.GH_BOT_ACCESS_TOKEN }}" --index-path "${CR_INDEX_PATH}" --package-path "${CR_PACKAGE_PATH}" --push \ No newline at end of file