Mercurial > kallithea
changeset 6025:51b1af58589b
db: script to test database upgrades
dbmigrate-test executes Alembic upgrade scripts between two Kallithea
versions in a clean environment. There is no automated testing of
whether the upgraded database is functional, only that the upgrade
proceeds without errors.
author | Søren Løvborg <sorenl@unity3d.com> |
---|---|
date | Wed, 13 Jul 2016 21:39:14 +0200 |
parents | 1a080d4e926e |
children | dd676fdeda0f |
files | scripts/dbmigrate-test |
diffstat | 1 files changed, 122 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scripts/dbmigrate-test Wed Jul 13 21:39:14 2016 +0200 @@ -0,0 +1,122 @@ +#!/bin/sh -e + +if [ $# -lt 2 ] || [ $# -gt 3 ]; then + cat >&2 <<EOD +usage: $0 CONFIG_FILE FROM_REV [TO_REV] + +Runs a database migration from FROM_REV to TO_REV (default: current +working directory parent), using the specified CONFIG_FILE (.ini file). + +Test is run using a clean Kallithea install, in a temporary virtual +environment. FROM_REV and (optional) TO_REV should be Mercurial revision +identifiers (e.g. changeset hash or a version number tag). The working +directory is not touched, but the database referenced in the config file +will be (re)created. + +Only SQLite is available out of the box; for MySQL or PostgreSQL, set +the EXTRA environment variable to the required package(s), and it'll +be installed in the virtual environment. (E.g. EXTRA=MySQL-python or +EXTRA=psycopg2.) + +The temporary directory is not removed, allowing follow-up examination +of the upgrade results. It is, however, created in /tmp by default, +which many Linux distributions automatically clean at regular intervals. +EOD + exit 1 +fi + +config_file=$(readlink -f "$1") +from_rev=$2 +to_rev=$3 +source_repo=$(dirname "$(dirname "$(readlink -f "$0")")") + +announce() { + echo + echo "$1" + echo +} + +quiet_if_ok() ( + local output + local st + set +e + output=$("$@" < /dev/null 2>&1) + st=$? + if [ $st -ne 0 ]; then + echo "$output" >&2 + echo "Command $@ returned exit status $st." >&2 + exit 1 + fi +) + +HG() { + "${HG:-hg}" --repository "$source_repo" "$@" +} + +# If upgrading to "current revision", warn if working directory is dirty. +if [ ! "$to_rev" ] && [ "$(HG status -mard)" ]; then + announce "Warning: Uncommitted changes in working directory will be ignored!" +fi + +from_rev_hash=$(HG id --id --rev "${from_rev:-.}") +to_rev_hash=$(HG id --id --rev "${to_rev:-.}") +temp=$(readlink -f "$(mktemp --tmpdir -d 'dbmigrate-test.XXXXXX')") + +cat <<EOD +Config file: $config_file +EOD +sed -n -e 's/^sqlalchemy\.db1\.url *= */Database URL: /p' "$config_file" +cat <<EOD +Working dir: $temp +Repository: $source_repo +Upgrade from: $from_rev_hash (${from_rev:-current}) +Upgrade to: $to_rev_hash (${to_rev:-current}) +Extra packages: ${EXTRA:-(none)} +EOD + +mkdir "$temp/repos" # empty + +# Enable caching for old pip versions (this will cache the pip upgrade) +# Newer pip versions cache automatically, and don't use this variable. +if [ ! "$PIP_DOWNLOAD_CACHE" ]; then + export PIP_DOWNLOAD_CACHE=$HOME/.cache/pip/legacy +fi + +install_kallithea() { + local prefix=$1 + local rev=$2 + + announce "Installing Kallithea $rev in $prefix..." + + "${VIRTUALENV:-virtualenv}" --quiet "$prefix-env" + HG archive --rev "$rev" "$prefix" + + ( + cd "$prefix" + . "$prefix-env/bin/activate" + pip install --quiet --upgrade pip setuptools mercurial $EXTRA + pip install --quiet -e . + ) +} + +install_kallithea "$temp/from" "$from_rev_hash" +( + cd "$temp/from" + . "$temp/from-env/bin/activate" + announce "Initializing database..." + quiet_if_ok paster setup-db "$config_file" --repos="$temp/repos" --user=doe --email=doe@example.com --password=123456 --no-public-access --force-yes + alembic -c "$config_file" current -v +) + +install_kallithea "$temp/to" "$to_rev_hash" +( + cd "$temp/to" + . "$temp/to-env/bin/activate" + + announce "Commencing database upgrade from shown Alembic revision to head..." + alembic -c "$config_file" current -v + alembic -c "$config_file" upgrade head + announce "Upgrade complete, now at the shown Alembic revision:" + alembic -c "$config_file" current -v +) +