본문 바로가기
개발/개발 방법 정리

[gitlab] spring boot(gradle)+jenkins+docker을 이용한 자동 배포 구축

by 슴새 2023. 3. 17.
반응형

 

spring boot+gradle 프로젝트 작업중인 gitlab 브랜치가 있는데...

여기 푸시가 발생하면  자동으로 감지하고 배포하도록 cicd를 구축할 것이다.

 

일단 ec2에 putty를 이용하여 접속해준다.(putty아니어도 상관은 없겠지만 나는 푸티가 좋아)

사용할 포트들은 다 열어놓은 상태라고 가정.

 

sudo apt install openjdk-11-jdk

자바 설치하고

sudo apt-get update
sudo apt-get install docker.io

도커를 설치한다.

docker run -d --name jenkins -p 7777:8080 -v /jenkins:/var/jenkins_home -v /usr/bin/docker:/usr/bin/docker -v /var/run/docker.sock:/var/run/docker.sock -u root jenkins/jenkins:lts

도커를 이용해 젠킨스 컨테이너를 런 한다.

이미지 없다고 알아서 이미지도 풀 받아주고 컨테이너를 만들어준다.

ec2의 도커와 젠킨스의 도커가 같은 도커였으면 좋겠어서 옵션을 주었다.

이런 방식을 dood라고 하는것 같다.

 sudo usermod -aG docker root

혹시 모르니까 도커 권한도 주기

 

나는 젠킨스를 7777:8080에서 돌리고 있다.

인터넷 주소창에 ip주소:7777 입력해 젠킨스에 접속한다.

 

docker ps로 젠킨스 컨테이너의 아이디를 확인하고,

docker exec -it 젠킨스컨테이너아이디 bash

로 젠킨스 컨테이너에 입장한다.

cat /var/jenkins_home/secrets/initialAdminPassword

위 명령어로 젠킨스의 비번을 확인한 후 그 비번을 이용해 젠킨스에 입력한다.

추천하는 플러그인을 깔아준다.

플러그인 설치 끝남

계정...적당히 생성하고

 

Jenkins 관리- 플러그인 매니저 들어가서

필요한것 같은 추가로 플러그인들을 설치한다.

- command agent launcher

- docker pipeline

- docker

- generic webhook trigger

- gitlab

- gitlab branch source

- oracle java se development kit installer

- publish over ssh

- ssh agent

일단 이정도 설치했음

 

설치 끝났으면 새로운 아이템 클릭

만듦

이름은 spring 이라고 지어주었다.

 

반응형

빌드 트리거에 build when a change is pushed~~ 선택해줌

이제 스크립트를 짜야한다. 오른쪽 위에 헬로월드는 기본 틀 쓰기 귀찮아서 눌러봤다..

아래 파란 글씨 pipeline syntax를 선택해서 git clone 해오는 코드를 생성하도록 하자

git 선택하고 깃랩 주소 입력

클론해올 브랜치의 이름은 develop_backend

credentials을 즉석에서 추가하기 위해 add 클릭

(미리 만들어둔게 있으면 그걸 써도 ok)

username with password로 생성해준다.

유저네임은 그냥 깃랩 유저네임이고

놀랍게도 비밀번호에 깃랩 가입 시 쓴 이메일을 입력해야 했음(이것때문에 좀 헤맸다)

내가 비번을 이메일로 한것인가 아니면 젠킨스가 깃랩가입메일을 비번으로 취급하는것인가...

 

방금 만든 credential을 설정해주면 에러가 없어진다.

generate pipeline script 클릭하면 코드가 생성됨

고이 복사해준다.

 

pipeline {
    agent any
     
    stages {
        stage('gitlab clone') {
            steps {
                아까 생성된 코드를 복붙
            }
        }
        stage('build') {
            steps {
                sh '''
                chmod +x ./gradlew
                ./gradlew clean bootJar
                '''
            }
        }
        stage('docker image') {
            
            steps {
                
                sh '''
                docker rmi backend || true
                docker build -t backend .
                '''
                
            }
        }
        stage('docker run') {
            
            steps {
                
                sh '''
                docker stop backend || true
                docker rm backend || true
                docker run -d --name backend -p 8080:9999 backend
                '''
                
            }
        }
        
    }
}

방금 만든 것을 활용하여 스크립트를 작성해준다. 

각 스테이지에 대한 설명을 하자면

git clone 스테이지: 깃을 클론해온다.

build 스테이지: 클론해온걸 빌드한다. 

docker image  스테이지: 빌드파일 가지고 이미지를 만든다. 이미지 이름은 백엔드라고 했다.

docker run 스테이지: 만든 이미지를 가지고 컨테이너를 만든다. 컨테이너 이름도 백엔드라고 했고 8080:9999에서 돌린다. 

 

 

클론해올 레포의 브랜치 가서 프로젝트 루트에 도커파일을 생성한다.

FROM openjdk:11-jdk
EXPOSE 9999
COPY build/libs/*.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

도커파일은 초간단으로 작성함.

 

이 이미지는 openjdk 11을 기반으로하며

노출할 포트는 9999이고

로컬의 build/libs에 있는 jar 파일을 도커 컨테이너 내부의 /app.jar 경로로 복사한 후

컨테이너가 시작될때 java -jar /app.jar 명령어를 실행한다 뭐 이런 의미이다.

 

이제 '지금 빌드'를 누르면 빌드-배포가 진행되고

링크로 들어가보면 스프링의 기본 에러 문구가 떠있는 걸 볼 수 있다. (프론트단을 전혀 안만들어서 에러가 뜨고 있는 모습)

 

이제 내가 '지금빌드' 버튼을 안눌러도 푸시가 발생하면 알아서 빌드-배포하도록 웹훅을 설정해야함

젠킨스관리-시스템 설정 들어가서 gitlab 정보 입력

credentials은 아까랑 똑같은데 종류를 gitlab api 토큰으로 만들어줘야함

gitlab api 토큰은 gitlab 가서 만들고 값 복사해오면 됨

이제 저장하면 깃랩이랑 젠킨스랑 연결이 되었고

다시 파이프라인 설정하는데로 돌아가서 표시한 부분 url을 고이 복사해둔다.

고급을 누르고 밑으로 좀 내려보면 시크릿토큰 생성하는 버튼이 있는데, 눌러서 생성한 후 얘도 복사해둔다.

 

gitlab 들어가서 setting-webhook들어가고

url이랑 시크릿 토큰에 아까 복사해둔 값들을 넣는다.

그리고 푸시이벤트에 브랜치 이름도 작성

add webhook 누르면 웹훅 설정 끝

이제 develop_backend 브랜치에 푸시가 발생하면 알아서 배포가 진행된다.  

 

일단 이렇게 간단 cicd 구축을 완료했고, 파이프라인 스크립트도 좀 다듬고,입맛에 따라 이런저런 기능을 추가하면 될 것 같다.

반응형

댓글