#!/usr/bin/env bash # Een getagde versie van de CRM naar de server brengen (eerst eenmalig server/setup.sh op de server). # # tools/release.sh crm@crm.voorbeeld.nl nieuwste tag # tools/release.sh crm@crm.voorbeeld.nl v0.0.2 een bepaalde versie (ook om terug te rollen) # # De code komt uit `git archive ` (precies wat getagd is, niet de werkkopie); de 3D-engine van de # configurator ($CONFIGURATOR, standaard ../configurator) gaat er met rsync bij, met hardlinks naar de vorige # versie zodat alleen wijzigingen over de lijn gaan. Op de server maakt server/activate.sh hem actief. set -euo pipefail REPO="$(cd "$(dirname "$0")/.." && pwd)" HOST="${1:-}" CONFIGURATOR="${CONFIGURATOR:-$REPO/../configurator}" ROOT=/srv/vanemous-crm say() { printf '\033[38;2;185;89;19m▸\033[0m %s\n' "$*"; } fail() { printf 'Fout: %s\n' "$*" >&2; exit 1; } [ -n "$HOST" ] || fail "gebruik: tools/release.sh crm@server [vX.Y.Z]" TAG="${2:-$(git -C "$REPO" tag --list 'v*' --sort=-v:refname | head -n1)}" [[ "$TAG" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]] || fail "onbekende versie '$TAG' (verwacht vX.Y.Z)" git -C "$REPO" rev-parse -q --verify "refs/tags/$TAG" >/dev/null || fail "tag $TAG bestaat niet" code_version="$(git -C "$REPO" show "$TAG:app.py" | sed -nE "s/^__version__ = '([^']+)'.*/\1/p")" [ "v$code_version" = "$TAG" ] || fail "tag $TAG bevat __version__ = '$code_version' in app.py" git -C "$REPO" cat-file -e "$TAG:server/activate.sh" 2>/dev/null || fail "$TAG heeft nog geen server/activate.sh; tag een nieuwere versie" [ -f "$CONFIGURATOR/js/house/house-model.js" ] || fail "geen configurator in $CONFIGURATOR (zet CONFIGURATOR=pad)" [ -z "$(git -C "$REPO" status --porcelain)" ] || say "let op: niet-gecommitte wijzigingen zitten niet in $TAG" target="$ROOT/releases/$TAG" if ssh "$HOST" "test -f $target/.installed"; then say "$TAG staat al op de server" else say "$TAG uploaden naar $HOST" git -C "$REPO" archive "$TAG" | ssh "$HOST" "rm -rf $target && mkdir -p $target && tar -x -C $target" fi say "3D-engine bijwerken uit $CONFIGURATOR" ssh "$HOST" "mkdir -p $target/static/configurator" rsync -az --delete --link-dest="$ROOT/current/static/configurator/" \ --include='/LICENTIE.md' --include='/assets/***' --include='/js/***' --include='/kosten/***' --exclude='*' \ "$CONFIGURATOR/" "$HOST:$target/static/configurator/" ssh "$HOST" "bash $target/server/activate.sh $TAG"