Add docker-develop/update-and-build.sh
This commit is contained in:
parent
4ee1a897f7
commit
61f8cacd91
232
docker-develop/update-and-build.sh
Normal file
232
docker-develop/update-and-build.sh
Normal file
@ -0,0 +1,232 @@
|
||||
#!/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."
|
||||
Loading…
Reference in New Issue
Block a user