diff options
Diffstat (limited to 'acid/acid-build')
-rwxr-xr-x | acid/acid-build | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/acid/acid-build b/acid/acid-build new file mode 100755 index 0000000..fd5b69d --- /dev/null +++ b/acid/acid-build @@ -0,0 +1,58 @@ +#!/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 "/services/$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 |