diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml index 211098d..8cca81c 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yaml @@ -32,9 +32,128 @@ jobs: env: GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" + - name: Install yq + run: | + # renovate: datasource=github-releases depName=mikefarah/yq + YQ_VERSION="4.44.3" + wget -q https://github.com/mikefarah/yq/releases/download/v${YQ_VERSION}/yq_linux_amd64 -O yq + chmod +x yq + sudo mv yq /usr/local/bin/yq + yq --version + - name: Run chart-releaser uses: helm/chart-releaser-action@cae68fefc6b5f367a0275617c9f83181ba54714f # v1.7.0 env: CR_TOKEN: "${{ secrets.GITHUB_TOKEN }}" with: config: .github/cr.yaml + + - name: Extract chart metadata and format release notes + id: release-notes + run: | + CHART_PATH="charts/jellyfin" + CHART_NAME=$(yq eval '.name' "${CHART_PATH}/Chart.yaml") + CHART_VERSION=$(yq eval '.version' "${CHART_PATH}/Chart.yaml") + APP_VERSION=$(yq eval '.appVersion' "${CHART_PATH}/Chart.yaml") + RELEASE_TAG="${CHART_NAME}-${CHART_VERSION}" + + echo "tag=${RELEASE_TAG}" >> $GITHUB_OUTPUT + + CHANGELOG_RAW=$(yq eval '.annotations."artifacthub.io/changes"' "${CHART_PATH}/Chart.yaml") + + # Build changelog section + CHANGELOG_SECTION="" + if [ "$CHANGELOG_RAW" != "null" ] && [ -n "$CHANGELOG_RAW" ]; then + CHANGELOG_SECTION="## What's Changed + + " + TEMP_FILE=$(mktemp) + SEPARATOR="|" + echo "$CHANGELOG_RAW" | yq eval ".[] | .kind + \"${SEPARATOR}\" + .description" - > "$TEMP_FILE" + + while IFS="${SEPARATOR}" read -r kind description; do + case "$kind" in + "added") + emoji="✨" + label="Added" + ;; + "changed") + emoji="🔄" + label="Changed" + ;; + "deprecated") + emoji="⚠️" + label="Deprecated" + ;; + "removed") + emoji="🗑️" + label="Removed" + ;; + "fixed") + emoji="🐛" + label="Fixed" + ;; + "security") + emoji="🔒" + label="Security" + ;; + *) + emoji="📝" + label="Changed" + ;; + esac + CHANGELOG_SECTION="${CHANGELOG_SECTION}- ${emoji} **${label}**: ${description} + " + done < "$TEMP_FILE" + + rm -f "$TEMP_FILE" + CHANGELOG_SECTION="${CHANGELOG_SECTION} + " + fi + + # Build release body + RELEASE_BODY="## Jellyfin Helm Chart v${CHART_VERSION} + + **Application Version**: \`${APP_VERSION}\` + + ${CHANGELOG_SECTION}## Installation + + Add the Jellyfin Helm repository: + + \`\`\`bash + helm repo add jellyfin https://jellyfin.github.io/jellyfin-helm + helm repo update + \`\`\` + + Install the chart: + + \`\`\`bash + helm install my-jellyfin jellyfin/jellyfin --version ${CHART_VERSION} + \`\`\` + + ## Upgrade + + \`\`\`bash + helm upgrade my-jellyfin jellyfin/jellyfin --version ${CHART_VERSION} + \`\`\` + + --- + + 📦 **Chart**: \`jellyfin\` v${CHART_VERSION} + 🎬 **Jellyfin**: v${APP_VERSION} + 📖 **Documentation**: https://github.com/jellyfin/jellyfin-helm/blob/main/charts/jellyfin/README.md + " + + # Save to file + echo "$RELEASE_BODY" > release-notes.md + + - name: Update release notes + env: + GH_TOKEN: "${{ secrets.GITHUB_TOKEN }}" + run: | + RELEASE_TAG="${{ steps.release-notes.outputs.tag }}" + + # Update release notes + gh release edit "$RELEASE_TAG" --notes-file release-notes.md + + echo "✅ Updated release notes for $RELEASE_TAG" diff --git a/charts/jellyfin/Chart.yaml b/charts/jellyfin/Chart.yaml index 6f24db1..e891c95 100644 --- a/charts/jellyfin/Chart.yaml +++ b/charts/jellyfin/Chart.yaml @@ -14,3 +14,5 @@ annotations: artifacthub.io/changes: | - kind: added description: Add persistence.cache configuration for dedicated cache volume support + - kind: added + description: Add revisionHistoryLimit parameter to control rollback history retention (defaults to 3 instead of Kubernetes default 10) diff --git a/charts/jellyfin/templates/NOTES.txt b/charts/jellyfin/templates/NOTES.txt index 4853179..9dcd130 100644 --- a/charts/jellyfin/templates/NOTES.txt +++ b/charts/jellyfin/templates/NOTES.txt @@ -45,3 +45,14 @@ Cache Volume: {{- if and .Values.persistence.cache.enabled (eq .Values.persistence.cache.type "hostPath") }} ⚠ WARNING: Using hostPath for cache - ensure {{ .Values.persistence.cache.hostPath }} exists on the node {{- end }} +Deployment Configuration: + Revision History Limit: {{ .Values.revisionHistoryLimit }} + {{- $limit := int .Values.revisionHistoryLimit }} + {{- if eq $limit 0 }} + ⚠ WARNING: Revision history is disabled - rollback will not be possible! + {{- else if eq $limit 1 }} + ⚠ NOTE: Only 1 revision kept - limited rollback capability + {{- else }} + You can rollback to any of the last {{ .Values.revisionHistoryLimit }} revisions using: + kubectl rollout undo deployment/{{ include "jellyfin.fullname" . }} --namespace {{ .Release.Namespace }} + {{- end }} diff --git a/charts/jellyfin/templates/deployment.yaml b/charts/jellyfin/templates/deployment.yaml index 3e1c0ec..db0b023 100644 --- a/charts/jellyfin/templates/deployment.yaml +++ b/charts/jellyfin/templates/deployment.yaml @@ -14,6 +14,9 @@ spec: {{- toYaml . | trim | nindent 4 }} {{- end }} replicas: {{ .Values.replicaCount }} + {{- with .Values.revisionHistoryLimit }} + revisionHistoryLimit: {{ . }} + {{- end }} selector: matchLabels: {{- include "jellyfin.selectorLabels" . | nindent 6 }} diff --git a/charts/jellyfin/tests/revision_history_test.yaml b/charts/jellyfin/tests/revision_history_test.yaml new file mode 100644 index 0000000..0a2b903 --- /dev/null +++ b/charts/jellyfin/tests/revision_history_test.yaml @@ -0,0 +1,41 @@ +suite: test revision history limit +templates: + - deployment.yaml +tests: + - it: should set revisionHistoryLimit to 3 by default + asserts: + - equal: + path: spec.revisionHistoryLimit + value: 3 + + - it: should allow custom revisionHistoryLimit + set: + revisionHistoryLimit: 5 + asserts: + - equal: + path: spec.revisionHistoryLimit + value: 5 + + - it: should allow revisionHistoryLimit of 0 + set: + revisionHistoryLimit: 0 + asserts: + - equal: + path: spec.revisionHistoryLimit + value: 0 + + - it: should allow revisionHistoryLimit of 1 + set: + revisionHistoryLimit: 1 + asserts: + - equal: + path: spec.revisionHistoryLimit + value: 1 + + - it: should allow large revisionHistoryLimit + set: + revisionHistoryLimit: 100 + asserts: + - equal: + path: spec.revisionHistoryLimit + value: 100 diff --git a/charts/jellyfin/values.yaml b/charts/jellyfin/values.yaml index d4fdf8a..f4d91ff 100644 --- a/charts/jellyfin/values.yaml +++ b/charts/jellyfin/values.yaml @@ -4,6 +4,12 @@ # -- Number of Jellyfin replicas to start. Should be left at 1. replicaCount: 1 +# -- Number of old ReplicaSets to retain for rollback history. +# Set to 0 to disable revision history (not recommended). +# If not specified, Kubernetes defaults to 10. +# See: https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#revision-history-limit +revisionHistoryLimit: 3 + # -- Image pull secrets to authenticate with private repositories. # See: https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/ imagePullSecrets: []