feat: add Artifacthub annotation 'artifacthub.io/changes' #881

Merged
pat-s merged 2 commits from volker.raschek/helm-chart:feat/support-artifacthub-annotation-changes into main 2025-06-16 14:20:40 +00:00

114
.gitea/scripts/add-annotations.sh Executable file
View File

@@ -0,0 +1,114 @@
#!/bin/bash
set -e
CHART_FILE="Chart.yaml"
if [ ! -f "${CHART_FILE}" ]; then
echo "ERROR: ${CHART_FILE} not found!" 1>&2
exit 1
fi
DEFAULT_NEW_TAG="$(git tag --sort=-version:refname | head -n 1)"
DEFAULT_OLD_TAG="$(git tag --sort=-version:refname | head -n 2 | tail -n 1)"
if [ -z "${1}" ]; then
read -p "Enter start tag [${DEFAULT_OLD_TAG}]: " OLD_TAG
if [ -z "${OLD_TAG}" ]; then
OLD_TAG="${DEFAULT_OLD_TAG}"
fi
while [ -z "$(git tag --list "${OLD_TAG}")" ]; do
echo "ERROR: Tag '${OLD_TAG}' not found!" 1>&2
read -p "Enter start tag [${DEFAULT_OLD_TAG}]: " OLD_TAG
if [ -z "${OLD_TAG}" ]; then
OLD_TAG="${DEFAULT_OLD_TAG}"
fi
done
else
OLD_TAG=${1}
if [ -z "$(git tag --list "${OLD_TAG}")" ]; then
echo "ERROR: Tag '${OLD_TAG}' not found!" 1>&2
exit 1
fi
fi
if [ -z "${2}" ]; then
read -p "Enter end tag [${DEFAULT_NEW_TAG}]: " NEW_TAG
if [ -z "${NEW_TAG}" ]; then
NEW_TAG="${DEFAULT_NEW_TAG}"
fi
while [ -z "$(git tag --list "${NEW_TAG}")" ]; do
echo "ERROR: Tag '${NEW_TAG}' not found!" 1>&2
read -p "Enter end tag [${DEFAULT_NEW_TAG}]: " NEW_TAG
if [ -z "${NEW_TAG}" ]; then
NEW_TAG="${DEFAULT_NEW_TAG}"
fi
done
else
NEW_TAG=${2}
if [ -z "$(git tag --list "${NEW_TAG}")" ]; then
echo "ERROR: Tag '${NEW_TAG}' not found!" 1>&2
exit 1
fi
fi
CHANGE_LOG_YAML=$(mktemp)
echo "[]" > "${CHANGE_LOG_YAML}"
function map_type_to_kind() {
case "${1}" in
feat)
echo "added"
;;
fix)
echo "fixed"
;;
chore|style|test|ci|docs|refac)
echo "changed"
;;
revert)
echo "removed"
;;
sec)
echo "security"
;;
*)
echo "skip"
;;
esac
}
COMMIT_TITLES="$(git log --pretty=format:"%s" "${OLD_TAG}..${NEW_TAG}")"
echo "INFO: Generate change log entries from ${OLD_TAG} until ${NEW_TAG}"
while IFS= read -r line; do
if [[ "${line}" =~ ^([a-zA-Z]+)(\([^\)]+\))?\:\ (.+)$ ]]; then
TYPE="${BASH_REMATCH[1]}"
KIND=$(map_type_to_kind "${TYPE}")
if [ "${KIND}" == "skip" ]; then
continue
fi
DESC="${BASH_REMATCH[3]}"
echo "- ${KIND}: ${DESC}"
jq --arg kind "${KIND}" --arg description "${DESC}" '. += [ $ARGS.named ]' < "${CHANGE_LOG_YAML}" > "${CHANGE_LOG_YAML}.new"
mv "${CHANGE_LOG_YAML}.new" "${CHANGE_LOG_YAML}"
fi
done <<< "${COMMIT_TITLES}"
if [ -s "${CHANGE_LOG_YAML}" ]; then
yq --inplace --input-format json --output-format yml "${CHANGE_LOG_YAML}"
yq --no-colors --inplace ".annotations.\"artifacthub.io/changes\" |= loadstr(\"${CHANGE_LOG_YAML}\") | sort_keys(.)" "${CHART_FILE}"
else
echo "ERROR: Changelog file is empty: ${CHANGE_LOG_YAML}" 1>&2
exit 1
fi
rm "${CHANGE_LOG_YAML}"

