infra/staging/templates/deployer-startup.sh.tftpl

58e6347eeb72 · 3 KB

#!/bin/bash
set -euo pipefail

exec >>/var/log/openagents-deployer-startup.log 2>&1

metadata() {
  curl --fail --silent --show-error \
    --header 'Metadata-Flavor: Google' \
    "http://metadata.google.internal/computeMetadata/v1/$1"
}

metadata_attribute() {
  metadata "instance/attributes/$1" 2>/dev/null || true
}

image=$(metadata_attribute openagents-controller-image)
source_sha=$(metadata_attribute openagents-controller-sha)
cookie_secret=$(metadata_attribute openagents-cookie-secret)

if [ -z "$image" ] || [ -z "$source_sha" ]; then
  echo "No staging controller candidate is assigned."
  exit 0
fi

controller_image_prefix="${region}-docker.pkg.dev/${project_id}/openagents-staging/openagents@"

case "$image" in
  "$controller_image_prefix"sha256:????????????????????????????????????????????????????????????????) ;;
  *) echo "Assigned controller image is not digest-addressed" >&2; exit 1 ;;
esac

case "$source_sha" in
  ????????????????????????????????????????) ;;
  *) echo "Assigned controller source revision is malformed" >&2; exit 1 ;;
esac

case "$source_sha" in
  *[!0-9a-f]*) echo "Assigned controller source revision is malformed" >&2; exit 1 ;;
esac

access_token=$(metadata instance/service-accounts/default/token | jq -r '.access_token')
mkdir -p /run/openagents

release_cookie=$(
  curl --fail --silent --show-error \
    --header "Authorization: Bearer $access_token" \
    "https://secretmanager.googleapis.com/v1/projects/${project_id}/secrets/$cookie_secret/versions/latest:access" \
    | jq -r '.payload.data' \
    | tr '_-' '/+' \
    | base64 -d
)

if [ -z "$release_cookie" ] || [ "$(printf %s "$release_cookie" | wc -l)" -ne 0 ]; then
  echo "Release cookie must be a nonempty single-line value" >&2
  exit 1
fi

printf 'RELEASE_COOKIE=%s\n' "$release_cookie" >/run/openagents/deployer.env
unset release_cookie

chmod 0600 /run/openagents/deployer.env
export DOCKER_CONFIG=/run/openagents/docker-config
mkdir -p "$DOCKER_CONFIG"
chmod 0700 "$DOCKER_CONFIG"
docker-credential-gcr configure-docker --registries=${region}-docker.pkg.dev
docker pull "$image"
docker rm --force openagents-deployer 2>/dev/null || true
docker run --detach \
  --name openagents-deployer \
  --network host \
  --restart always \
  --env-file /run/openagents/deployer.env \
  --env "OPENAGENTS_CONTROLLER_SHA=$source_sha" \
  --env "OPENAGENTS_GCP_IMAGE_REPOSITORY=${image_repository}" \
  --env 'OPENAGENTS_GCP_ROLLING_INSTANCES_JSON=${rolling_instances_json}' \
  --env "OPENAGENTS_GCP_ROLLING_PROJECT_ID=${project_id}" \
  --env "OPENAGENTS_GCP_ROLLING_ZONE=${zone}" \
  --env "OPENAGENTS_PRODUCTION_PROJECT_ID=${production_project_id}" \
  --entrypoint /bin/sh \
  "$image" -c '
    set -eu
    : "$${RELEASE_COOKIE:?RELEASE_COOKIE is required}"
    release_version=$(awk '\''{print $2}'\'' /app/releases/start_erl.data)
    cookie_root=/tmp/openagents-deployer-home
    mkdir -p "$cookie_root"
    umask 077
    printf %s "$RELEASE_COOKIE" >"$cookie_root/.erlang.cookie"
    unset RELEASE_COOKIE
    export HOME="$cookie_root"
    exec /app/erts-*/bin/erl \
      -boot_var RELEASE_LIB /app/lib \
      -boot "/app/releases/$release_version/start_clean" \
      -hidden \
      -name openagents-deployer@openagents-deployer.staging.internal \
      -kernel inet_dist_listen_min 9100 inet_dist_listen_max 9115 \
      -noshell \
      -pa /app/lib/openagents-*/ebin \
      -eval "'\''Elixir.OpenAgents.Forge.RollingProvider.Gcp.Deployer'\'':start()."
  '