[VOL-5495] Add helm-charts release GHA workflow

Signed-off-by: Eric Ball <eball@linuxfoundation.org>
Change-Id: I2c8848a8a785fd85975441e6320abbc33033bd72
diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml
new file mode 100644
index 0000000..43ac485
--- /dev/null
+++ b/.github/workflows/release.yaml
@@ -0,0 +1,103 @@
+---
+# SPDX-License-Identifier: Apache-2.0
+# Copyright 2026 The Linux Foundation
+
+name: voltha-helm-charts release
+
+# yamllint disable-line rule:truthy
+on:
+  workflow_dispatch:
+  push:
+    branches:
+      - master
+      - voltha-*
+
+permissions:
+  contents: write
+
+env:
+  PUBLISH_URL: "charts.lfbroadband.org"
+  OLD_REPO_DIR: "cord-charts-repo"
+  NEW_REPO_DIR: "chart_repo"
+  SYNC_TARGET_USER: "jenkins"
+  SYNC_TARGET_SERVER: "static.lfbroadband.org"
+
+jobs:
+  publish-helm-repo:
+    runs-on: ubuntu-latest
+    steps:
+      - name: Checkout charts source
+        # yamllint disable-line rule:line-length
+        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
+        with:
+          fetch-depth: 0
+
+      - name: Checkout published chart repository
+        # yamllint disable-line rule:line-length
+        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
+        with:
+          repository: opencord/cord-charts-repo
+          token: ${{ secrets.CORD_CHARTS_REPO_TOKEN }}
+          path: ${{ env.OLD_REPO_DIR }}
+          fetch-depth: 0
+
+      - name: Checkout helm-repo-tools
+        # yamllint disable-line rule:line-length
+        uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
+        with:
+          repository: opencord/helm-repo-tools
+          path: helm-repo-tools
+
+      - name: Set up Helm
+        uses: azure/setup-helm@9bc31f4ebc9c6b171d7bfbaa5d006ae7abdb4310 # v5.0.1
+
+      - name: Add external Helm repositories
+        run: |
+          set -eu -o pipefail
+          helm repo add stable https://charts.helm.sh/stable
+          helm repo add rook-release https://charts.rook.io/release
+          helm repo add cord https://charts.lfbroadband.org
+          helm repo add elastic https://helm.elastic.co
+          helm repo add kiwigrid https://kokuwaio.github.io/helm-charts
+
+      - name: Build/update chart repository index
+        run: ./helm-repo-tools/helmrepo.sh
+
+      - name: Compute release version
+        id: version
+        run: echo "version=$(date -u +%Y%m%dT%H%M%SZ)" >> "$GITHUB_OUTPUT"
+
+      - name: Commit, tag and push updated chart repository
+        id: publish
+        # Only commits when helmrepo.sh actually added/updated packages, and
+        # pushes both the commit and the date-based tag.
+        # yamllint disable-line rule:line-length
+        uses: stefanzweifel/git-auto-commit-action@4a55954c782fc1ea30b9056cd3e7a2b40ca8887d # v7.2.0
+        with:
+          repository: ${{ env.OLD_REPO_DIR }}
+          commit_message: >-
+            Update helm chart repository
+          commit_options: "--signoff"
+          commit_user_name: "VOLTHA Bot"
+          commit_user_email: "do-not-reply@opennetworking.org"
+          tagging_message: ${{ steps.version.outputs.version }}
+
+      - name: Configure SSH access to static server
+        if: steps.publish.outputs.changes_detected == 'true'
+        env:
+          SSH_PRIVATE_KEY: ${{ secrets.STATIC_LFBB_JENKINS_SSH_KEY }}
+        run: |
+          set -eu
+          mkdir -p ~/.ssh
+          chmod 700 ~/.ssh
+          printf '%s\n' "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa
+          chmod 600 ~/.ssh/id_rsa
+          ssh-keyscan -H "$SYNC_TARGET_SERVER" >> ~/.ssh/known_hosts 2>/dev/null
+
+      - name: Sync chart repository to static server
+        if: steps.publish.outputs.changes_detected == 'true'
+        run: |
+          set -eu -o pipefail
+          rsync -rvzh --delete-after --exclude=.git \
+            "${OLD_REPO_DIR}/" \
+            "${SYNC_TARGET_USER}@${SYNC_TARGET_SERVER}:/srv/sites/${PUBLISH_URL}/"