Files
feedc0de 9933f9904a
Validate, publish and deploy Gramps Web / validate (push) Failing after 29m16s
Validate, publish and deploy Gramps Web / publish (push) Skipped
Validate, publish and deploy Gramps Web / deploy (push) Skipped
Introduce helm chart and CI and CD
2026-09-06 11:26:19 +02:00

79 lines
2.9 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
export HELM_DRIVER=${HELM_DRIVER:-configmap}
project_dir=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)
workdir=$(mktemp --directory)
trap 'rm -rf "${workdir}"' EXIT HUP INT TERM
namespace=${NAMESPACE:-gramps}
for key in app-secret-key user-database-uri search-index-database-uri \
oidc-client-secret aws-access-key-id aws-secret-access-key; do
kubectl --namespace "${namespace}" get secret gramps-runtime \
--output="jsonpath={.data.${key}}" | grep -q . \
|| { echo "gramps-runtime is missing ${key}" >&2; exit 1; }
done
for item in gramps-postgresql:postgres-password gramps-postgresql:password \
gramps-valkey:valkey-password; do
secret=${item%%:*}
key=${item#*:}
kubectl --namespace "${namespace}" get secret "${secret}" \
--output="jsonpath={.data.${key}}" | grep -q . \
|| { echo "${secret} is missing ${key}" >&2; exit 1; }
done
for claim in data-postgresql-0 grampsweb-data; do
phase=$(kubectl --namespace "${namespace}" get pvc "${claim}" \
--output=jsonpath='{.status.phase}')
[[ "${phase}" == Bound ]] || { echo "PVC ${claim} is ${phase}" >&2; exit 1; }
done
dependencies=("${project_dir}"/charts/*.tgz)
if (( ${#dependencies[@]} < 2 )); then
helm dependency build --skip-refresh "${project_dir}"
fi
helm template gramps "${project_dir}" --namespace "${namespace}" \
--values "${project_dir}/values-arschrock.yaml" > "${workdir}/rendered.yaml"
kubectl --namespace "${namespace}" get statefulset postgresql valkey-primary valkey-replicas \
--output=json > "${workdir}/live.json"
python3 - "${workdir}/rendered.yaml" "${workdir}/live.json" <<'PY'
import json
import sys
import yaml
rendered = {
item["metadata"]["name"]: item
for item in yaml.safe_load_all(open(sys.argv[1], encoding="utf-8"))
if item and item.get("kind") == "StatefulSet"
}
live = {
item["metadata"]["name"]: item
for item in json.load(open(sys.argv[2], encoding="utf-8"))["items"]
}
for name in ("postgresql", "valkey-primary", "valkey-replicas"):
expected = rendered[name]["spec"]
current = live[name]["spec"]
checks = {
"selector": (expected["selector"], current["selector"]),
"serviceName": (expected["serviceName"], current["serviceName"]),
"volumeClaimTemplates": (
[item["metadata"]["name"] for item in expected.get("volumeClaimTemplates", [])],
[item["metadata"]["name"] for item in current.get("volumeClaimTemplates", [])],
),
}
for field, (wanted, found) in checks.items():
if wanted != found:
raise SystemExit(f"{name}: immutable {field} differs: wanted={wanted!r} live={found!r}")
print("Live StatefulSet immutable fields match the parent chart.")
PY
helm upgrade --install gramps "${project_dir}" \
--namespace "${namespace}" \
--values "${project_dir}/values-arschrock.yaml" \
--take-ownership --dry-run=server --hide-secret
echo "Migration preflight passed."