#!/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