From 0abc43bffcae211e5386f4077bde57686f053ae8 Mon Sep 17 00:00:00 2001 From: casjay Date: Sun, 24 May 2026 21:37:50 -0400 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20Fix=20act=5Frunner=20registratio?= =?UTF-8?q?n=20order=20=F0=9F=90=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Runners were launched in parallel subshells with only a 2-second gap between them. act_runner register is a network call; if Gitea was still warming up any registration could race past an earlier one, causing Gitea to assign IDs out of sequence (1,3,2,5,4 instead of 1,2,3,4,5). Split into two phases: register all runners sequentially first so IDs are assigned in the correct order, then launch all daemons in parallel once every runner is confirmed registered. - rootfs/usr/local/bin/start-runners: split __start_runner into __register_runner (sequential, phase 1) and __start_runner_daemon (parallel, phase 2); remove the sleep 2 workaround rootfs/usr/local/bin/start-runners --- rootfs/usr/local/bin/start-runners | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/rootfs/usr/local/bin/start-runners b/rootfs/usr/local/bin/start-runners index a0c4db4..6484010 100755 --- a/rootfs/usr/local/bin/start-runners +++ b/rootfs/usr/local/bin/start-runners @@ -47,35 +47,46 @@ __log "Starting $RUNNERS_START act_runner instance(s)" __log "Server Address: $SERVER_ADDRESS" __log "Runner Name Prefix: ${RUNNER_NAME_PREFIX:-runner}" # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# Function to start a single runner -__start_runner() { +# Register a single runner synchronously (no daemon start) +__register_runner() { local runner_id=$1 local runner_name="${RUNNER_NAME_PREFIX:-runner}-${runner_id}" local runner_dir="/config/act_runner/reg/${runner_name}" - # Create runner directory mkdir -p "$runner_dir" [ -d "$runner_dir" ] && cd "$runner_dir" || return 1 if [ ! -f "$runner_dir/.runner" ]; then __log "Registering runner: $runner_name (ID: $runner_id)" - # Register the runner — creates .runner in CWD act_runner register --instance "$SERVER_ADDRESS" --token "$SERVER_TOKEN" --name "$runner_name" --labels "$RUNNER_LABELS" --no-interactive if [ $? -ne 0 ]; then __log "ERROR: Failed to register runner $runner_name" return 1 fi fi - # Start the daemon — no --config; act_runner finds .runner in CWD automatically + __log "Runner $runner_name registered" +} +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +# Start daemon for a single runner (called in background after all are registered) +__start_runner_daemon() { + local runner_id=$1 + local runner_name="${RUNNER_NAME_PREFIX:-runner}-${runner_id}" + local runner_dir="/config/act_runner/reg/${runner_name}" + + [ -d "$runner_dir" ] && cd "$runner_dir" || return 1 __log "Starting daemon for runner: $runner_name" exec act_runner daemon } # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -# Start runners in background +# Phase 1: register all runners sequentially so IDs are assigned in order for i in $(seq 1 $RUNNERS_START); do - (__start_runner $i) & - # Small delay between starting runners - sleep 2 + __register_runner "$i" || { __log "Aborting: registration failed for runner-$i"; exit 1; } +done +unset i +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +# Phase 2: start all daemons in parallel +for i in $(seq 1 $RUNNERS_START); do + (__start_runner_daemon "$i") & done unset i # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -