diff --git a/.github/configs/cr.yaml b/.github/configs/cr.yaml new file mode 100644 index 0000000..f47388b --- /dev/null +++ b/.github/configs/cr.yaml @@ -0,0 +1,3 @@ +owner: grafana +git-repo: helm-charts +skip-existing: true \ No newline at end of file diff --git a/.github/configs/ct.yaml b/.github/configs/ct.yaml new file mode 100644 index 0000000..30a94a1 --- /dev/null +++ b/.github/configs/ct.yaml @@ -0,0 +1,15 @@ +## Reference: https://github.com/helm/chart-testing/blob/master/doc/ct_lint-and-install.md +remote: origin +target-branch: main +chart-dirs: +- charts +chart-repos: + - grafana=https://grafana.github.io/helm-charts + - minio=https://charts.min.io +validate-chart-schema: true +validate-maintainers: true +validate-yaml: true +exclude-deprecated: true +excluded-charts: [] +namespace: meta-monitoring # Need to set the namespace because we create the secret there +release-label: app.kubernetes.io/instance \ No newline at end of file diff --git a/.github/workflows/helm-release.yml b/.github/workflows/helm-release.yml new file mode 100644 index 0000000..1e105b6 --- /dev/null +++ b/.github/workflows/helm-release.yml @@ -0,0 +1,167 @@ +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" +permissions: + contents: read + id-token: write +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: + - uses: actions/create-github-app-token@v1 + id: app-token + with: + app-id: ${{ secrets.app-id }} + private-key: ${{ secrets.private-key }} + - 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: "${{ steps.app-token.outputs.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 + + - 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: ${{ steps.app-token.outputs.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: ${{ steps.app-token.outputs.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 "${{ steps.app-token.outputs.token }}" --index-path "${CR_INDEX_PATH}" --package-path "${CR_PACKAGE_PATH}" --push \ No newline at end of file