name: Release Helm Chart to GitHub Pages run-name: Release Helm Chart ${{ inputs.chart_version }} # Triggered automatically when publish-docker.yml completes, or manually # We wait for Docker publish because the smoke test pulls the Docker image on: workflow_run: workflows: ["Publish Docker Images"] types: [completed] workflow_dispatch: inputs: chart_version: description: "Chart version (e.g., 4.28.0)" required: true permissions: contents: write jobs: release: runs-on: ubuntu-latest # Only run if workflow_dispatch OR if workflow_run completed successfully if: ${{ github.event_name == 'workflow_dispatch' || github.event.workflow_run.conclusion == 'success' }} steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Configure Git run: | git config user.name "$GITHUB_ACTOR" git config user.email "$GITHUB_ACTOR@users.noreply.github.com" - name: Install Helm uses: azure/setup-helm@v4 with: version: v3.15.2 - name: Install helm-docs run: | cd /tmp wget https://github.com/norwoodj/helm-docs/releases/download/v1.14.2/helm-docs_1.14.2_Linux_x86_64.tar.gz tar -xzf helm-docs_1.14.2_Linux_x86_64.tar.gz sudo mv helm-docs /usr/local/bin/ helm-docs --version - name: Generate chart documentation run: | cd deploy/helm/pulse helm-docs # Commit if README changed if ! git diff --quiet README.md; then git config user.name "$GITHUB_ACTOR" git config user.email "$GITHUB_ACTOR@users.noreply.github.com" git add README.md git commit -m "Auto-update Helm chart documentation" git pull --rebase origin main git push origin main fi cd ../../.. - name: Determine chart version id: version env: GH_TOKEN: ${{ github.token }} run: | if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then # Manual dispatch - use input directly VERSION="${{ inputs.chart_version }}" else # workflow_run trigger - extract version from the triggering workflow RUN_ID="${{ github.event.workflow_run.id }}" echo "Extracting version from workflow run ${RUN_ID}..." WORKFLOW_DATA=$(gh api repos/${{ github.repository }}/actions/runs/${RUN_ID}) TAG=$(echo "$WORKFLOW_DATA" | jq -r '.display_title' | grep -oP 'v?\d+\.\d+\.\d+(-[a-zA-Z]+\.\d+)?' || echo "") if [ -z "$TAG" ]; then echo "::error::Could not extract version from workflow_run" exit 1 fi # Remove leading 'v' if present VERSION="${TAG#v}" fi echo "version=$VERSION" >> "$GITHUB_OUTPUT" echo "Chart version: $VERSION" - name: Update Chart.yaml version run: | VERSION="${{ steps.version.outputs.version }}" sed -i "s/^version: .*/version: $VERSION/" deploy/helm/pulse/Chart.yaml sed -i "s/^appVersion: .*/appVersion: \"$VERSION\"/" deploy/helm/pulse/Chart.yaml # Commit if Chart.yaml changed if ! git diff --quiet deploy/helm/pulse/Chart.yaml; then git config user.name "$GITHUB_ACTOR" git config user.email "$GITHUB_ACTOR@users.noreply.github.com" git add deploy/helm/pulse/Chart.yaml git commit -m "Auto-update Helm chart version to $VERSION" git pull --rebase origin main git push origin main fi - name: Validate Helm chart run: | # Strict linting helm lint deploy/helm/pulse --strict # Template validation with minimal values helm template pulse deploy/helm/pulse --set persistence.enabled=false > /dev/null # Template validation with common overrides helm template pulse deploy/helm/pulse \ --set ingress.enabled=true \ --set ingress.hosts[0].host=pulse.example.com \ --set agent.enabled=true > /dev/null echo "✓ Chart validation passed" - name: Smoke test with kind run: | # Install kind curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.20.0/kind-linux-amd64 chmod +x ./kind sudo mv ./kind /usr/local/bin/kind # Create cluster kind create cluster --name pulse-test --wait 5m # Install chart helm install pulse deploy/helm/pulse \ --set persistence.enabled=false \ --set server.secretEnv.create=true \ --set server.secretEnv.data.API_TOKENS=test-token \ --wait --timeout 5m # Verify deployment kubectl wait --for=condition=ready pod -l app.kubernetes.io/name=pulse --timeout=180s || (kubectl describe pods -l app.kubernetes.io/name=pulse && exit 1) kubectl get pods -l app.kubernetes.io/name=pulse # Test upgrade helm upgrade pulse deploy/helm/pulse \ --set persistence.enabled=false \ --set server.secretEnv.create=true \ --set server.secretEnv.data.API_TOKENS=test-token \ --wait --timeout 5m # Cleanup kind delete cluster --name pulse-test echo "✓ Smoke test passed" - name: Run chart-releaser uses: helm/chart-releaser-action@v1.6.0 with: charts_dir: deploy/helm config: cr.yaml skip_existing: true env: CR_TOKEN: "${{ secrets.GITHUB_TOKEN }}" CR_RELEASE_NAME_TEMPLATE: "helm-chart-{{ .Version }}" CR_MAKE_RELEASE_LATEST: false - name: Mark Helm chart release as pre-release (avoid latest override) env: GITHUB_TOKEN: ${{ github.token }} run: | TAG="helm-chart-${{ steps.version.outputs.version }}" gh release edit "$TAG" --prerelease --latest=false || echo "No helm chart release to edit for $TAG"