summaryrefslogtreecommitdiffstats
path: root/acid/acid-build
diff options
context:
space:
mode:
Diffstat (limited to 'acid/acid-build')
-rwxr-xr-xacid/acid-build58
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