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
 | ||
| }
 | ||
| 
 |