Random_scripts/automation/docker/update-and-build.sh

233 lines
7.4 KiB
Bash

#!/usr/bin/env bash
set -euo pipefail
# ============================================================================
# update-and-build.sh
# Location: /docker/develop
#
# Purpose:
# - Laat je een branch kiezen (of via BRANCH= meegeven)
# - Onthoudt de laatst gebruikte branch in .last-branch in de repo root
# - Commit en pusht altijd lokale wijzigingen (AUTO_COMMIT standaard aan)
# - Haalt daarna updates op uit origin/<branch> (git pull --rebase)
# - Roept daarna het build-script in de repo aan (build-and-push.sh) met de
# gekozen bump type (1/2/3/t)
#
# Gebruik:
# BRANCH=<branch> sudo bash /docker/develop/update-and-build.sh [bump]
# (BRANCH optioneel; zonder krijg je een menu met keuze, of kun je
# handmatig een nieuwe branchnaam intypen)
# ============================================================================
REPO_DIR="/docker/develop/backup-v9" # pas aan indien nodig
BUILD_SCRIPT_NAME="build-and-push.sh"
LAST_BRANCH_FILE=".last-branch" # wordt in REPO_DIR opgeslagen
# Omgeving: optionele flags voor non-interactief gebruik
AUTO_COMMIT="${AUTO_COMMIT:-1}" # 1 = altijd committen als er wijzigingen zijn
AUTO_PUSH="${AUTO_PUSH:-1}" # 1 = push naar origin/<branch> na commit
AUTO_CREATE_BRANCH="${AUTO_CREATE_BRANCH:-1}" # 1 = nieuwe branch lokaal maken als hij nog niet bestaat
# Commit message (optioneel prefix via COMMIT_MSG_PREFIX)
DEFAULT_COMMIT_MSG_PREFIX="${COMMIT_MSG_PREFIX:-Auto-commit local changes before build}"
# --- Input: bump type --------------------------------------------------------
BUMP_TYPE="${1:-}"
if [[ -z "${BUMP_TYPE}" ]]; then
echo "Select bump type: [1] patch, [2] minor, [3] major, [t] test (default: t)"
read -r BUMP_TYPE
BUMP_TYPE="${BUMP_TYPE:-t}"
fi
if [[ "$BUMP_TYPE" != "1" && "$BUMP_TYPE" != "2" && "$BUMP_TYPE" != "3" && "$BUMP_TYPE" != "t" ]]; then
echo "[ERROR] Invalid bump type '$BUMP_TYPE' (use 1, 2, 3, or t)."
exit 1
fi
# --- Naar repo gaan ----------------------------------------------------------
echo "[INFO] Switching to repo: $REPO_DIR"
cd "$REPO_DIR"
# --- Fetch alle branches -----------------------------------------------------
echo "[INFO] Fetching all branches (origin)..."
git fetch --all --prune
# Lijst met origin branches (zonder origin/ prefix, HEAD gefilterd)
mapfile -t BRANCHES < <(
git for-each-ref \
--format='%(refname:short)' refs/remotes/origin \
| sed 's|^origin/||' \
| grep -vE '^HEAD$' \
| sort -u
)
# Fallback: als er geen origin branches zijn, kijk dan naar lokale branches
if [[ "${#BRANCHES[@]}" -eq 0 ]]; then
mapfile -t BRANCHES < <(
git for-each-ref \
--format='%(refname:short)' refs/heads \
| sort -u
)
fi
if [[ "${#BRANCHES[@]}" -eq 0 ]]; then
echo "[ERROR] Geen branches gevonden (noch lokaal, noch bij origin)."
exit 1
fi
# --- Bepaal default branch/last branch ---------------------------------------
ENV_BRANCH="${BRANCH:-}"
LAST_BRANCH=""
if [[ -f "$LAST_BRANCH_FILE" ]]; then
LAST_BRANCH="$(<"$LAST_BRANCH_FILE")"
fi
CURRENT_BRANCH="$(git branch --show-current 2>/dev/null || true)"
DEFAULT_BRANCH="$CURRENT_BRANCH"
if [[ -z "$DEFAULT_BRANCH" ]]; then
if [[ -n "$LAST_BRANCH" ]]; then
DEFAULT_BRANCH="$LAST_BRANCH"
else
DEFAULT_BRANCH="${BRANCHES[0]}"
fi
fi
CHOSEN_BRANCH=""
# 1) Als BRANCH= in de omgeving is gezet, gebruik die direct
if [[ -n "$ENV_BRANCH" ]]; then
CHOSEN_BRANCH="$ENV_BRANCH"
echo "[INFO] Branch via BRANCH env: $CHOSEN_BRANCH"
else
echo "[INFO] Beschikbare bestaande branches:"
i=1
DEFAULT_INDEX=1
for b in "${BRANCHES[@]}"; do
if [[ "$b" == "$DEFAULT_BRANCH" ]]; then
echo " [$i] $b (default)"
DEFAULT_INDEX="$i"
else
echo " [$i] $b"
fi
((i++))
done
echo
echo "Je kunt een nummer kiezen voor een bestaande branch,"
echo "of een nieuwe branch-naam intypen."
read -r -p "Selecteer nummer of typ nieuwe branch-naam (leeg = default): " choice
# Leeg = default branch
if [[ -z "$choice" ]]; then
CHOSEN_BRANCH="$DEFAULT_BRANCH"
echo "[INFO] Default branch geselecteerd: $CHOSEN_BRANCH"
# Als gebruiker een nummer kiest
elif [[ "$choice" =~ ^[0-9]+$ ]] && (( choice >= 1 && choice <= ${#BRANCHES[@]} )); then
CHOSEN_BRANCH="${BRANCHES[choice-1]}"
echo "[INFO] Bestaande branch gekozen: $CHOSEN_BRANCH"
else
# Anders: dit is een nieuwe branch
CHOSEN_BRANCH="$choice"
echo "[INFO] Nieuwe branch gekozen: $CHOSEN_BRANCH (wordt aangemaakt als hij nog niet bestaat)"
fi
fi
# Schrijf gekozen branch weg als last-branch
echo "$CHOSEN_BRANCH" > "$LAST_BRANCH_FILE"
# --- Branch checkout / aanmaken ----------------------------------------------
REMOTE_REF_EXISTS=0
if git show-ref --verify --quiet "refs/remotes/origin/$CHOSEN_BRANCH"; then
REMOTE_REF_EXISTS=1
fi
LOCAL_REF_EXISTS=0
if git show-ref --verify --quiet "refs/heads/$CHOSEN_BRANCH"; then
LOCAL_REF_EXISTS=1
fi
if [[ "$LOCAL_REF_EXISTS" -eq 1 ]]; then
echo "[INFO] Checkout bestaande lokale branch: $CHOSEN_BRANCH"
git switch "$CHOSEN_BRANCH"
else
if [[ "$REMOTE_REF_EXISTS" -eq 1 ]]; then
echo "[INFO] Nieuwe lokale branch maken vanaf origin/$CHOSEN_BRANCH"
git switch -c "$CHOSEN_BRANCH" --track "origin/$CHOSEN_BRANCH"
else
if [[ "$AUTO_CREATE_BRANCH" -eq 1 ]]; then
echo "[INFO] Nieuwe lokale branch maken (zonder bestaande remote): $CHOSEN_BRANCH"
git switch -c "$CHOSEN_BRANCH"
else
echo "[ERROR] Branch '$CHOSEN_BRANCH' bestaat niet lokaal en niet bij origin."
exit 1
fi
fi
fi
# --- Functie: auto-commit lokale wijzigingen --------------------------------
auto_commit_if_needed() {
if [[ "$AUTO_COMMIT" -ne 1 ]]; then
return 0
fi
# Check of er iets te committen is
if [[ -z "$(git status --porcelain)" ]]; then
echo "[INFO] Geen lokale wijzigingen om te committen."
return 0
fi
echo "[INFO] Lokale wijzigingen gedetecteerd in branch '$CHOSEN_BRANCH':"
git status --short
echo "[INFO] Auto-commit lokale wijzigingen..."
git add -A
# Commit message opbouwen (met timestamp)
local ts
ts="$(date +'%Y-%m-%d %H:%M:%S')"
local msg="${DEFAULT_COMMIT_MSG_PREFIX} (${ts})"
git commit -m "$msg"
if [[ "$AUTO_PUSH" -eq 1 ]]; then
echo "[INFO] Pushing naar origin/$CHOSEN_BRANCH..."
git push -u origin "$CHOSEN_BRANCH"
else
echo "[INFO] AUTO_PUSH=0, push wordt overgeslagen."
fi
}
# --- Eerst altijd lokale wijzigingen committen (voor git pull) --------------
auto_commit_if_needed
# --- Daarna updaten vanaf origin (als remote bestaat) ------------------------
if git rev-parse --verify --quiet "origin/$CHOSEN_BRANCH" >/dev/null; then
echo "[INFO] Pulling latest changes from origin/$CHOSEN_BRANCH (rebase)..."
if ! git pull --rebase origin "$CHOSEN_BRANCH"; then
echo "[ERROR] git pull --rebase gaf een fout. Los eerst conflicten op en probeer opnieuw."
exit 1
fi
else
echo "[INFO] Geen origin/$CHOSEN_BRANCH gevonden; sla git pull over."
fi
# --- Na pull nogmaals checken of er iets open staat --------------------------
if [[ -n "$(git status --porcelain)" ]]; then
echo "[INFO] Er zijn na git pull nog niet-gecommit-te wijzigingen."
auto_commit_if_needed
fi
# --- Build script uitvoeren --------------------------------------------------
if [[ ! -f "./$BUILD_SCRIPT_NAME" ]]; then
echo "[ERROR] Build script ./$BUILD_SCRIPT_NAME niet gevonden in $REPO_DIR"
exit 1
fi
chmod +x "./$BUILD_SCRIPT_NAME"
echo "[INFO] Running build: ./$BUILD_SCRIPT_NAME $BUMP_TYPE"
"./$BUILD_SCRIPT_NAME" "$BUMP_TYPE"
echo "[INFO] Done."