Docker

[Docker] Docker + Jenkins를 사용하여 스프링부트(maven) 프로젝트 자동 배포 하기!

서견 2023. 10. 18. 23:36

젠킨스 이미지 다운로드

docker pull jenkins/jenkins:lts

lts : 최신 버전

 

젠킨스 컨테이너 실행

docker run -d -p 9080:8080 -v /var/run/docker.sock:/var/run/docker.sock -v ~/Documents/jenkinsDir:/var/jenkins_home --name jenkins jenkins/jenkins:lts

 

옵션 정리

  • -d 백그라운드 실행
  • -p 매핑할 포트 ( : 기준으로 왼쪽은 호스트 포트 , 오른쪽은 도커 이미지 포트 )
  • -v : 기준으로 왼쪽은 호스트 경로 오른쪽은 컨테이너 내부 경로를 마운트함.컨테이너가 종료되어 삭제되어도 jenkins_home에 남아 있는 설정은 로컬에 남게 됨.
  • 단, 잘못된 설정으로 오류가 발생할 경우 로컬 경로의 설정 파일도 다 삭제해 줘야 함.
  • 즉, 호스트의 경로와 컨테이너 내부 경로를 바인딩 시켜줌 (양방향)
  • -name 컨테이너 이름 지정

 

📌 컨테이너 실행 시 에러

컨테이너 실행 시 에러

sudo chown 1000 <볼륨으로 사용할 디렉터리> 권한 부여 하면 해결.

 

젠킨스 컨테이너 실행 시 기본포트 변경 ( 8080 → 9091)

docker run -itd --env JENKINS_OPTS=--httpPort=9091 -p 9091:9091 -v /var/run/docker.sock:/var/run/docker.sock -v ~/Documents/jenkinsDir:/var/jenkins_home --name jenkins jenkins/jenkins:lts
  • itd는 Docker 컨테이너를 "인터랙티브 모드"(i)로 실행하고 "터미널 모드"(t)로 연결하며, 백그라운드(d)에서 실행하는 옵션.
  • i (Interactive): 컨테이너와 상호 작용하는 데 사용되는 표준 입력을 유지함. 이 옵션을 사용하면 컨테이너 내부의 터미널과 상호 작용할 수 있음.
  • t (TTY): 컨테이너와 연결된 가상 터미널을 할당함. 이 옵션을 사용하면 컨테이너 내부의 터미널과 유사한 환경을 얻을 수 있음.
  • d (Detached): 컨테이너를 백그라운드에서 실행됨. 컨테이너가 백그라운드에서 실행되면 콘솔에 로그가 표시되지 않음.

즉, -itd 옵션은 Jenkins 컨테이너를 백그라운드에서 실행하면서도 터미널과 상호 작용할 수 있도록 해줌. 이렇게 설정하면 컨테이너가 실행된 후에도 컨테이너에 연결된 터미널을 통해 컨테이너 내부로 접근할 수 있음.

 

젠킨스 컨테이너 내부 도커 설치

 

도커 컨테이너 내부 진입 (루트 계정으로 진입)

docker exec --user root -it < 컨테이너 ID > /bin/bash ( 안될시 /bin/sh )

 

도커 설치 명령어

apt-get update
apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release
curl -fsSL <https://download.docker.com/linux/debian/gpg> | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] <https://download.docker.com/linux/debian> $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
apt-get update
apt-get install -y docker-ce-cli

도커 정상 작동하는지 테스트

docker ps

로컬에서 돌아가는 도커 컨테이너 목록이 출력되어야함.

  • 호스트 docker.sock 를 젠킨스 컨테이너 내부에 마운트 해줬기 때문.

 

젠킨스 내부 설정

 

Install suggested plugins 선택 후 진행

Install suggested plugins 선택 후 진행

 

플러그인 자동 설치됨

플러그인 자동 설치됨

  • 플러그인이 설치되지 않을 경우 버전 확인( 버전이 낮으면 플러그인이 설치가 안됨 )

 

Item 생성

 

대쉬보드에서 새로운 Item 클릭

대쉬보드에서 새로운 Item 클릭

 

이름 작성 후 Freestyle project 선택

이름 작성 후 Freestyle project 선택

 

General 에서 Github project 선택 체크 후 Project url에 git repository url 입력

General 에서 Github project 선택 체크 후 Project url에 git repository url 입력

 

소스코드 관리에서 Git 선택 후 Repository URL에 git repository url 입력

Credentials 밑에 Add 선택 후 Jenkins 선택

소스코드 관리에서 Git 선택 후 Repository URL에 git repository url 입력, Credentials 밑에 Add 선택 후 Jenkins 선택

 

Username : 깃허브 profile 이름

Password : 깃 개인 액세스 토큰 값

ID : 키 등록시 사용할 이름

  • 깃 토큰 발행 시 엑세스 정의

 

브랜치는 자신이 배포 할 브랜치 명 작성.

브랜치는 자신이 배포 할 브랜치 명 작성.

 

빌드 유발에 GitHub hook trigger for GITScm polling 선택

빌드 유발에 GitHub hook trigger for GITScm polling 선택

 

빌드 스텝에서 Maven Version 에 mvn, Goals 에 clean package

빌드 스텝에서 Maven Version 에 mvn, Goals 에 clean package

 

Add build step 클릭 후 Execute shell 선택 후 명령어 입력.

Add build step 클릭 후 Execute shell 선택 후 명령어 입력.
Add build step 클릭 후 Execute shell 선택 후 명령어 입력.
Add build step 클릭 후 Execute shell 선택 후 명령어 입력.

 

 

젠킨스 컨테이너 배포 ( ngrok 사용 )

 

젠킨스 컨테이너 실행 시킬 때 마운트 해둔 로컬의 작업 폴더로 이동

난 ( ~/Documents/jenkinsDir/ )

 

ngrok 폴더 생성 ( 현재 경로 : ~/Documents/jenkinsDir/ )

mkdir ngrok

 

ngrok 최신 버전 다운로드

 

Download

$ ngrok config add-authtoken <token>

ngrok.com

wget <https://bin.equinox.io/c/bNyj1mQVY4c/ngrok-v3-stable-linux-amd64.tgz>

 

ngrok 압축 해제

tar -xvf ngrok-v3-stable-linux-amd64.tgz

 

젠킨스 컨테이너 접속

docker exec -it < 젠킨스 컨테이너 아이디 > /bin/bash

 

로컬에서 마운트 한 ngrok 폴더로 이동

난 ( /var/jenkins_home )

cd /var/jenkins_home/ngrok 

 

ngrok 사용해서 포워딩

./ngrok http <포트 번호>

ngrok 사용해서 포워딩

Forwarding 에 적힌 주소로 외부에서 접속 할 수 있음.

 

Git hub web hook 설정

 

배포 할 리포지토리 접속 후 Settings 에서 Webhooks 접속

배포 할 리포지토리 접속 후 Settings 에서 Webhooks 접속

 

Add webhook 선택

Add webhook 선택

Payload URL에 외부 접속 가능한 Jenkins 주소 입력 ( ngrok 링크 입력 ) 후 뒤에 /github-webhook/ 입력 . ( /github-webhook/ 입력 안할 시 Fobidden 에러 발생 )

Add webhook 클릭

이제 git에 푸쉬 하면 젠킨스 에서 알아서 수정 사항 반영 후 패키징 하여 도커로 배포 함.

끝!

 

젠킨스 컨테이너 도커 폴더 권한 부여

 

젠킨스 컨테이너 내부에서 권한 부여

$ chown jenkins:jenkins /var/run/docker.sock(마운트한 폴더)