blob: 87c281e5c5425b33cda283102ec1c3e74af49db0 (
plain) (
tree)
|
|
#!/bin/bash -e
# acid-build <name> <file> <hash> [--self]
#
# (Re)build and deploy the service <name> using the docker-compose configuration
# in <file> (usually, docker-compose.yml).
#
# In the typical case, this is a straightforward process and `docker compose up`
# can properly recreate/start containers for the guest service. However, when
# rebuilding cychedelic itself, `--self` must be given, which modifies this
# script to support self-upgrade of the running compose service.
#
# In `--self` mode, we prepare and start the cychedelic service under an
# alternate project name each time, before taking down the existing (old)
# services. This is necessary because running `docker compose up` terminates
# old containers before starting new ones. Termination of the ACID service
# interrupts the `compose up` process before it can start the replacements.
# Normally, `docker compose down` is then not needed.
#
# We take <hash> (from acid-source) so we may commit it to the cache iff the
# deployment is successful.
#
# This file exits early on any failure (non-zero). On a successful run in
# `--self` mode, this file does not exit (we are killed by `compose down`).
cd "$CYCHE_SERVICE_DIR/$1"
# For <file>, no absolute paths and no '../'
if ! echo "$2" | grep -Evq '\.\.|^/'; then
echo "Bad file path: $2"
exit 1
fi
if [ "$4" == "--self" ]; then
prev=$(cat '.git/previous_slug')
[ -z "$prev" ] && prev="$1"
name=$(echo -n "$1-"; tr -dc a-z </dev/urandom | head -c 12)
else
name="$1"
fi
docker compose --project-name "$name" --file "$2" pull
docker compose --project-name "$name" --file "$2" build \
--force-rm \
--no-cache \
--pull
docker compose --project-name "$name" --file "$2" up \
--detach \
--remove-orphans \
--force-recreate
echo "$3" >.git/previous_hash
if [ "$4" == "--self" ]; then
echo "$name" >.git/previous_slug
docker compose --project-name "$1" down
docker compose --project-name "$prev" down
fi
|