From 4b0b30d47b0fa21af0ca3b9c71da8e3fa501edc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dani=C3=ABl=20Groothuis?= Date: Thu, 23 Oct 2025 14:45:54 +0200 Subject: [PATCH] chore(bootstrap): Added base script for adding new apps to clusters --- init-app.sh | 44 ++++++++++++++++++++++++++++---------------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/init-app.sh b/init-app.sh index bd3ed26..b60156c 100755 --- a/init-app.sh +++ b/init-app.sh @@ -1,8 +1,9 @@ #!/usr/bin/env bash # init-app.sh # Creates clusters//apps/, renders templates (APPLICATION_NAME, DESCRIPTION, CLUSTER_NAME), -# appends the app at the end of the parent clusters//apps/kustomization.yaml list (removing trailing blank line if present), -# and stages changes in Git. +# appends the app to the end of the parent clusters//apps/kustomization.yaml list (removing trailing blank line if present), +# creates a placeholder under manifests//, +# and stages changes in Git (including the placeholder file). set -euo pipefail @@ -58,9 +59,12 @@ if ! echo "$DESCRIPTION" | grep -Eq '^[A-Za-z0-9 .,]+$'; then echo "Error: Description may only contain spaces, letters (A–Z, a–z), numbers (0–9), dots (.), and commas (,)." >&2; exit 1 fi +# Paths TARGET_DIR="${SCRIPT_DIR}/clusters/${CLUSTER_NAME}/apps/${APPLICATION_NAME}" +MANIFESTS_DIR="${SCRIPT_DIR}/manifests/${CLUSTER_NAME}/${APPLICATION_NAME}" +PARENT_KUSTOMIZATION="${SCRIPT_DIR}/clusters/${CLUSTER_NAME}/apps/kustomization.yaml" -# Abort if target directory already exists +# Abort if clusters target already exists if [[ -d "$TARGET_DIR" ]]; then echo "Error: Directory already exists: $TARGET_DIR" >&2; exit 1 fi @@ -77,8 +81,9 @@ for f in "$APP_PROJECT_SRC" "$APPLICATION_SRC" "$KUSTOMIZATION_SRC"; do done if [[ "$missing" == true ]]; then exit 1; fi -# Create target directory +# Create target directories mkdir -p "$TARGET_DIR" +mkdir -p "$MANIFESTS_DIR" # Prepare safe replacements safe_app_name="${APPLICATION_NAME//\\/\\\\}"; safe_app_name="${safe_app_name//&/\\&}" @@ -109,39 +114,46 @@ mv "$tmp2" "$APPLICATION_DEST" KUSTOMIZATION_DEST="${TARGET_DIR}/kustomization.yaml" cp "$KUSTOMIZATION_SRC" "$KUSTOMIZATION_DEST" +# Create placeholder in manifests// +PLACEHOLDER_FILE="${MANIFESTS_DIR}/.placeholder" +if [[ ! -f "$PLACEHOLDER_FILE" ]]; then + printf "Placeholder for %s/%s\n" "$CLUSTER_NAME" "$APPLICATION_NAME" > "$PLACEHOLDER_FILE" +fi + echo "Created: $TARGET_DIR" echo "Wrote: $APP_PROJECT_DEST (APPLICATION_NAME='${APPLICATION_NAME}', DESCRIPTION set)" echo "Wrote: $APPLICATION_DEST (APPLICATION_NAME='${APPLICATION_NAME}', CLUSTER_NAME='${CLUSTER_NAME}')" echo "Wrote: $KUSTOMIZATION_DEST (copied as-is)" +echo "Created: $PLACEHOLDER_FILE" # Parent kustomization.yaml: remove trailing blank line if present, then append new item -PARENT_KUSTOMIZATION="${SCRIPT_DIR}/clusters/${CLUSTER_NAME}/apps/kustomization.yaml" if [[ ! -f "$PARENT_KUSTOMIZATION" ]]; then echo "Error: Parent kustomization not found: ${PARENT_KUSTOMIZATION}" >&2; exit 1 fi -# 1) If the last line is empty, delete it (BSD sed) -# This prints all lines except a final empty line at EOF. -# Explanation: -# - $: matches the last line -# - /^$/: last line is empty -# - d: delete that line +# Remove trailing empty last line (BSD sed) sed -i '' -e '${/^$/d;}' "$PARENT_KUSTOMIZATION" -# 2) Append the new application line at the end (with two-space indent to match your file) +# Append the new application entry at end (two-space indent) printf " - %s\n" "$APPLICATION_NAME" >> "$PARENT_KUSTOMIZATION" echo "Updated parent kustomization.yaml: appended '${APPLICATION_NAME}' at end of resources list." -# Stage changes in Git +# Stage changes in Git (including placeholder file) if git -C "$SCRIPT_DIR" rev-parse --is-inside-work-tree >/dev/null 2>&1; then REPO_ROOT="$(git -C "$SCRIPT_DIR" rev-parse --show-toplevel)" REL_TARGET="${TARGET_DIR#$REPO_ROOT/}" REL_PARENT="${PARENT_KUSTOMIZATION#$REPO_ROOT/}" - git -C "$REPO_ROOT" add "$REL_TARGET" "$REL_PARENT" - echo "Git: staged new directory/files and parent kustomization: $REL_TARGET, $REL_PARENT" + REL_MANIFESTS_DIR="${MANIFESTS_DIR#$REPO_ROOT/}" + REL_PLACEHOLDER="${PLACEHOLDER_FILE#$REPO_ROOT/}" + git -C "$REPO_ROOT" add "$REL_TARGET" "$REL_PARENT" "$REL_MANIFESTS_DIR" "$REL_PLACEHOLDER" + echo "Git: staged new app dir, parent kustomization, manifests dir, and placeholder:" + echo " $REL_TARGET" + echo " $REL_PARENT" + echo " $REL_MANIFESTS_DIR" + echo " $REL_PLACEHOLDER" echo "Next: commit with a message, e.g.:" - echo " git -C \"$REPO_ROOT\" commit -m \"feat(${CLUSTER_NAME}): add ${APPLICATION_NAME} app (\"${DESCRIPTION}\") and update kustomization\"" + echo " git -C \"$REPO_ROOT\" commit -m \"feat(${CLUSTER_NAME}): add ${APPLICATION_NAME} app (\"${DESCRIPTION}\") and manifests placeholder; update kustomization\"" else echo "Note: Not inside a Git repository (no .git found). Skipping git add." fi