fix: [nomad-step-4] S4.2 — wire --with agents + deploy ordering (#956) #960

Merged
dev-qwen merged 1 commit from fix/issue-956 into main 2026-04-17 11:06:39 +00:00
2 changed files with 66 additions and 7 deletions
Showing only changes of commit 155ec85a3e - Show all commits

View file

@ -82,7 +82,7 @@ Init options:
--ci-id <n> Woodpecker CI repo ID (default: 0 = no CI) --ci-id <n> Woodpecker CI repo ID (default: 0 = no CI)
--forge-url <url> Forge base URL (default: http://localhost:3000) --forge-url <url> Forge base URL (default: http://localhost:3000)
--backend <value> Orchestration backend: docker (default) | nomad --backend <value> Orchestration backend: docker (default) | nomad
--with <services> (nomad) Deploy services: forgejo,woodpecker[,...] (S1.3, S3.4) --with <services> (nomad) Deploy services: forgejo,woodpecker,agents[,...] (S1.3, S3.4, S4.2)
--empty (nomad) Bring up cluster only, no jobs (S0.4) --empty (nomad) Bring up cluster only, no jobs (S0.4)
--bare Skip compose generation (bare-metal setup) --bare Skip compose generation (bare-metal setup)
--build Use local docker build instead of registry images (dev mode) --build Use local docker build instead of registry images (dev mode)
@ -797,6 +797,7 @@ _disinto_init_nomad() {
local seed_name="$svc" local seed_name="$svc"
case "$svc" in case "$svc" in
woodpecker-server|woodpecker-agent) seed_name="woodpecker" ;; woodpecker-server|woodpecker-agent) seed_name="woodpecker" ;;
agents) seed_name="agents" ;;
esac esac
# Deduplicate # Deduplicate
if echo ",$_seed_seen," | grep -q ",$seed_name,"; then continue; fi if echo ",$_seed_seen," | grep -q ",$seed_name,"; then continue; fi
@ -817,7 +818,7 @@ _disinto_init_nomad() {
# Build ordered deploy list: only include services present in with_services # Build ordered deploy list: only include services present in with_services
local DEPLOY_ORDER="" local DEPLOY_ORDER=""
for ordered_svc in forgejo woodpecker-server woodpecker-agent; do for ordered_svc in forgejo woodpecker-server woodpecker-agent agents; do
if echo ",$with_services," | grep -q ",$ordered_svc,"; then if echo ",$with_services," | grep -q ",$ordered_svc,"; then
DEPLOY_ORDER="${DEPLOY_ORDER:+${DEPLOY_ORDER} }${ordered_svc}" DEPLOY_ORDER="${DEPLOY_ORDER:+${DEPLOY_ORDER} }${ordered_svc}"
fi fi
@ -931,9 +932,9 @@ _disinto_init_nomad() {
if [ -n "$with_services" ]; then if [ -n "$with_services" ]; then
local vault_addr="${VAULT_ADDR:-http://127.0.0.1:8200}" local vault_addr="${VAULT_ADDR:-http://127.0.0.1:8200}"
# Build ordered deploy list (S3.4): forgejo → woodpecker-server → woodpecker-agent # Build ordered deploy list (S3.4, S4.2): forgejo → woodpecker-server → woodpecker-agent → agents
local DEPLOY_ORDER="" local DEPLOY_ORDER=""
for ordered_svc in forgejo woodpecker-server woodpecker-agent; do for ordered_svc in forgejo woodpecker-server woodpecker-agent agents; do
if echo ",$with_services," | grep -q ",$ordered_svc,"; then if echo ",$with_services," | grep -q ",$ordered_svc,"; then
DEPLOY_ORDER="${DEPLOY_ORDER:+${DEPLOY_ORDER} }${ordered_svc}" DEPLOY_ORDER="${DEPLOY_ORDER:+${DEPLOY_ORDER} }${ordered_svc}"
fi fi
@ -945,6 +946,7 @@ _disinto_init_nomad() {
local seed_name="$svc" local seed_name="$svc"
case "$svc" in case "$svc" in
woodpecker-server|woodpecker-agent) seed_name="woodpecker" ;; woodpecker-server|woodpecker-agent) seed_name="woodpecker" ;;
agents) seed_name="agents" ;;
esac esac
local seed_script="${FACTORY_ROOT}/tools/vault-seed-${seed_name}.sh" local seed_script="${FACTORY_ROOT}/tools/vault-seed-${seed_name}.sh"
if [ -x "$seed_script" ]; then if [ -x "$seed_script" ]; then
@ -1006,6 +1008,9 @@ _disinto_init_nomad() {
if echo ",$with_services," | grep -q ",woodpecker-agent,"; then if echo ",$with_services," | grep -q ",woodpecker-agent,"; then
echo " woodpecker-agent: (agent connected)" echo " woodpecker-agent: (agent connected)"
fi fi
if echo ",$with_services," | grep -q ",agents,"; then
echo " agents: (polling loop running)"
fi
echo "────────────────────────────────────────────────────────" echo "────────────────────────────────────────────────────────"
fi fi
@ -1103,6 +1108,7 @@ disinto_init() {
_svc=$(echo "$_svc" | xargs) _svc=$(echo "$_svc" | xargs)
case "$_svc" in case "$_svc" in
woodpecker) _svc="woodpecker-server,woodpecker-agent" ;; woodpecker) _svc="woodpecker-server,woodpecker-agent" ;;
agents) _svc="agents" ;;
esac esac
expanded="${expanded:+${expanded},}${_svc}" expanded="${expanded:+${expanded},}${_svc}"
done done
@ -1116,14 +1122,26 @@ disinto_init() {
with_services="forgejo,${with_services}" with_services="forgejo,${with_services}"
fi fi
# Auto-include forgejo and woodpecker when agents is requested
if echo ",$with_services," | grep -q ",agents,"; then
if ! echo ",$with_services," | grep -q ",forgejo,"; then
echo "Note: --with agents implies --with forgejo (agents need forge)"
with_services="forgejo,${with_services}"
fi
if ! echo ",$with_services," | grep -q ",woodpecker-server,\|,woodpecker-agent,"; then
echo "Note: --with agents implies --with woodpecker (agents need CI)"
with_services="${with_services},woodpecker-server,woodpecker-agent"
fi
fi
# Validate all service names are known # Validate all service names are known
local IFS=',' local IFS=','
for _svc in $with_services; do for _svc in $with_services; do
_svc=$(echo "$_svc" | xargs) _svc=$(echo "$_svc" | xargs)
case "$_svc" in case "$_svc" in
forgejo|woodpecker-server|woodpecker-agent) ;; forgejo|woodpecker-server|woodpecker-agent|agents) ;;
*) *)
echo "Error: unknown service '${_svc}' — known: forgejo, woodpecker-server, woodpecker-agent" >&2 echo "Error: unknown service '${_svc}' — known: forgejo, woodpecker-server, woodpecker-agent, agents" >&2
exit 1 exit 1
;; ;;
esac esac

