#!/bin/false Tohle je knihovna, nemá se spouštět, ale načítat pomocí source(1) nebo '.' PYTHON="${PYTHON:-python3}" VENV="${VENV:-${PYTHON} -m venv}" VENV_PATH="${VENV_PATH:-env}" BRANCH="${BRANCH:-master}" REPO="${REPO:-git@gitea.ks.matfyz.cz:mam/mamweb.git}" UPSTREAM_REMOTE='origin' GIMLI='gimli.ms.mff.cuni.cz' GIMLI_LOGIN="mam-web@$GIMLI" # Skutečné cesty, jak je vrátí `realpath` PRODWEB="/aux/akce/mam/www/mamweb-prod" TESTWEB="/aux/akce/mam/www/mamweb-test" function die { echo "$@" >&2 exit 1 } trap 'echo Něco se nepovedlo :-/' ERR # Vždycky chceme zajistit, že běžíme z rootu repozitáře # TODO: chceme? Nechceme naopak umět to spouštět odkudkoliv, aspoň u většiny targetů? test -e '.git' || die "Make skript spuštěn ve špatné složce, spusť ho z kořenového adresáře repozitáře." function ensure_venv { test -f "$VENV_PATH/bin/activate" || $VENV "$VENV_PATH" . "$VENV_PATH/bin/activate" # To ale není všechno Horste – ten venv nemusí fungovat, chceme to ověřit a případně spadnout. local SPRAVNA_CESTA="$(readlink -f "$VENV_PATH/bin/python")" local SKUTECNA_CESTA="$(readlink -f "$(which python)")" test "$SPRAVNA_CESTA" == "$SKUTECNA_CESTA" || die "Venv asi nefunguje. Prosím smaž si ho a zkus to znovu." python -c 'print()' > /dev/null || die "Python ve venvu je rozbitý. Prosím smaž venv a zkus to znovu." } function ensure_web_installed { ensure_venv python -c 'import django; print(django.__version__)' > /dev/null && return echo >&2 "POZOR: Web nevypadá nainstalovaně, instaluji." make/install_web } function gimli_only { # Rovnou zkontrolujeme i uživatele if test "$HOSTNAME" != gimli -o "$USER" != mam-web then echo "Tento příkaz se má spouštět na gimlim, chceš pokračovat? Pokud ne, sestřel tento skript." read fi } function only_in_directory { local DIR="$1" local CURRENT="$(readlink -f .)" if test "$CURRENT" != "$DIR" then echo "Tento příkaz se má spouštět ve složce $DIR, chceš pokračovat? Pokud ne, sestřel tento skript." read fi } function safe_checkout_branch { if test "$#" -ne 1 then echo >&2 "Použití: $0 <branch>" return 1 fi local BRANCH="$1" local SCRIPT="$0" git fetch --all local UPSTREAM_BRANCH if git rev-parse "$BRANCH@{u}" >/dev/null 2>/dev/null then UPSTREAM_BRANCH="$BRANCH@{u}" # Stačí symbolicky. else # Tohle je jediná možná záchrana. UPSTREAM_BRANCH="$UPSTREAM_REMOTE/$BRANCH" fi git rev-parse "$UPSTREAM_BRANCH" || die "Vzdálená větev $UPSTREAM_BRANCH neexistuje?" # Od teď si musíme dát pozor, abychom nezměnili kód, který právě běží. # Zkontrolujeme, že se nemění tahle knihovna a skript, který běží. # `git rev-parse` dává SHA-1 hashe objektů, vizte manuálovou stránku pro pochopení. # Pozor: tohle porovnává jen verze commitnuté do gitu. Lokální změny udělají něco náhodného… if test "$(git rev-parse @:make/lib.sh)" != "$(git rev-parse "$UPSTREAM_BRANCH":make/lib.sh)" then echo >&2 "Změna v make/lib.sh, prosím pullni manuálně" exit 1 fi if test "$(git rev-parse @:"$SCRIPT")" != "$(git rev-parse "$UPSTREAM_BRANCH":"$SCRIPT")" then echo >&2 "Změna v $SCRIPT, prosím pullni manuálně" exit 1 fi git checkout "$BRANCH" git pull git clean -f } function install_everything { # Skoro celé nasazení webu je stejné pro testweb i pro produkci, tak je to tady dohromady gimli_only ensure_venv make/install ./manage.py migrate ./manage.py collectstatic --noinput setfacl -R -m default:u:www-data:rX media static setfacl -R -m u:www-data:rX media static chown -R :mam . || true chmod -R g+rX,go-w . || true }