229 lines
6.7 KiB
Plaintext
229 lines
6.7 KiB
Plaintext
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
|
|
'''
|
|
}
|
|
}
|
|
}
|
|
}
|