View File

@@ -5,33 +5,51 @@ on:
tags:
- "*"
env:
# renovate: datasource=docker depName=alpine/helm
HELM_VERSION: "3.18.2"
jobs:
generate-chart-publish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: install tools
with:
fetch-depth: 0
- name: Install packages via apt
volker.raschek marked this conversation as resolved Outdated
Outdated
Review

This whole block can be omitted by using dpkg --print-architecture. You can create the content of an env var dynamically with it.

This whole block can be omitted by using `dpkg --print-architecture`. You can create the content of an env var dynamically with it.

the following option is required for add-annoations.sh:

with:  fetch-depth: 0 

Regarding the block Determine Architecture and Operating System to support x86_64 and ARM based CI nodes: Yes, it's true that we can define the content of an env var dynamically like example below:

- name: Determine Architecture and Operating System to support x86_64 and ARM based CI nodes  run: |  echo "ARCH=$(dpkg --print-architecture)" >> $GITHUB_ENV  echo "INFO: Set environment variable ARCH=${ARCH}" 

This would lead to an issue, that echo "INFO: Set environment variable ARCH=${ARCH}" will never print the stored value of ARCH, because the GITHUB_ENV is not than evaluated. I would prefer for debugging to log the value of ARCH and OS, but when you would prefer to reduce the CI commands I can remove the echo command as well to avoid the mentioned issue.

the following option is required for `add-annoations.sh`: ```yaml with: fetch-depth: 0 ``` Regarding the block `Determine Architecture and Operating System to support x86_64 and ARM based CI nodes`: Yes, it's true that we can define the content of an env var dynamically like example below: ```yaml - name: Determine Architecture and Operating System to support x86_64 and ARM based CI nodes run: | echo "ARCH=$(dpkg --print-architecture)" >> $GITHUB_ENV echo "INFO: Set environment variable ARCH=${ARCH}" ``` This would lead to an issue, that `echo "INFO: Set environment variable ARCH=${ARCH}"` will never print the stored value of `ARCH`, because the `GITHUB_ENV` is not than evaluated. I would prefer for debugging to log the value of `ARCH` and `OS`, but when you would prefer to reduce the CI commands I can remove the echo command as well to avoid the mentioned issue.
Outdated
Review

the following option is required for add-annoations.sh:

Didn't comment on that :)


What is the benefit of a dedicated step setting and printing the architecture?
arch and dpkg --print-architecture are standard practice, they don't need debugging or high verbosity. Their return is clear :)

> the following option is required for add-annoations.sh: Didn't comment on that :) --- What is the benefit of a dedicated step setting and printing the architecture? `arch` and `dpkg --print-architecture` are standard practice, they don't need debugging or high verbosity. Their return is clear :)
Outdated
Review

@volker.raschek The next release is currently blocked by this (in case you wanna get it in and not wait for the next one). LMK if you wanna finish here in the next days or if we should continue with the release.

@volker.raschek The next release is currently blocked by this (in case you wanna get it in and not wait for the next one). LMK if you wanna finish here in the next days or if we should continue with the release.

This may sound rather stupid and is due to my current work, but there are actually programs that return a different value at runtime. I don't want to accuse dpkg of this at all, but I have had experiences with other programs in the context of CI that have almost driven me to despair.

I have therefore got into the habit of relying as little as possible on the independent approach of programs in the CI. Especially when I am dependent on preparing an environment properly.

Since this seems superfluous for the project in the first place, I agree with you. I have therefore provided another commit that replaces OS and ARCH with a static value linux as well as dpkg commands, even if I can't endorse the latter.

