TY_Daily

Jenkins를 이용한 CI/CD 구축하기 -4 (백엔드 build & 배포 성공) 본문

SSAFY프로젝트

Jenkins를 이용한 CI/CD 구축하기 -4 (백엔드 build & 배포 성공)

TY_TaeYeon 2024. 8. 2. 02:02

- 서버가 초기화 되었다.. 그래서 Dockerfile을 이용한 배포로 바꾸었다.

 

- 먼저 현재의 도커는 docker out docker가 불가능한 구조로 되어있다 (해당 볼륨을 연결하지 않았기 때문) [참고]

 

- 도커를 멈춘후 

$ docker stop 컨테이너이름
$ docker commit 컨테이너이름 원하는새repository이름:원하는새tag

 

sudo docker run -d -p 8080:8080 -v /home/ubuntu/jenkins-data:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock --name jenkins2 jenkins_backup:latest

 - 해당 명령어를 통해 다시 실행한다 앞서와 차이라면 -v 을 /var/run/docker.sock를 통해 연결했다는 점이다.

 

- Dood Docker out of Docker로 진행하면서 도커 내에서도 도커 명령어를 입력하기 위해 다음과 같은 명령어 사용!

 

<주의!> 그래도 도커 안에 도커는 설치 안해도 도커 클라이언트은 설치해야한다 (cli!) docker ps -a 를 통해 docker exec 명령어를 통해 docker 컨테이너 속으로 접속! 

[docker cli 설치 참고 url] 도커 버전을 확인후 (로컬 docker 버전) 아래 명령어 입력 (도커 컨테이너 안에서!!!! 아래 도커 명령어 입력!)

DOCKER_VERSION=27.1.1
curl -fsSL https://download.docker.com/linux/static/stable/x86_64/docker-$DOCKER_VERSION.tgz | tar zxvf - --strip 1 -C /usr/local/bin docker/docker

 

- whoami 명령어를 통해 전킨슨의 사용자가 jenkins인것을 확인할수 있었다!

- docker group 안에 jenkins 사용자의 권한을 부여하는것으로

-

sudo groupadd docker
sudo usermod -aG docker jenkins
newgrp docker
docker restart 젠킨슨 컨테이너

 

- 이렇게 해도 안됬는데 그이유는 Docker 소켓의 권한이 변경되지 않아서다!

- 해답으로는 아래 명령어를 통해 Docker 소켓의 권한을 변경하는 것이다!!!! (로컬에서 진행해도 됬었음!)

sudo chmod 666 /var/run/docker.sock

 

* Dockerfile 생성

- 이번 서버 초기화 후 CI/CD 구축에 Dockerfile을 통한 구축을 진행하였다!.

 

 

이제 해야할일은 Webhook 등록하기, aws 백그라운드가 아닌 도커 컨테이너를 통한 run 실행,  nginx, Fronted CI/CD 구축, 무중단 배포이렇게 진행될 예정이다

pipeline{
	agent any
    
    stages{
    	stage('gitclone'){
        	steps{
            	git branch: 'master',
             	credentialsId: 'KTY2', 
            	url: "https://lab.ssafy.com/s11-webmobile3-sub2/S11P12D101.git"
            }
        }
        
        
         stage('aws property file download play cp execute') {
	        steps {
    	        withCredentials([file(credentialsId: 'db_properties', variable: 'dbConfigFile')]) {
            script {
                // 파일 존재 여부 확인
                def filePath = '/var/jenkins_home/workspace/D101-final/BE/o2o/src/main/resources/application-aws.properties'
                def fileExists = sh(script: "test -f ${filePath} && echo true || echo false", returnStdout: true).trim()

                if (fileExists == 'true') {
                    // 파일이 존재하면 삭제 후 복사
                    sh "rm ${filePath}"
                }
                // 파일 복사
                sh "cp ${dbConfigFile} ${filePath}"
            }
		        }
	        }
         }
    
        stage('Docker_Build Backend') {
            steps {
                dir('/var/jenkins_home/workspace/D101-final/BE/o2o/'){
                   
                    sh 'ls -al'
                    sh 'whoami'
                    
                    sh 'groups jenkins'
                    sh 'docker ps -a'
                    sh 'docker build -t tem .'
                     }
            }
        }

    }
}

일단 build 를 위한 이렇게 파이프라인 작성했다!

