mirror of
https://github.com/kevinveenbirkenbach/computer-playbook.git
synced 2026-11-10 12:47:04 +00:00
Parallel checkouts collided on the compose subnet, host ports and container names, so a quality run in a worktree died at compose-up. Slot each checkout via custom.env and layer two overrides on top: the shared cache network in place of a second cache stack, and the shared .git directory without which git aborts inside the container. Both overlays gate on the resource they need, not on the slot number, so a stray INFINITO_INSTANCE cannot make compose demand a value nobody set. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
103 lines
2.9 KiB
Bash
Executable File
103 lines
2.9 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# shellcheck shell=bash
|
|
#
|
|
# Create an isolated git worktree for a branch and pin it to a free slot, so
|
|
# its compose stack no longer collides with the primary checkout on subnet,
|
|
# host ports, container names or volumes. The cache stack is not duplicated:
|
|
# the worktree joins the running one over an external network.
|
|
#
|
|
# Use `make worktree-up` rather than calling this script directly.
|
|
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)"
|
|
|
|
# shellcheck source=scripts/system/worktree/lib.sh
|
|
source "${SCRIPT_DIR}/lib.sh"
|
|
|
|
branch="${1:?branch name required}"
|
|
base="${2:-/tmp}"
|
|
max_slot=255
|
|
|
|
cd "${REPO_ROOT}"
|
|
|
|
slug="$(worktree_slug "${branch}")"
|
|
if [ -z "${slug}" ]; then
|
|
echo "FAILURE: branch '${branch}' slugs to an empty name" >&2
|
|
exit 1
|
|
fi
|
|
|
|
path="$(worktree_path "${slug}" "${base}")"
|
|
if [ -e "${path}" ]; then
|
|
echo "FAILURE: ${path} already exists; run 'make worktree-down branch=${branch}' first" >&2
|
|
exit 1
|
|
fi
|
|
|
|
slot="$(worktree_next_slot)"
|
|
if [ "${slot}" -gt "${max_slot}" ]; then
|
|
echo "FAILURE: no free slot left (max ${max_slot}); tear down an existing worktree" >&2
|
|
exit 1
|
|
fi
|
|
|
|
cache_network="$(worktree_cache_network)"
|
|
if [ -z "${cache_network}" ]; then
|
|
echo ">>> WARNING: no running cache stack found; the worktree will start without a shared cache"
|
|
fi
|
|
|
|
echo ">>> Creating worktree for '${branch}' at ${path} (slot ${slot})"
|
|
git worktree add "${path}" "${branch}"
|
|
|
|
git_common_dir="$(git rev-parse --path-format=absolute --git-common-dir)"
|
|
|
|
echo ">>> Pinning slot ${slot} in ${path}/custom.env"
|
|
cat >"${path}/custom.env" <<PINS
|
|
INFINITO_INSTANCE=${slot}
|
|
INFINITO_GIT_COMMON_DIR=${git_common_dir}
|
|
INFINITO_SUBNET=172.30.${slot}.0/24
|
|
INFINITO_GATEWAY=172.30.${slot}.1
|
|
INFINITO_DNS_IP=172.30.${slot}.53
|
|
INFINITO_IP4=172.30.${slot}.10
|
|
INFINITO_BIND_IP=127.0.0.$((slot + 1))
|
|
INFINITO_SWARM_LAB_SUBNET=192.168.$((244 + slot)).0/24
|
|
INFINITO_RUNNER_PREFIX=infinito-${slug}
|
|
INFINITO_CONTAINER=infinito_nexus_${slug//[.-]/_}
|
|
INFINITO_CACHE_NETWORK=${cache_network}
|
|
PINS
|
|
|
|
echo ">>> Generating .env from the pins"
|
|
env -i -C "${path}" \
|
|
HOME="${HOME}" \
|
|
PATH="${PATH}" \
|
|
INFINITO_INSTANCE="${slot}" \
|
|
INFINITO_GIT_COMMON_DIR="${git_common_dir}" \
|
|
INFINITO_SUBNET="172.30.${slot}.0/24" \
|
|
INFINITO_GATEWAY="172.30.${slot}.1" \
|
|
INFINITO_DNS_IP="172.30.${slot}.53" \
|
|
INFINITO_IP4="172.30.${slot}.10" \
|
|
INFINITO_BIND_IP="127.0.0.$((slot + 1))" \
|
|
INFINITO_SWARM_LAB_SUBNET="192.168.$((244 + slot)).0/24" \
|
|
INFINITO_RUNNER_PREFIX="infinito-${slug}" \
|
|
INFINITO_CACHE_NETWORK="${cache_network}" \
|
|
python3 -m cli.meta.env
|
|
|
|
cat <<SUMMARY
|
|
|
|
Worktree ready.
|
|
|
|
branch ${branch}
|
|
path ${path}
|
|
slot ${slot}
|
|
subnet 172.30.${slot}.0/24
|
|
bind IP 127.0.0.$((slot + 1))
|
|
container infinito_nexus_${slug//[.-]/_}
|
|
cache net ${cache_network:-<none>}
|
|
|
|
Next:
|
|
cd ${path}
|
|
make compose-up
|
|
|
|
Release with:
|
|
make worktree-down branch=${branch}
|
|
SUMMARY
|