View file

@ -215,7 +215,7 @@ setup_file() {
run "$DISINTO_BIN" init placeholder/repo --backend=nomad --with unknown-service --dry-run run "$DISINTO_BIN" init placeholder/repo --backend=nomad --with unknown-service --dry-run
[ "$status" -ne 0 ] [ "$status" -ne 0 ]
[[ "$output" == *"unknown service"* ]] [[ "$output" == *"unknown service"* ]]
[[ "$output" == *"known: forgejo, woodpecker-server, woodpecker-agent"* ]] [[ "$output" == *"known: forgejo, woodpecker-server, woodpecker-agent, agents"* ]]
} }
# S3.4: woodpecker auto-expansion and forgejo auto-inclusion # S3.4: woodpecker auto-expansion and forgejo auto-inclusion
@ -385,3 +385,44 @@ setup_file() {
[ "$status" -ne 0 ] [ "$status" -ne 0 ]
[[ "$output" == *"--empty and --import-env/--import-sops/--age-key are mutually exclusive"* ]] [[ "$output" == *"--empty and --import-env/--import-sops/--age-key are mutually exclusive"* ]]
} }
# S4.2: agents service auto-expansion and dependencies
@test "disinto init --backend=nomad --with agents auto-includes forgejo and woodpecker" {
run "$DISINTO_BIN" init placeholder/repo --backend=nomad --with agents --dry-run
[ "$status" -eq 0 ]
[[ "$output" == *"services to deploy: forgejo,agents,woodpecker-server,woodpecker-agent"* ]]
[[ "$output" == *"Note: --with agents implies --with forgejo"* ]]
[[ "$output" == *"Note: --with agents implies --with woodpecker"* ]]
}
@test "disinto init --backend=nomad --with agents deploys in correct order" {
run "$DISINTO_BIN" init placeholder/repo --backend=nomad --with agents --dry-run
[ "$status" -eq 0 ]
[[ "$output" == *"deployment order: forgejo woodpecker-server woodpecker-agent agents"* ]]
}
@test "disinto init --backend=nomad --with agents seeds agents service" {
run "$DISINTO_BIN" init placeholder/repo --backend=nomad --with agents --dry-run
[ "$status" -eq 0 ]
[[ "$output" == *"tools/vault-seed-forgejo.sh --dry-run"* ]]
[[ "$output" == *"tools/vault-seed-woodpecker.sh --dry-run"* ]]
[[ "$output" == *"tools/vault-seed-agents.sh --dry-run"* ]]
}
@test "disinto init --backend=nomad --with agents deploys all four services" {
run "$DISINTO_BIN" init placeholder/repo --backend=nomad --with agents --dry-run
[ "$status" -eq 0 ]
[[ "$output" == *"[deploy] [dry-run] nomad job validate"*"forgejo.hcl"* ]]
[[ "$output" == *"[deploy] [dry-run] nomad job validate"*"woodpecker-server.hcl"* ]]
[[ "$output" == *"[deploy] [dry-run] nomad job validate"*"woodpecker-agent.hcl"* ]]
[[ "$output" == *"[deploy] [dry-run] nomad job validate"*"agents.hcl"* ]]
}
@test "disinto init --backend=nomad --with woodpecker,agents expands correctly" {
run "$DISINTO_BIN" init placeholder/repo --backend=nomad --with woodpecker,agents --dry-run
[ "$status" -eq 0 ]
# woodpecker expands to server+agent, agents is already explicit
# forgejo is auto-included by agents
[[ "$output" == *"services to deploy: forgejo,woodpecker-server,woodpecker-agent,agents"* ]]
[[ "$output" == *"deployment order: forgejo woodpecker-server woodpecker-agent agents"* ]]
}