Files
computer-playbook/scripts/system/worktree/up.sh
T
kevinveenbirkenbachandClaude Opus 5 8aa251d0ac fix(worktree): derive a persistent base and slot the lab node IPs
The default base was /tmp, which is tmpfs on this host: a reboot took a whole worktree and its uncommitted work with it. Derive the base from the origin remote instead, as ~/.local/share/worktrees/<domain>/<account>/<repo>, and let the branch keep its slashes so it nests, which also makes the infinito-wt- prefix redundant. Without an origin remote it now fails loudly rather than inventing a location.

up.sh bumped only INFINITO_SWARM_LAB_SUBNET per slot while the five swarm lab node IPs stayed at default.env's 192.168.244.x, so every worktree from slot 1 on got a lab network in a different /24 than the nodes it places in it, and collided with the primary checkout's lab. Pin all six values from one octet.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-07-30 15:08:50 +02:00

118 lines
3.5 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:-}"
max_slot=255
cd "${REPO_ROOT}"
base="${base:-$(worktree_default_base)}"
slug="$(worktree_slug "${branch}")"
if [ -z "${slug}" ]; then
echo "FAILURE: branch '${branch}' slugs to an empty name" >&2
exit 1
fi
path="$(worktree_path "${branch}" "${base}")"
mkdir -p "$(dirname "${path}")"
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)"
lab_octet="$((244 + slot))"
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.${lab_octet}.0/24
INFINITO_SWARM_MGR_IP=192.168.${lab_octet}.10
INFINITO_SWARM_WRK1_IP=192.168.${lab_octet}.11
INFINITO_SWARM_WRK2_IP=192.168.${lab_octet}.12
INFINITO_SWARM_NFS_IP=192.168.${lab_octet}.13
INFINITO_SWARM_BACKUP_IP=192.168.${lab_octet}.14
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.${lab_octet}.0/24" \
INFINITO_SWARM_MGR_IP="192.168.${lab_octet}.10" \
INFINITO_SWARM_WRK1_IP="192.168.${lab_octet}.11" \
INFINITO_SWARM_WRK2_IP="192.168.${lab_octet}.12" \
INFINITO_SWARM_NFS_IP="192.168.${lab_octet}.13" \
INFINITO_SWARM_BACKUP_IP="192.168.${lab_octet}.14" \
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