AkurAI Build
Menu

AkurAI-Build

public

Latest change 8107093efd9077ca5df8b126a51711dc14a09787 - Adopt legacy service container in Compose release by Ólafur Búi Ólafsson

#!/bin/sh
set -eu

root=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd)
cd "$root"

[ "${HOSTNAME:-}" != akurai-build-worker ] || {
  echo 'compose-release must run outside the worker container' >&2
  exit 1
}

version=$(sed -n 's/^version = "\([^"]*\)"/\1/p' Cargo.toml | sed -n '1p')
latest=$(sed -n 's/^## \([0-9][0-9.]*\) .*/\1/p' CHANGELOG.md | sed -n '1p')
commit=$(git rev-parse --verify HEAD)
[ -n "$version" ]
[ "$version" = "$latest" ] || {
  echo "Cargo version $version does not match changelog $latest" >&2
  exit 1
}
test -x target/release/akurai
[ "$(target/release/akurai --version)" = "akurai $version" ] || {
  echo "host binary version does not match Cargo version $version" >&2
  exit 1
}

# Both images come from one immutable revision and share one release tag.
docker build --target service-prebuilt \
  --build-arg "AKURAI_BUILD_VERSION=$version" \
  --build-arg "AKURAI_BUILD_COMMIT=$commit" \
  --tag "akurai-build-service:$version" \
  --tag "akurai-build-service:$commit" \
  --file deploy/Dockerfile .
docker build --target worker \
  --build-arg "AKURAI_BUILD_VERSION=$version" \
  --build-arg "AKURAI_BUILD_COMMIT=$commit" \
  --tag "akurai-build-worker:$version" \
  --tag "akurai-build-worker:$commit" \
  --file deploy/Dockerfile .

for image in "akurai-build-service:$version" "akurai-build-worker:$version"; do
  image_version=$(docker image inspect --format '{{ index .Config.Labels "org.opencontainers.image.version" }}' "$image")
  image_commit=$(docker image inspect --format '{{ index .Config.Labels "org.opencontainers.image.revision" }}' "$image")
  [ "$image_version" = "$version" ] && [ "$image_commit" = "$commit" ] || {
    echo "$image identifies version=$image_version commit=$image_commit, expected version=$version commit=$commit" >&2
    exit 1
  }
done

install_dir="$HOME/.local/lib/akurai-build"
install -d -m 700 "$install_dir"
install -m 755 target/release/akurai "$install_dir/akurai.next"
mv -f "$install_dir/akurai.next" "$install_dir/akurai"
printf '%s\n' "$commit" >"$install_dir/revision.next"
mv -f "$install_dir/revision.next" "$install_dir/revision"
installed_version=$("$install_dir/akurai" --version)
[ "$installed_version" = "akurai $version" ] && [ "$(cat "$install_dir/revision")" = "$commit" ] || {
  echo "installed host MCP identity does not match version=$version commit=$commit" >&2
  exit 1
}

export AKURAI_BUILD_VERSION="$version"

compose() {
  if docker compose version >/dev/null 2>&1; then
    docker compose "$@"
  else
    docker run --rm --group-add 962 \
      --volume /var/run/docker.sock:/var/run/docker.sock \
      --volume "$root:$root:ro" \
      --volume /home/olafurbui/.config/akurai-build:/home/olafurbui/.config/akurai-build:ro \
      --workdir "$root" \
      --env "AKURAI_BUILD_VERSION=$version" \
      --entrypoint /usr/local/lib/docker/cli-plugins/docker-compose \
      "akurai-build-worker:$version" "$@"
  fi
}

# The first Compose adoption must remove the old one-container service before
# Compose can claim its fixed name. Confirm this file owns the replacement so a
# stale or unrelated container cannot be removed accidentally. Managed service
# containers are retained here and force-recreated by Compose below.
compose_services=$(compose --project-name akurai-build --file deploy/docker-compose.yml config --services)
has_service=false
for compose_service in $compose_services; do
  [ "$compose_service" = service ] && has_service=true
done
[ "$has_service" = true ] || {
  echo 'Compose file does not define the service replacement' >&2
  exit 1
}
if docker inspect akurai-build-service >/dev/null 2>&1; then
  managed_project=$(docker inspect --format '{{ index .Config.Labels "com.docker.compose.project" }}' akurai-build-service)
  managed_service=$(docker inspect --format '{{ index .Config.Labels "com.docker.compose.service" }}' akurai-build-service)
  if [ "$managed_project" != akurai-build ] || [ "$managed_service" != service ]; then
    echo 'adopting legacy akurai-build-service container into Compose' >&2
    running=$(docker inspect --format '{{ .State.Running }}' akurai-build-service)
    [ "$running" = true ] && docker stop akurai-build-service >/dev/null
    docker rm akurai-build-service >/dev/null
  fi
fi
compose --project-name akurai-build --file deploy/docker-compose.yml up -d --remove-orphans --force-recreate

for endpoint in http://127.0.0.1:3210/api/health http://127.0.0.1:3211/api/health; do
  attempt=0
  until curl -fsS "$endpoint" >/dev/null; do
    attempt=$((attempt + 1))
    [ "$attempt" -lt 60 ] || {
      compose --project-name akurai-build --file deploy/docker-compose.yml ps >&2
      exit 1
    }
    sleep 2
  done
done

for container in akurai-build-service akurai-build-worker; do
  runtime_version=$(docker inspect --format '{{ index .Config.Labels "org.opencontainers.image.version" }}' "$container")
  runtime_commit=$(docker inspect --format '{{ index .Config.Labels "org.opencontainers.image.revision" }}' "$container")
  [ "$runtime_version" = "$version" ] && [ "$runtime_commit" = "$commit" ] || {
    echo "$container identifies version=$runtime_version commit=$runtime_commit, expected version=$version commit=$commit" >&2
    exit 1
  }
done

compose --project-name akurai-build --file deploy/docker-compose.yml ps
printf 'release=%s commit=%s service=healthy worker=healthy\n' "$version" "$commit"