#!/usr/bin/env bash set -euo pipefail REPO_DIR="${REPO_DIR:-/opt/src/filecodebox}" TEST_DIR="${TEST_DIR:-/opt/1panel/apps/filecodebox/filecodebox-test}" PROD_DIR="${PROD_DIR:-/opt/1panel/apps/filecodebox/filecodebox}" BRANCH="${BRANCH:-test/custom-admin-ui}" IMAGE="${IMAGE:-local/filecodebox:test-custom-admin-ui}" PORT="${PORT:-40158}" COPY_PROD_DATA="${COPY_PROD_DATA:-0}" log() { printf '\033[1;34m[deploy-test]\033[0m %s\n' "$*"; } err() { printf '\033[1;31m[deploy-test]\033[0m %s\n' "$*" >&2; } require_cmd() { command -v "$1" >/dev/null 2>&1 || { err "missing command: $1"; exit 1; } } require_cmd git require_cmd docker require_cmd curl log "repo: $REPO_DIR" cd "$REPO_DIR" current_branch="$(git rev-parse --abbrev-ref HEAD)" if [[ "$current_branch" != "$BRANCH" ]]; then err "当前分支是 $current_branch,不是 $BRANCH。请先切到测试分支:git checkout $BRANCH" exit 2 fi if ! git diff --quiet || ! git diff --cached --quiet; then log "检测到未提交改动:会用当前工作区内容构建测试镜像" fi log "sync test deployment directory" mkdir -p "$TEST_DIR/custom" "$TEST_DIR/data" cp -a deploy/1panel/current-app/custom/fcb_extra_patch.py "$TEST_DIR/custom/fcb_extra_patch.py" cp -a deploy/1panel/test-env/Dockerfile "$TEST_DIR/custom/Dockerfile" cp -a deploy/1panel/test-env/docker-compose.yml "$TEST_DIR/docker-compose.yml" if [[ "$COPY_PROD_DATA" == "1" ]]; then log "refresh test data from production copy" mkdir -p "$TEST_DIR/backups" if [[ -f "$TEST_DIR/data/filecodebox.db" ]]; then cp -a "$TEST_DIR/data/filecodebox.db" "$TEST_DIR/backups/filecodebox.db.before-refresh.$(date +%Y%m%d%H%M%S)" fi rsync -a --delete "$PROD_DIR/data/" "$TEST_DIR/data/" fi log "build $IMAGE" cd "$TEST_DIR" docker compose build filecodebox-test log "start/recreate test container" docker compose up -d --no-build filecodebox-test log "wait for http://127.0.0.1:$PORT/" for i in $(seq 1 30); do if curl -fsS "http://127.0.0.1:$PORT/" >/tmp/filecodebox-test-index.html; then break fi sleep 1 if [[ "$i" == "30" ]]; then err "test environment did not become ready" docker logs --tail 80 filecodebox-test || true exit 3 fi done log "verify custom asset" if ! grep -q 'fcb-analytics.js' /tmp/filecodebox-test-index.html; then err "测试环境没有加载 fcb-analytics.js,部署异常" exit 4 fi docker ps --filter name=filecodebox-test --format 'table {{.Names}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}' log "OK: test environment is ready at http://127.0.0.1:$PORT/"