pipeline { agent any options { timestamps() buildDiscarder(logRotator(numToKeepStr: '20')) timeout(time: 15, unit: 'MINUTES') } environment { PROD_DIR = '/home/kyu/trading-prod' // Phase 1: project name 분리. running stack(trading-ai)과 충돌 방지. COMPOSE_PROJECT_NAME = 'trading-prod' HOME = '/home/kyu' } stages { stage('Checkout info') { steps { script { echo "Branch: ${env.BRANCH_NAME ?: 'n/a'}" echo "Commit: ${env.GIT_COMMIT ?: 'n/a'}" echo "Build : #${env.BUILD_NUMBER} on ${env.NODE_NAME}" } sh 'git log -1 --pretty=fuller || true' } } stage('Sync to PROD_DIR') { steps { sh ''' set -e echo "Syncing latest main to ${PROD_DIR}" cd "${PROD_DIR}" git fetch --all --prune git reset --hard origin/main git clean -fdx -e .env -e qdrant-config/config.yaml echo "--- after sync ---" git log -1 --oneline ''' } } stage('Validate compose (no deploy)') { steps { sh ''' set -e cd "${PROD_DIR}" echo "=== docker compose config (project: ${COMPOSE_PROJECT_NAME}) ===" docker compose config --quiet echo "OK: compose config valid" echo echo "=== compose ps (project ${COMPOSE_PROJECT_NAME} containers, if any) ===" docker compose ps || true ''' } } // Phase 2 (나중 활성화): 실제 배포 stage // stage('Deploy') { // steps { // sh 'cd "${PROD_DIR}" && docker compose up -d --remove-orphans' // } // } } post { success { echo "Phase 1 SUCCESS — PROD_DIR synced & validated. No containers touched." } failure { echo "FAILED — check logs" } } }