This may sound rather stupid and is due to my current work, but there are actually programs that return a different value at runtime. I don't want to accuse `dpkg` of this at all, but I have had experiences with other programs in the context of CI that have almost driven me to despair. I have therefore got into the habit of relying as little as possible on the independent approach of programs in the CI. Especially when I am dependent on preparing an environment properly. Since this seems superfluous for the project in the first place, I agree with you. I have therefore provided another commit that replaces OS and ARCH with a static value `linux` as well as `dpkg` commands, even if I can't endorse the latter.
run: |
apt update -y
apt install -y curl ca-certificates curl gnupg
# helm
curl -O https://get.helm.sh/helm-v${{ env.HELM_VERSION }}-linux-amd64.tar.gz
tar -xzf helm-v${{ env.HELM_VERSION }}-linux-amd64.tar.gz
mv linux-amd64/helm /usr/local/bin/
rm -rf linux-amd64 helm-v${{ env.HELM_VERSION }}-linux-amd64.tar.gz
apt update --yes
volker.raschek marked this conversation as resolved Outdated
Outdated
Review

What about dpkg --print-architecture?

What about `dpkg --print-architecture`?

Good question, I can definitely change that. I mean, we won't be switching away from ubuntu that quickly.

Good question, I can definitely change that. I mean, we won't be switching away from ubuntu that quickly.
apt install --yes curl ca-certificates curl gnupg jq
- name: Install helm
env:
# renovate: datasource=docker depName=alpine/helm
HELM_VERSION: "3.18.2"
run: |
curl --fail --location --output /dev/stdout --silent --show-error https://get.helm.sh/helm-v${HELM_VERSION}-linux-$(dpkg --print-architecture).tar.gz | tar --extract --gzip --file /dev/stdin
mv linux-$(dpkg --print-architecture)/helm /usr/local/bin/
rm --force --recursive linux-$(dpkg --print-architecture) helm-v${HELM_VERSION}-linux-$(dpkg --print-architecture).tar.gz
helm version
# docker
- name: Install yq
env:
YQ_VERSION: v4.45.4 # renovate: datasource=github-releases depName=mikefarah/yq
run: |
curl --fail --location --output /dev/stdout --silent --show-error https://github.com/mikefarah/yq/releases/download/${YQ_VERSION}/yq_linux_$(dpkg --print-architecture).tar.gz | tar --extract --gzip --file /dev/stdin
mv yq_linux_$(dpkg --print-architecture) /usr/local/bin
rm --force --recursive yq_linux_$(dpkg --print-architecture) yq_linux_$(dpkg --print-architecture).tar.gz
yq --version
- name: Install docker-ce via apt
run: |
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
curl --fail --location --silent --show-error https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg
echo "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
apt update -y
apt install -y python3 python3-pip apt-transport-https docker-ce-cli
apt update --yes
apt install --yes python3 python3-pip apt-transport-https docker-ce-cli
- name: Install awscli
run: |
pip install awscli --break-system-packages
aws --version
- name: Import GPG key
id: import_gpg
@@ -41,6 +59,15 @@ jobs:
passphrase: ${{ secrets.GPGSIGN_PASSPHRASE }}
fingerprint: CC64B1DB67ABBEECAB24B6455FC346329753F4B0
- name: Add Artifacthub.io annotations
run: |
NEW_TAG="$(git tag --sort=-version:refname | head --lines 1)"
OLD_TAG="$(git tag --sort=-version:refname | head --lines 2 | tail --lines 1)"
.gitea/scripts/add-annotations.sh "${OLD_TAG}" "${NEW_TAG}"
- name: Print Chart.yaml
run: cat Chart.yaml
# Using helm gpg plugin as 'helm package --sign' has issues with gpg2: https://github.com/helm/helm/issues/2843
- name: package chart
run: |
@@ -51,7 +78,7 @@ jobs:
helm package --version "${GITHUB_REF#refs/tags/v}" ./
mkdir gitea
mv gitea*.tgz gitea/
curl -s -L -o gitea/index.yaml https://dl.gitea.com/charts/index.yaml
curl --fail --location --output gitea/index.yaml --silent --show-error https://dl.gitea.com/charts/index.yaml
helm repo index gitea/ --url https://dl.gitea.com/charts --merge gitea/index.yaml
# push to dockerhub
echo ${{ secrets.DOCKER_CHARTS_PASSWORD }} | helm registry login -u ${{ secrets.DOCKER_CHARTS_USERNAME }} registry-1.docker.io --password-stdin