pipeline {
agent any
environment {
DOCKER_COMPOSE_VERSION = '1.29.2'
}
stages {
stage('gitlab_clone') {
steps {
git branch: 'BE', credentialsId: 'gitlab_token', url: '{GitLab 저장소 주소 HTTPS}'
}
}
stage('secret.yml download') {
steps {
withCredentials([file(credentialsId: 'db-credentials', variable: 'dbConfigFile'),
file(credentialsId: 'login-credentials', variable: 'loginConfigFile'),
file(credentialsId: 'aws-credentials', variable: 'awsConfigFile')]) {
script {
sh 'cp $dbConfigFile Back-end/api-module/src/main/resources/application-db.yml'
sh 'cp $loginConfigFile Back-end/api-module/src/main/resources/application-login.yml'
sh 'cp $awsConfigFile Back-end/api-module/src/main/resources/application-aws.yml'
sh 'cp $dbConfigFile Back-end/batch-module/src/main/resources/application-db.yml'
sh 'cp $loginConfigFile Back-end/batch-module/src/main/resources/application-login.yml'
sh 'cp $awsConfigFile Back-end/batch-module/src/main/resources/application-aws.yml'
}
}
}
}
stage('build') {
steps {
# 'Back-end'폴더 안에서 빌드 실행
dir('Back-end'){
sh "chmod +x ./gradlew"
sh "./gradlew clean build"
}
}
}
# 이전의 docker container, image 삭제
stage('docker-clean-up') {
steps {
script {
sshagent(credentials: ['ec2_ssh_key']) {
sh '''
if test "`docker ps -aq --filter ancestor=back/api-module`"; then
# 이전 컨테이너 중지
ssh -o StrictHostKeyChecking=no ubuntu@{ec2 서버 도메인 or IP주소} "docker stop $(docker ps -aq --filter ancestor=back/api-module)"
# 이전 컨테이너 삭제
ssh -o StrictHostKeyChecking=no ubuntu@{ec2 서버 도메인 or IP주소} "docker rm -f $(docker ps -aq --filter ancestor=back/api-module)"
# 이전 이미지 삭제
ssh -o StrictHostKeyChecking=no ubuntu@{ec2 서버 도메인 or IP주소} "docker rmi back/api-module"
fi
'''
sh '''
if test "`docker ps -aq --filter ancestor=back/batch-module`"; then
ssh -o StrictHostKeyChecking=no ubuntu@{ec2 서버 도메인 or IP주소} "docker stop $(docker ps -aq --filter ancestor=back/batch-module)"
ssh -o StrictHostKeyChecking=no ubuntu@{ec2 서버 도메인 or IP주소} "docker rm -f $(docker ps -aq --filter ancestor=back/batch-module)"
ssh -o StrictHostKeyChecking=no ubuntu@{ec2 서버 도메인 or IP주소} "docker rmi back/batch-module"
fi
'''
}
}
}
}
stage('docker-build'){
steps {
script {
echo 'Build Docker'
dir('Back-end') {
# 'Back-end' 폴더 안에서
script {
# docker image를 만들 때 아직 docker가 설치되지 않았다면 설치한다.
sh """
if ! command -v docker > /dev/null; then
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
fi
"""
# 루트 디렉토리에 있는 docker-compose.yml 파일 빌드
sh 'docker-compose -f docker-compose.yml build'
}
}
}
}
}
stage('Docker run') {
steps {
dir('Back-end') {
script {
sh 'docker-compose -f docker-compose.yml up -d'
}
}
}
}
}
}
참고) Multi Module 구조로 프로젝트를 설계했기에 api-module과 batch-module로 나뉘어져있다.
📂 Back-end └ 📂 api-module └ 📂 batch-module
✔ docker-compose.yml
version: '3'
services:
api-module:
build: ./api-module
image: back/api-module
ports:
- "8081:8081"
environment:
TZ: "Asia/Seoul"
batch-module:
build: ./batch-module
image: back/batch-module
ports:
- "8082:8082"
environment:
TZ: "Asia/Seoul"
✔ Dockerfile
FROM openjdk:11-jdk
WORKDIR /app
COPY build/libs/api-module-0.0.1-SNAPSHOT-plain.jar api-module.jar
CMD ["java", "-jar", "api-module.jar"]
✔ Dockerfile
FROM openjdk:11-jdk
WORKDIR /app
COPY build/libs/batch-module-0.0.1-SNAPSHOT-plain.jar batch-module.jar
CMD ["java", "-jar", "batch-module.jar"]