#!/usr/bin/env bash set -euo pipefail PROG="init_gitea" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # shellcheck disable=SC1090 source "$SCRIPT_DIR/knoe_cfg.sh" MODE="$(knoe_normalize_mode "${KNOE_MODE:-${DEPLOYMENT_MODE:-k3d}}")" NAMESPACE="${GITEA_NAMESPACE:-}" CFG_PATH="" FORCE=0 usage() { cat < Deployment mode (default: ${MODE:-k3d}) -n, --namespace Target namespace (default: gitea) -c, --config Path to knoe.cfg (defaults to detected) --force Delete existing release before deploy --help Show this help Behavior: - Prefers Helm install/upgrade (gitea-charts/gitea). - Falls back to applying a generated Deployment/Service/Ingress manifest. - If a local registry is enabled, the image is mirrored there first. EOF } die() { echo "[ERROR] $*" >&2; exit 2; } log() { echo "[INFO] $*"; } warn() { echo "[WARN] $*" >&2; } while [[ $# -gt 0 ]]; do case "$1" in --mode) MODE="$(knoe_normalize_mode "${2:-}")"; shift 2 ;; --mode=*) MODE="$(knoe_normalize_mode "${1#*=}")"; shift 1 ;; -n|--namespace) NAMESPACE="${2:-}"; shift 2 ;; --namespace=*) NAMESPACE="${1#*=}"; shift 1 ;; -c|--config) CFG_PATH="${2:-}"; shift 2 ;; --config=*) CFG_PATH="${1#*=}"; shift 1 ;; --force) FORCE=1; shift ;; -h|--help) usage; exit 0 ;; *) break ;; esac done # Resolve config path and namespace defaults from knoe.cfg when present if [[ -z "$CFG_PATH" && -n "${KNOE_CONF:-}" && -f "${KNOE_CONF}/knoe.cfg" ]]; then CFG_PATH="${KNOE_CONF}/knoe.cfg" elif [[ -z "$CFG_PATH" && -f "$SCRIPT_DIR/../conf/knoe.cfg" ]]; then CFG_PATH="$SCRIPT_DIR/../conf/knoe.cfg" fi if [[ -z "$NAMESPACE" && -n "$CFG_PATH" ]]; then maybe_ns="$(_knoe_cfg_extract_key "$CFG_PATH" "GITOPS_NAMESPACE")" [[ -z "$maybe_ns" ]] && maybe_ns="$(_knoe_cfg_extract_key "$CFG_PATH" "GITEA_NAMESPACE")" NAMESPACE="$maybe_ns" fi NAMESPACE="${NAMESPACE:-gitea}" export GITEA_NAMESPACE="$NAMESPACE" case "$MODE" in k3d|k3s|k8s|local) ;; *) die "Unsupported mode '$MODE' (use k3d, k3s, k8s, or local)" ;; esac export KNOE_MODE="$MODE" command -v kubectl >/dev/null || die "kubectl not found" command -v helm >/dev/null || warn "helm not found — will use manifest fallback" kubectl get ns "$NAMESPACE" >/dev/null 2>&1 || kubectl create namespace "$NAMESPACE" >/dev/null 2>&1 CHART_REPO="https://dl.gitea.com/charts" CHART_NAME="gitea-charts/gitea" RELEASE_NAME="gitea" IMAGE_REPO_DEFAULT="gitea/gitea" IMAGE_TAG="${GITEA_IMAGE_TAG:-1.22.3}" IMAGE_REPO="$IMAGE_REPO_DEFAULT" # Optional reset if [[ "$FORCE" -eq 1 ]]; then warn "--force specified; removing existing Gitea resources in namespace $NAMESPACE" if command -v helm >/dev/null 2>&1; then helm uninstall "$RELEASE_NAME" -n "$NAMESPACE" >/dev/null 2>&1 || true fi kubectl -n "$NAMESPACE" delete deploy/gitea svc/gitea-http svc/gitea-ssh ingress/gitea >/dev/null 2>&1 || true fi # Mirror to local registry if enabled if _knoe_local_registry_enabled && command -v docker >/dev/null; then HOST_REG="${LOCAL_REGISTRY:-${PROLE_LOCAL_REGISTRY:-}}" INTERNAL_REG="${LOCAL_REGISTRY_INTERNAL:-${PROLE_LOCAL_REGISTRY_INTERNAL:-}}" if [[ -n "$HOST_REG" ]]; then HOST_IMG="${HOST_REG}/${IMAGE_REPO_DEFAULT}" log "Pulling ${IMAGE_REPO_DEFAULT}:${IMAGE_TAG}" docker pull "${IMAGE_REPO_DEFAULT}:${IMAGE_TAG}" >/dev/null log "Tagging ${HOST_IMG}:${IMAGE_TAG}" docker tag "${IMAGE_REPO_DEFAULT}:${IMAGE_TAG}" "${HOST_IMG}:${IMAGE_TAG}" log "Pushing ${HOST_IMG}:${IMAGE_TAG}" docker push "${HOST_IMG}:${IMAGE_TAG}" >/dev/null || warn "Push to local registry failed; continuing with upstream image" if [[ -n "$INTERNAL_REG" ]]; then IMAGE_REPO="${INTERNAL_REG}/gitea/gitea" else IMAGE_REPO="${HOST_REG}/gitea/gitea" fi fi fi deploy_with_helm() { command -v helm >/dev/null 2>&1 || return 1 helm repo add gitea-charts "$CHART_REPO" >/dev/null 2>&1 || true helm repo update >/dev/null 2>&1 || true # Minimal config: NodePort or ClusterIP + Ingress depending on environment. # Avoid heavy persistence defaults; users can override via values later. helm upgrade --install "$RELEASE_NAME" "$CHART_NAME" \ -n "$NAMESPACE" \ --set image.repository="$IMAGE_REPO" \ --set image.tag="$IMAGE_TAG" \ --set service.http.type=ClusterIP \ --set service.ssh.type=ClusterIP \ --set gitea.admin.username="${GITEA_ADMIN_USER:-gitea_admin}" \ --set gitea.admin.password="${GITEA_ADMIN_PASSWORD:-gitea_admin}" \ --set gitea.admin.email="${GITEA_ADMIN_EMAIL:-gitea_admin@example.local}" \ --wait --timeout 10m } apply_manifest_fallback() { warn "Helm unavailable; applying fallback manifest" cat <