도커와 젠킨스를 이용한 스프링부트 CI/CD 설정 방법이다.
나의 작업 환경은 아래와 같다.
나는 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을 사용한다. 이 포트는 나중에 접속 포트로 사용될 것 이다.
이 후 생성된 프로젝트를 깃허브에 올려준다.
settings -> Developer settings -> personal access tokens 에서 토큰을 생성해준다. repo 접근 권한을 설정 후에 생성해주자. 본인 프로젝트가 private 일 경우 권한 설정을 해주지 않으면 접근이 불가능하므로 주의하자.
생성 후 키 값은 나중에 사용되므로 복사해두자.
우선 폴더 하나를 만들어서 들어가준다.
이 후 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
실행이 완료되면 컨테이터 해쉬값이 출력이 된다.
먼저 /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
이 후 차례대로 젠킨스 설정을 마무리한다.
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 클릭
젠킨스에 접속 후 Jenkins 관리 -> 시스템 설정 -> Add GitHub Server 클릭 후 Credentials ADD를 해준다.
Github Server 작성 완료 후 저장을 누르면 끝이다. 이제 마지막으로 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 클릭 후 작성 후 생성
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 컨테이너로 올라가게된다.
끝 !!
나와 같은 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