#!/usr/bin/env bash # job-prepare.sh — zet een per-job working tree op # # Usage: job-prepare.sh # # Strategie: # 1. Bare cache van de repo onderhouden in $AGENT_REPO_CACHE/.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 " 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"