docker build -t tme . 이 명령어는 현재 디렉토리에서 Dockerfile을 읽어서 이미지를 만들어주고 그 이미지를 tem이라는 이름의 id로 만들어서 작업해주는것이다!

(팁! docker run -p 3000:80 IMAGEID  이렇게 입력하면 url:3000 이라고 입력하면 컨테이너에 80번 포트로 들어가게 도니다!)

 

 

FROM openjdk:17-jdk-alpine

# 작업 디렉토리 설정
WORKDIR = /app

COPY . .

RUN ls -al

RUN pwd
# Gradle 빌드
RUN rm -rf .gradle

RUN chmod +x ./gradlew && ./gradlew clean build

ARG JAR_FILE=./build/libs/o2o-0.0.1-SNAPSHOT.jar
COPY ${JAR_FILE} ./app.jar
ENV TZ=Asia/Seoul
ENTRYPOINT ["java", "-jar", "./app.jar"]

 

 

일단 Dockerfile 을 /BE/020/Dockerfile (020 아래 gradle, src가 존재!) 이렇게 작성했는데 간단하게 보면 

 

- 일단  openjdk:17-jdk-alpine 이 버전이 사용 ( xargs not available  이오류가 나서!!!!!)

- WORKDIR은 도커 이미지에서 어디서 작업할지 의미! (그냥 default라 생각해도 될듯..)

- COPY . . 의 의미 왼쪽에 있는 . 은 현재 있는 파일들에서 Dockerfile제외하고 모든 파일을 의미 오른쪽 .은 image내부를 의미하는것이다 즉 Dockerfile을 제외한 모든 파일을 내부 image로 복사!

- 이유는 모르겠으나 항상 .gradle을 삭제하고 gradlew clean build를 해줬을때 오류 없이 계속 진행할수 있었다!

 

(최종 젠킨스 파이프 라인)

pipeline{
	agent any
    
    stages{
    	stage('gitclone'){
        	steps{
            	git branch: 'master',
             	credentialsId: 'KTY2', 
            	url: "https://lab.ssafy.com/s11-webmobile3-sub2/S11P12D101.git"
            }
        }
        
        
         stage('aws property file download play cp execute') {
	        steps {
    	        withCredentials([file(credentialsId: 'db_properties', variable: 'dbConfigFile')]) {
            script {
                // 파일 존재 여부 확인
                def filePath = '/var/jenkins_home/workspace/D101-final/BE/o2o/src/main/resources/application-aws.properties'
                def fileExists = sh(script: "test -f ${filePath} && echo true || echo false", returnStdout: true).trim()

                if (fileExists == 'true') {
                    // 파일이 존재하면 삭제 후 복사
                    sh "rm ${filePath}"
                }
                // 파일 복사
                sh "cp ${dbConfigFile} ${filePath}"
            }
		        }
	        }
         }
        
        
        

        
        
        stage('Docker_Build and Deploy Backend') {
            steps {
                dir('/var/jenkins_home/workspace/D101-final/BE/o2o/'){
                   
                    sh 'ls -al'
                    sh 'whoami'
                    
                    sh 'groups jenkins'
                    sh 'docker ps -a'
                    // my_container가 존재하면 멈추고 삭제하기
                    sh '''
                       if [ "$(docker ps -aq -f name=my_container)" ]; then
                            docker stop my_container
                            docker rm my_container
                        fi
                    '''
                    
                    
                    
                    // 'tem'이라는 이미지가 존재하는지 확인하고 삭제
                    sh '''
                        if [ "$(docker images -q tem 2> /dev/null)" != "" ]; then
                            docker rmi tem
                        fi
                    '''

                    sh 'docker build -t tem .'
                    // 위 명령어까지 진행되면 
                    
                    // 컨테이너가 존재하면 삭제
                    sh '''
                    if [ "$(docker ps -aq -f name=my_container)" ]; then
                        docker rm -f my_container
                    fi
                    '''
                    // 새로운 컨테이너 생성
                    sh 'docker run -d --name my_container -p 8000:8000 tem'
                    
                    
                     }
                
                
            }
        }

    }
}

'SSAFY프로젝트' 카테고리의 다른 글

젠킨슨 공통2  (0) 2024.10.10
젠킨슨 백업  (0) 2024.08.07
Jenkins를 이용한 CI/CD 구축하기 -3  (0) 2024.07.31
Jenkins를 이용한 CI/CD 구축하기 -2  (0) 2024.07.30
Jenkins를 이용한 CI/CD 구축하기 -1  (0) 2024.07.30