도커 & 젠킨스를 이용한 스프링부트 CI/CD

안유태·2022년 7월 11일
0

도커와 젠킨스를 이용한 스프링부트 CI/CD 설정 방법이다.
나의 작업 환경은 아래와 같다.

  • Springboot 2.7.1
  • Java 11
  • Amazon EC2 t2.micro (프리티어)
  • ubuntu 22.04
  • Jenkins 2.358
  • Docker 20.10.17

1) 스프링부트 프로젝트 생성

나는 Java 11, gradle을 사용했다. 본인 환경에 맞춰 생성해주자.
생성 후 프로젝트 최상단에 Dockerfile을 생성해주자.

FROM openjdk:11-jre-slim
EXPOSE 8081
ARG JAR_FILE=./build/libs/본인프로젝트이름-0.0.1-SNAPSHOT.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-jar", "/app.jar"]

나는 Java 11에 맞추어 설정해 주었고 JAR_FILE은 본인 환경에 맞춰 넣어준다. 포트는 8081을 사용한다. 이 포트는 나중에 접속 포트로 사용될 것 이다.
이 후 생성된 프로젝트를 깃허브에 올려준다.

2) Github access token 생성

settings -> Developer settings -> personal access tokens 에서 토큰을 생성해준다. repo 접근 권한을 설정 후에 생성해주자. 본인 프로젝트가 private 일 경우 권한 설정을 해주지 않으면 접근이 불가능하므로 주의하자.
생성 후 키 값은 나중에 사용되므로 복사해두자.

3) Docker Image 생성 및 실행

우선 폴더 하나를 만들어서 들어가준다.
이 후 Dockerfile을 작성해준다.

FROM jenkins/jenkins:jdk11

#도커를 실행하기 위한 root 계정으로 전환
USER root

#도커 설치
COPY docker_install.sh /docker_install.sh
RUN chmod +x /docker_install.sh
RUN /docker_install.sh

#설치 후 도커그룹의 jenkins 계정 생성 후 해당 계정으로 변경
RUN groupadd -f docker
RUN usermod -aG docker jenkins
USER jenkins

Dockerfile에서 사용될 docker_install.sh도 작성해주자.

#!/bin/sh
apt-get update && \
apt-get -y install apt-transport-https \
  ca-certificates \
  curl \
  gnupg2 \
  zip \
  unzip \
  software-properties-common && \
curl -fsSL https://download.docker.com/linux/$(. /etc/os-release; echo "$ID")/gpg > /tmp/dkey; apt-key add /tmp/dkey && \
add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/$(. /etc/os-release; echo "$ID") \
$(lsb_release -cs) \
stable" && \
apt-get update && \
apt-get -y install docker-ce

두 파일을 동일한 경로에 위치시켜주고 빌드를 한다.

docker build -t jenkins/myjenkins .

빌드가 완료되면 빌드된 이미지를 확인해주자. jenkins/myjenkins가 올라와 있으면 성공이다.

docker images

빌드된 이미지를 실행해줄 것 이다. 아래 명령어를 사용하여 실행하자.

docker run -d -p 9090:8080 --name=jenkinscicd \
-v /home/ubuntu/jenkinsDir:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
jenkins/myjenkins

실행이 완료되면 컨테이터 해쉬값이 출력이 된다.

4) Jenkins 설정

먼저 /var/run/docker.sock에 대한 권한을 주어야한다.
현재 실행 중인 컨테이너의 ID를 확인하자.

docker ps -a

컨테이너의 ID를 확인 후 쉘에 직접 접근을 하자. ID는 3자리까지만 입력하면 알아서 매핑이 된다.

docker exec -it -u root 컨테이너ID /bin/bash

로그인 후 권한을 주기 위해 그륩을 바꿔준 후 재시작을 해주자.

chown root:docker /var/run/docker.sock
docker restart 컨테이너ID

재시작 후 9090 포트로 젠킨스에 접속을 해주면 관리자 패스워드를 입력하라고 나온다. 이는 아래 명령어를 통해 확인 가능하다.

