115 lines
3.6 KiB
Bash
115 lines
3.6 KiB
Bash
#!/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
|
||
}
|
||
|