initial: NAS agent runner setup

This commit is contained in:
Janpeter Visser 2026-05-02 15:43:59 +02:00
commit 9d8a7fe237
16 changed files with 1121 additions and 0 deletions

90
job-prepare.sh Normal file
View file

@ -0,0 +1,90 @@
#!/usr/bin/env bash
# job-prepare.sh — zet een per-job working tree op
#
# Usage: job-prepare.sh <job_id> <repo_url>
#
# Strategie:
# 1. Bare cache van de repo onderhouden in $AGENT_REPO_CACHE/<slug>.git
# 2. Vers fetchen voor we clonen (laatste main-state)
# 3. `git clone --reference --dissociate` zodat objects gedeeld worden
# (snelle clone, schone working tree)
# 4. `npm install` met cache-share via $NPM_CONFIG_CACHE
#
# Output (laatste regel): pad van de working tree, voor `cd`-gebruik.
set -uo pipefail
source /opt/agent/bin/_lib.sh
: "${AGENT_REPO_CACHE:=/var/cache/repos}"
: "${AGENT_JOB_ROOT:=/tmp}"
: "${AGENT_LOG_DIR:=/var/log/agent}"
JOB_ID="${1:-}"
REPO_URL="${2:-}"
if [[ -z "$JOB_ID" || -z "$REPO_URL" ]]; then
log "usage: $0 <job_id> <repo_url>"
exit 2
fi
# Slug uit repo_url voor de cache-naam: "github.com/foo/bar.git" → "foo_bar"
SLUG=$(echo "$REPO_URL" \
| sed -E 's#^.*[:/]([^/]+/[^/]+?)(\.git)?/?$#\1#' \
| tr '/' '_')
CACHE_DIR="${AGENT_REPO_CACHE}/${SLUG}.git"
WORK_DIR="${AGENT_JOB_ROOT}/job-${JOB_ID}"
JOB_LOG="${AGENT_LOG_DIR}/jobs/${JOB_ID}.log"
mkdir -p "$(dirname "$JOB_LOG")"
{
log "preparing job ${JOB_ID} from ${REPO_URL}"
log "cache=${CACHE_DIR} work=${WORK_DIR}"
# ----- 1. ensure bare cache ------------------------------------
if [[ ! -d "$CACHE_DIR" ]]; then
log "cache miss — bare-cloning ${REPO_URL}"
git clone --bare --filter=blob:none "$REPO_URL" "$CACHE_DIR"
else
log "cache hit — fetching latest"
git -C "$CACHE_DIR" fetch --all --prune --quiet
fi
# ----- 2. fresh working tree -----------------------------------
if [[ -d "$WORK_DIR" ]]; then
log "stale work dir found — removing"
rm -rf "$WORK_DIR"
fi
log "cloning via reference"
git clone \
--reference "$CACHE_DIR" \
--dissociate \
--quiet \
"$REPO_URL" "$WORK_DIR"
# ----- 3. branch -----------------------------------------------
BRANCH="agent/job-${JOB_ID}"
git -C "$WORK_DIR" checkout -B "$BRANCH"
log "checked out ${BRANCH} from $(git -C "$WORK_DIR" rev-parse --short HEAD)"
# ----- 4. install deps -----------------------------------------
if [[ -f "$WORK_DIR/package-lock.json" ]]; then
log "running npm ci (cache=${NPM_CONFIG_CACHE})"
( cd "$WORK_DIR" && npm ci --no-audit --no-fund --prefer-offline ) \
|| log "WARN: npm ci failed (continuing — agent kan zelf decide)"
elif [[ -f "$WORK_DIR/package.json" ]]; then
log "no lockfile — running npm install"
( cd "$WORK_DIR" && npm install --no-audit --no-fund --prefer-offline ) \
|| log "WARN: npm install failed"
else
log "no package.json — skipping install"
fi
log "ready: ${WORK_DIR}"
} >> "$JOB_LOG" 2>&1
# Output naar stdout zodat Claude het pad kan parsen.
echo "$WORK_DIR"