docker logs 컨테이너ID

이 후 차례대로 젠킨스 설정을 마무리한다.

5) Github webhook 설정

CI/CD 자동화를 위해서는 젠킨스의 ssh 키 값이 필요하다. 아래 명령어를 통해 id_rsa.pub와 id_rsa의 내용을 복사해두자. 참고로 id_rsa는 --- 부분도 모두 복사해야한다.

docker exec -it 컨테이너ID ssh-keygen
docker exec -it 컨테이너ID cat /var/jenkins_home/.ssh/id_rsa.pub
docker exec -it 컨테이너ID cat /var/jenkins_home/.ssh/id_rsa

Github webhook을 이용할 깃허브 프로젝트에 들어가서 Setting -> Webhooks -> Add webhook을 클릭한다.

Setting -> Deploy keys -> Add deploy key 클릭

  • Title : 각자 알아서
  • Key : 5번에서 복사한 id_rsa.pub 값

젠킨스에 접속 후 Jenkins 관리 -> 시스템 설정 -> Add GitHub Server 클릭 후 Credentials ADD를 해준다.

  • Kind : Secret text
  • Secret : 2번에서 복사한 access token 키 값
  • ID : 깃허브 ID

Github Server 작성 완료 후 저장을 누르면 끝이다. 이제 마지막으로 Item 설정이 남았다.

6) Item 설정

먼저 아래 과정을 진행해준다.
Dashboard > Jenkins 관리 > Security > Git Host Key Verification Configuration
Host Key Verification Strategy : Accept first connection

새로운 Item 클릭 후 이름을 입력하고 Freestyle project 클릭 후 OK를 눌러준다.
Github project 클릭 후 깃허브 주소를 입력해준다.
소스코드 관리에서 Git 클릭 후 깃허브 ssh 주소를 입력하고 Credentials의 Add 클릭 후 작성 후 생성

  • Kind : SSH Username with private key
  • ID : key 이름. 각자 알아서
  • UserName : 깃허브 profile 이름
  • Private Key : 5번에서 복사한 id_rsa 값

Github hook trigger for GITScm polling를 체크한다.
마지막으로 Build에서 스프링부트 빌드 및 배포 설정을 해주자.
Add build step -> Execute shell 클릭 후 아래 명령어를 입력해준다. 명령어를 하나 입력할 때 마다 Execute shell을 새로 추가하여 입력해주자.

chmod +x gradlew
./gradlew clean build
docker build -t jenkins/testapp .
docker ps -q --filter "name=jenkins-testapp" | grep -q . && docker stop jenkins-testapp && docker rm jenkins-testapp | true
docker run -p 8081:8080 -d --name=jenkins-testapp jenkins/testapp
docker rmi -f $(docker images -f "dangling=true" -q) || true

작성 후 저장을 누르면 Docker & Jenkins를 이용한 Springboot CI/CD 자동 배포가 완료된다.
Springboot project를 푸쉬를 할 때 마다 Jenkins에서 스프링부트가 빌드되어 새로운 Docker 컨테이너로 올라가게된다.

끝 !!

추가) EC2 t2.micro 메모리 부족 현상

나와 같은 t2.micro를 사용하는 사람들이라면 위 작업까지 완료 후 깃허브 push를 통해 젠킨스 빌드를 하게 되면 서버가 멈추거나 먹통이 될 것이다. 이는 메모리 부족으로 인한 현상으로 swap을 이용하여 메모리를 늘려주어 해결이 가능하다. 아래 블로그를 참고하여 해결하길 바란다.
https://sundries-in-myidea.tistory.com/102

참고 사이트

https://velog.io/@hind_sight/Docker-Jenkins-%EB%8F%84%EC%BB%A4%EC%99%80-%EC%A0%A0%ED%82%A8%EC%8A%A4%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-Spring-Boot-CICD
https://pooney.tistory.com/86

profile
공부하는 개발자

0개의 댓글