100 lines
3.3 KiB
YAML
100 lines
3.3 KiB
YAML
name: Publish Helm Charts
|
|
|
|
on:
|
|
push:
|
|
branches:
|
|
- main
|
|
tags:
|
|
- "v*"
|
|
workflow_dispatch:
|
|
|
|
jobs:
|
|
helm-publish:
|
|
runs-on: builder-ubuntu-latest
|
|
steps:
|
|
- name: Checkout repository
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Install Helm
|
|
uses: azure/setup-helm@v4
|
|
with:
|
|
version: v3.14.0
|
|
|
|
- name: Package and push charts
|
|
env:
|
|
HELM_OCI_NAMESPACE: ${{ secrets.HELM_OCI_NAMESPACE }}
|
|
HELM_USERNAME: ${{ secrets.HELM_USERNAME }}
|
|
HELM_PASSWORD: ${{ secrets.HELM_PASSWORD }}
|
|
run: |
|
|
set -euo pipefail
|
|
|
|
CHART_LIST_FILE="charts.list"
|
|
if [[ ! -f "$CHART_LIST_FILE" ]]; then
|
|
echo "[helm_publish] Missing chart list file ${CHART_LIST_FILE}" >&2
|
|
exit 1
|
|
fi
|
|
|
|
mapfile -t CHART_DIRS < <(grep -v '^\s*#' "$CHART_LIST_FILE" | sed '/^\s*$/d')
|
|
if [[ ${#CHART_DIRS[@]} -eq 0 ]]; then
|
|
echo "[helm_publish] No chart directories listed in ${CHART_LIST_FILE}"
|
|
exit 0
|
|
fi
|
|
|
|
if [[ -z "${HELM_OCI_NAMESPACE:-}" ]]; then
|
|
echo "[helm_publish] HELM_OCI_NAMESPACE is required" >&2
|
|
exit 1
|
|
fi
|
|
|
|
HELM_REGISTRY_HOST="${HELM_OCI_NAMESPACE%%/*}"
|
|
HELM_REGISTRY_PROJECT="${HELM_OCI_NAMESPACE#*/}"
|
|
if [[ -z "$HELM_REGISTRY_PROJECT" || "$HELM_REGISTRY_PROJECT" == "$HELM_OCI_NAMESPACE" ]]; then
|
|
echo "[helm_publish] HELM_OCI_NAMESPACE must be host/project (got ${HELM_OCI_NAMESPACE})" >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [[ -n "${HELM_USERNAME:-}" && -n "${HELM_PASSWORD:-}" ]]; then
|
|
echo "[helm_publish] Logging into ${HELM_REGISTRY_HOST} as ${HELM_USERNAME}"
|
|
helm registry login "$HELM_REGISTRY_HOST" -u "$HELM_USERNAME" -p "$HELM_PASSWORD"
|
|
else
|
|
echo "[helm_publish] HELM_USERNAME/HELM_PASSWORD not set; assuming credentials already configured"
|
|
fi
|
|
|
|
status=0
|
|
for chart_dir in "${CHART_DIRS[@]}"; do
|
|
if [[ ! -f "$chart_dir/Chart.yaml" ]]; then
|
|
echo "[helm_publish] Skip ${chart_dir} (no Chart.yaml)"
|
|
continue
|
|
fi
|
|
echo "[helm_publish] Processing chart: ${chart_dir}"
|
|
|
|
helm dependency build "$chart_dir" || true
|
|
|
|
if ! helm lint "$chart_dir"; then
|
|
echo "[helm_publish] Warning: helm lint failed for ${chart_dir}"
|
|
fi
|
|
|
|
pkg_out_dir="$chart_dir/.packages"
|
|
mkdir -p "$pkg_out_dir"
|
|
|
|
pkg_path=$(helm package "$chart_dir" --destination "$pkg_out_dir" | awk '{print $NF}')
|
|
if [[ ! -f "$pkg_path" ]]; then
|
|
echo "[helm_publish] Failed to package ${chart_dir}" >&2
|
|
status=1
|
|
continue
|
|
fi
|
|
echo "[helm_publish] Packaged: ${pkg_path}"
|
|
|
|
if [[ "${DRY_RUN:-}" == "1" ]]; then
|
|
echo "[helm_publish] DRY_RUN enabled; skip push for ${pkg_path}"
|
|
continue
|
|
fi
|
|
|
|
echo "[helm_publish] Pushing ${pkg_path} to oci://${HELM_OCI_NAMESPACE}"
|
|
if ! helm push "$pkg_path" "oci://${HELM_OCI_NAMESPACE}"; then
|
|
echo "[helm_publish] Push failed for ${pkg_path}" >&2
|
|
status=1
|
|
fi
|
|
done
|
|
|
|
exit $status
|