pipeline { agent any options { timestamps() disableConcurrentBuilds() } parameters { choice( name: 'TARGET', choices: ['admin', 'front', 'all'], description: '빌드와 배포할 API 서버를 선택합니다.' ) } environment { REGISTRY_HOST = 'registry.pjt.kr' DOCKER_CRED = 'registry-pjt' SSH_HOST = '121.160.234.222' SSH_PORT = '2001' SSH_USER = 'bigfuntnp' SSH_COMPOSE_DIR = '/srv/project/alist/compose' ADMIN_IMAGE_REPO = 'alist/api-admin' ADMIN_MODULE_DIR = '02-api-admin' ADMIN_COMPOSE_FILE = 'api-admin-compose.pjt.yml' ADMIN_ENV_FILE = '/srv/project/alist/env/api-admin/.env' FRONT_IMAGE_REPO = 'alist/api-front' FRONT_MODULE_DIR = '03-api-front' FRONT_COMPOSE_FILE = 'api-front-compose.pjt.yml' FRONT_ENV_FILE = '/srv/project/alist/env/api-front/.env' WORK_COMPOSE_DIR = 'deploy/pjt/compose' } stages { stage('1) Git check out') { steps { checkout scm } } stage('2) ImageTag create') { steps { script { env.SHORT_SHA = sh(script: 'git rev-parse --short HEAD', returnStdout: true).trim() env.IMAGE_TAG = "${env.BUILD_NUMBER}-${env.SHORT_SHA}" echo "TARGET = ${params.TARGET}" echo "IMAGE_TAG = ${env.IMAGE_TAG}" } } } stage('3) Build admin') { when { expression { params.TARGET == 'admin' || params.TARGET == 'all' } } steps { sh ''' set -e chmod +x ./gradlew ./gradlew :02-api-admin:bootJar ''' } } stage('4) Build front') { when { expression { params.TARGET == 'front' || params.TARGET == 'all' } } steps { sh ''' set -e chmod +x ./gradlew ./gradlew :03-api-front:bootJar ''' } } stage('5) Docker build admin') { when { expression { params.TARGET == 'admin' || params.TARGET == 'all' } } steps { sh ''' set -e docker build --no-cache \\ -t ${REGISTRY_HOST}/${ADMIN_IMAGE_REPO}:${IMAGE_TAG} \\ ${ADMIN_MODULE_DIR} ''' } } stage('6) Docker build front') { when { expression { params.TARGET == 'front' || params.TARGET == 'all' } } steps { sh ''' set -e docker build --no-cache \\ -t ${REGISTRY_HOST}/${FRONT_IMAGE_REPO}:${IMAGE_TAG} \\ ${FRONT_MODULE_DIR} ''' } } stage('7) Docker push') { steps { withCredentials([usernamePassword( credentialsId: DOCKER_CRED, usernameVariable: 'DOCKER_USER', passwordVariable: 'DOCKER_PASS' )]) { sh ''' set -e echo "$DOCKER_PASS" | docker login ${REGISTRY_HOST} -u "$DOCKER_USER" --password-stdin if [ "${TARGET}" = "admin" ] || [ "${TARGET}" = "all" ]; then docker push ${REGISTRY_HOST}/${ADMIN_IMAGE_REPO}:${IMAGE_TAG} fi if [ "${TARGET}" = "front" ] || [ "${TARGET}" = "all" ]; then docker push ${REGISTRY_HOST}/${FRONT_IMAGE_REPO}:${IMAGE_TAG} fi docker logout ${REGISTRY_HOST} ''' } } } stage('8) Deploy admin') { when { expression { params.TARGET == 'admin' || params.TARGET == 'all' } } steps { sshagent(['ssh-pjt']) { withCredentials([usernamePassword( credentialsId: DOCKER_CRED, usernameVariable: 'DOCKER_USER', passwordVariable: 'DOCKER_PASS' )]) { sh ''' set -e scp -P ${SSH_PORT} -o StrictHostKeyChecking=no \\ ${WORK_COMPOSE_DIR}/${ADMIN_COMPOSE_FILE} \\ ${SSH_USER}@${SSH_HOST}:${SSH_COMPOSE_DIR}/${ADMIN_COMPOSE_FILE} ssh -p ${SSH_PORT} -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \\ ${SSH_USER}@${SSH_HOST} ' set -e cd '"${SSH_COMPOSE_DIR}"' export IMAGE_TAG='"${IMAGE_TAG}"' echo '"$DOCKER_PASS"' | docker login '"${REGISTRY_HOST}"' -u '"$DOCKER_USER"' --password-stdin docker compose -p alist-api-admin --env-file '"${ADMIN_ENV_FILE}"' -f '"${ADMIN_COMPOSE_FILE}"' pull docker compose -p alist-api-admin --env-file '"${ADMIN_ENV_FILE}"' -f '"${ADMIN_COMPOSE_FILE}"' up -d --remove-orphans docker compose -p alist-api-admin --env-file '"${ADMIN_ENV_FILE}"' -f '"${ADMIN_COMPOSE_FILE}"' ps docker logout '"${REGISTRY_HOST}"' ' ''' } } } } stage('9) Deploy front') { when { expression { params.TARGET == 'front' || params.TARGET == 'all' } } steps { sshagent(['ssh-pjt']) { withCredentials([usernamePassword( credentialsId: DOCKER_CRED, usernameVariable: 'DOCKER_USER', passwordVariable: 'DOCKER_PASS' )]) { sh ''' set -e scp -P ${SSH_PORT} -o StrictHostKeyChecking=no \\ ${WORK_COMPOSE_DIR}/${FRONT_COMPOSE_FILE} \\ ${SSH_USER}@${SSH_HOST}:${SSH_COMPOSE_DIR}/${FRONT_COMPOSE_FILE} ssh -p ${SSH_PORT} -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \\ ${SSH_USER}@${SSH_HOST} ' set -e cd '"${SSH_COMPOSE_DIR}"' export IMAGE_TAG='"${IMAGE_TAG}"' echo '"$DOCKER_PASS"' | docker login '"${REGISTRY_HOST}"' -u '"$DOCKER_USER"' --password-stdin docker compose -p alist-api-front --env-file '"${FRONT_ENV_FILE}"' -f '"${FRONT_COMPOSE_FILE}"' pull docker compose -p alist-api-front --env-file '"${FRONT_ENV_FILE}"' -f '"${FRONT_COMPOSE_FILE}"' up -d --remove-orphans docker compose -p alist-api-front --env-file '"${FRONT_ENV_FILE}"' -f '"${FRONT_COMPOSE_FILE}"' ps docker logout '"${REGISTRY_HOST}"' ' ''' } } } } stage('10) Jenkins cleanup') { steps { sh ''' set -e if [ "${TARGET}" = "admin" ] || [ "${TARGET}" = "all" ]; then docker rmi ${REGISTRY_HOST}/${ADMIN_IMAGE_REPO}:${IMAGE_TAG} 2>/dev/null || true fi if [ "${TARGET}" = "front" ] || [ "${TARGET}" = "all" ]; then docker rmi ${REGISTRY_HOST}/${FRONT_IMAGE_REPO}:${IMAGE_TAG} 2>/dev/null || true fi docker image prune -f docker builder prune -f || true ''' } } } }