[CI/CD] Jenkins Pipeline 으로 Docker에 SpringBoot 프로젝트 이미지 띄우기

RUNGOAT·2023년 6월 18일
0

CI/CD

목록 보기
8/11
post-custom-banner

1️⃣   Pipeline 설정

새로운 Item 클릭

Pipeline을 선택 후 해당 Pipeline의 이름을 설정하여 생성한다.

하단의 Definition 을 Pipeline script로 선택


2️⃣   Back-end pipeline script

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'
                    }
                }
            }
        }
    }
}

3️⃣   Back 프로젝트에 작성할 것

참고) 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"

api-module

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"]

batch-module

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"]

📌참고

profile
📞피드백 너무나 환영
post-custom-banner

0개의 댓글