본문 바로가기

Docker & Kubernetes

Docker - Jenkins 설치 및 배포 (Spring boot 프로젝트)

회사에서 연습하면서 정리한 내용입니다.

 

배포 환경을 구성하기전에 필요한 것들

1] docker 설치

2] jdk 설치 (azul/zulu-openjdk:8 image pull)

3] 프로젝트 및 VCS 생성

 

위의 3가지가 있어야 Jenkins를 통한 자동배포환경 세팅이 가능하다.

 

참고: https://xggames.tistory.com/22

 

로컬환경에서 Jenkins를 통한 자바 프로젝트 자동 빌드 & 배포를 설정하여 사용하는 방법에 대해서 소개

 

1] Jenkins docker image 다운로드

$ docker pull jenkins/jenkins:lts

......
......
......
(완료후)

$ docker images

# REPOSITORY          TAG       IMAGE ID       CREATED       SIZE
# jenkins/jenkins     lts       3f6389c017cc   3 weeks ago   566MB
# azul/zulu-openjdk   8         7c44729920e9   6 weeks ago   249MB
# mysql               5.7.18    44a8e1a5c0b2   3 years ago   407MB

# 정상설치확인

 

2] Jenkins 이미지를 컨테이너로 실행하기 + 초기비밀번호 확인

# docker run [옵션] [도커 이미지]

$ docker run -d -p 8081:8080 -v /Users/we/wemakeprice/jenkins:/var/jenkins_home -v /var/run/docker.sock:/var/run/docker.sock --name ep-java-jenkins -u root jenkins/jenkins:lts

# -v옵션은 컨테이너와 로컬볼륨을 mount 시켜줄 수 있는 옵션인데 아래와 같은 이유로 사용한다.
# 1. -v /Users/me/test/jenkins:/var/jenkins_home  => 나중에 컨테이너가 삭제되고 새로 컨테이너를 생성할 경우에, 세팅(저장)정보를 그대로 가져와서 사용할 수 있도록 마운트시켜두는 것이다
# 2. -v /var/run/docker.sock:/var/run/docker.sock  => docker in docker 기술을 사용하기 위해 마운트한다. (docker 컨테이너 내부에서 우리가 설치한 docker daemon에게 명령어를 전달 할 수 있도록 한다)

# 도커 컨테이너 bash쉘 접속
$ docker exec -it test-java-jenkins bash

# ========================================= docker 컨테이너 ====================================
# 초기 비밀번호 확인
$ cat /var/jenkins_home/secrets/initialAdminPassword
# (!) 출력되는 비밀번호를 복사해서 잘 가지고 있을 것
# =========================================================================================

 

3] Web으로 Jenkins 설치 & 접속하기

 

(위의 명령어로 사용했다면, localhost 포트번호는 8081)

초기 Admin Password 입력부분

=> 아까 컨테이너에 접속해서 복사했던 비밀번호를 여기에 넣어준다.

 

Install suggested plugins 선택
설치 진행중......... (시간이 조금 걸림) 설치가 완료될 때까지 기다리자.

=> Save and Continue 클릭

 

=> [Now now] - [Start using Jenkins] 클릭

 

Jenkins 설치 완료!

4] Jenkins내 필요 플러그인 설치 및 Global 설정

[Jenkins 관리] - [플러그인 관리] - [설치 가능]탭 에서 검색에 아래의 플래그인 검색후 설치

- Post build task: [빌드 후 조치] 작업가능

- Bitbucket: Bitbucket 저장소 연동 가능 (gitlab 이나 github도 사용이 가능. 예제에서는 Bitbucket을 사용하였다)

- docker-build-step: Jenkins에서 Docker 빌드를 사용하기 위한 플러그인

 

# 도커 컨테이너에 접속
$ docker exec -it ep-java-jenkins bash

# ========================================= docker 컨테이너 ===============================
# (도커 컨테이너내)에서 아래 명령어를 복사해서 입력
# (내 로컬PC에 떠있는 docker와 연동되며.. 자동화 배포설정시, docker 컨테이너 내에서 docker 명령어를 수행가능하도록 함)

$
apt-get update && \
apt-get -y install apt-transport-https \
ca-certificates \
curl \
gnupg2 \
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 명령어가 잘 실행되는지 확인
$ docker ps

# Java 확인
# 우리가 사용한 jenkins/jenkins 도커 이미지는 기본적으로 java8이 설치되어있을 것이다.
$ java -version

# JAVA_HOME 확인후 복사
$ echo $JAVA_HOME
# ====================================================================================

 

- 다시 Jenkins가 떠있는 WEB(localhost:8081)으로 돌아와서.. [Jenkins 관리] - [System Configuration] - [Global Tool Configuration] 으로 이동

 

- JDK의 JDK installations - ADD JDK 선택

- Name은 아무렇게나 써도됨. Install automatically 체크박스 해제, JAVA_HOME에다가 아까 docker 컨테이너에서 확인한 JAVA_HOME 경로를 입력

 

- GradleGradle installations - Add Gradle 선택

- Name은 역시 아무렇게 쓰고.. Install automatically는 체크박스 선택, 아래의 Version은 Gradle 6.8.2로 맞춰준다 (예제를 Gradle 6.8.2)

- 설정이 완료되었으면 아래 Save 클릭

 

5] Jenkins 빌드 프로젝트 생성

필요한 플러그인 설치 & 프로젝트 배포에 필요한 설정은 끝났고, 이제 배포할 프로젝트를 생성한다.

 

1) 새로운 Item - 상단 Name작성 - Freestyle project - OK 선택

 

2) 소스 코드 관리 메뉴에 Git 선택

(!) 프로젝트 코드가 들어가있는 git 저장소 연동이 필요하다.

- Gredentials에 있는 Add - jenkins를 통해 git 계정을 등록

저장소 추가 완료된 모습

 

3) Build의 Add build step 클릭하여 Invoke Gradle script 선택

 

4) Invoke Gradle - Gradle Version에 아까 설정했던 gradle version 선택

(!) 아래 [고급...] 버튼을 클릭하면 설정탭이 더 나오는데, 아래의 그림과 같이 작성진행

(!) [추가] (clean, bootJar) 대신 (clean build -x test) 명령어를 대신하여, test 작동을 생략시킬 수 있다.

 

 

5) Invoke Gradle script 아래에 Add build step을 클릭하여 Execute shell 클릭후, 아래의 내용들을 모두 추가.

(!) 순서가 변경되면 안된다. Build 항목 내, 위에서 아래로 순차적으로 실행된다.

# 예제에서는, 도커 이미지 이름은 "ep-springboot"로, 도커 컨테이너 이름은 "ep-web"으로 작성하였다. (변경가능)

# 이미지 Build
$ docker build -t ep-springboot .

# 기존에 동작중인 도커 컨테이너가 있다면 중단 & 삭제
$ docker ps -qa --filter "name=ep-web" | grep -q . && docker stop ep-web && docker rm ep-web || true

# 도커 컨테이너 생성 & 실행
=> mysql 컨테이너가 존재하는 경우.
$ docker run --rm -d --name ep-web -p 8080:8080 --link ep-mysql:ep-mysql ep-springboot

=> mysql 컨테이너가 존재하지 않는 경우.
$ docker run --rm -d --name ep-web -p 8080:8080 ep-springboot

# 불필요한 도커 이미지 삭제
$ docker rmi -f $(docker images -f "dangling=true" -q) || true

 

=> 설정 완료후, 저장

=> Build Now 클릭

(최초빌드시, gradle 설치 등의 과정이 진행되어서.. 시간이 조금 걸림)

 

Console Output 확인

정상적으로 배포확인