본문 바로가기
Jenkins

jenkins github docker 자동 배포 CI/CD

by 옹알이옹 2023. 9. 5.
목차

1. 자동 배포를 위한 환경 및 도구와 흐름

1-1. 환경 구성

1-2. 전체적인 흐름

2. Jenkins 설치와 구성

2-1. Jenkins 설치

2-2. Jenkins 환경 구성

3. 테스트

 


 

 1. 자동 배포를 위한 환경 및 도구와 흐름

 

1-1. 환경 구성

  • Ubuntu
  • Jenkins
  • Docker
  • Git hub
  • Spring boot
  • Gradle

1-2. 전체적인 흐름

jenkins 플로우

  1. 로컬 개발 환경에서 Git hub로 push를 날린다.
  2. 젠킨스와 git hub를 연동하여 push 이벤트 발생을 감지하여 코드를 받아와 빌드를 한다(jar파일 생성).
  3. mysql 이미지는 미리 docker-hub에 업로드 후 변경하지 않고 사용한다.
  4. 젠킨스는 막 생성한 jar 파일과 Docker file을 토대로 이미지를 생성한 뒤 docker-hub에 푸쉬한다.
  5. 개발 서버에서 docker hub에 올라온 이미지를 가져온다.
  6. 이미지를 통해 컨테이너를 실행한다.

Jenkins가 1번을 제외한 위의 행위들을 해주는 것이며, 파이프라인을 구성할 때 행위에 대한 shell script를 작성해야 한다.

 


 2. Jenkins 설치와 구성

 

2-1. Jenkins 설치

sudo apt install openjdk-11-jdk
wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add -
sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
sudo apt update
sudo apt install jenkins

 

  • 먼저 우분투 서버에 jenkins를 설치하기 위해 먼저 jdk를 설치한다.
  • 이후 jenkins 설치를 위한 인증키 추가하고 apt 패키지에 등록해 준다.
  • apt 패키지를 최신화한 후 젠킨스 설치
  • 젠킨스 설치 후 sudo cat /var/lib/jenkins/secrets/initialAdminPassword 명령어를 통해 jenkins 초기 비밀번호 확인
  • 설치가 완료되면 브라우저에 <서버 공인 IP:8080>를 입력하여 젠킨스 화면으로 이동할 수 있다.
    (network에서 8080 port에 대한 규칙을 열어주어야 한다.)
  • 이동하게 되면 처음에 비밀번호를 입력하는 창이 나올 텐데 그때 위에서 확인한 초기 비밀번호를 입력해 준다.
  • 이후 아이디와 비밀번호를 입력한 뒤 로그인을 해준다. 로그인을 하면 아래와 같은 화면이 보인다

jenkins dashboard

2-2. Jenkins 환경 구성

 

 1. Github 토큰 발급 및 등록

가장 먼저 해주어야 할것으로 Git hub 저장소의 토큰을 발급 받아야 한다.
해당 토큰을 통해 jenkins에서 github 저장소를 접근할 수 있다.

1. 먼저 계정을 눌러 해당 탭에서 설정을 들어간다.

github세팅

2. 이후 Developer Settings > Pseronal access token > Tokens(classic) 탭을 들어간 뒤 Generate new token을 눌러준다.

git token 생성 화면

 

3. 아래 화면처럼 토큰에 두 가지 권한을 준다 이후 Generate token을 눌러 발행한다.
(발행한 토큰값은 꼭 따로 저장해두어야 한다.)

  • repo : 젠킨스가 저장소에 접근하여 pull push 등을 할 수 있는 권한 부여
  • admin:repo_hook : 최종적으로 젠킨스가 push가 일어나는 걸 감지하고 자동으로 작업을 시작해야 하는데 그것에 대한 권한.

git token 권한

 

4. 이제 발급을 받았으니 jenkins에 등록해 준다.

 

 

 

 2. Jenkins project 생성 및 구성

 

1. 본격적으로 배포를 대행해 줄 jenkins 프로젝트를 생성한다.

jenkins project 생성

 

2. jenkins 프로젝트의 설정은 아래의 블로그를 참조하였고, 다른 부분만 서술한다.

https://kdg-is.tistory.com/270

 

 

3. Jenkins 빌드 유발

말 그대로 jenkins에게 작업 시작을 알리는 방법을 선택하는 것으로 필자는 Github의 hook trigger를 사용하였다.
해당 부분은 GitLab이라는 것을 사용하여 많이 하시던데 굳이 필요성을 못 느껴서 Github에서 지원하는 web_hook
을 사용하였다.

 

github web_hook 사용

4. 가장 중요한 부분인 shell 스크립트를 작성한다. * docker-hub에 dev라는 repo 생성한 뒤 진행

 

해당 부분은 두 가지로 나뉜다.

  • jenkins 서버 내에서 동작하는 Build Steps의 Execute shell
  • 대상 서버(개발 서버)에서 실행이 되는 빌드 후 조치의 Exec command

 

Build Steps의 Execute shell

# 빌드시 테스트 코드를 실행하지 않고 빌드한다.
./gradlew clean build -x test

# 캐시를 지우고 위에서 생성한 jar파일을 통해 images를 생성한다.
sudo docker build --no-cache -t <dockerhub ID>/dev .

# 도커 로그인
sudo docker login -u <dockerhub ID> -p <dockerhub pass>

sudo docker image tag dev <dockerhub ID>/dev || true

# docker hub에 막 생성한 이미지를 업로드한다.
sudo docker push <dockerhub ID>/dev

# 방금 만든 이미지를 로컬에서는 삭제한다.
sudo docker rmi -f <dockerhub ID>/dev || true

 

 

빌드 후 조치의 Exec command

# 현재 개발 서버 도커에 있는 spring 이미지를 삭제.
sudo docker rmi -f <dockerhub ID>/dev || true

# spring container 중지
sudo docker stop spring-container || true

# spring container 삭제
sudo docker rm -f spring-container || true

# spring-boot,mysql container 연동을 위해 docker network 생성
docker network create docker-network || true

# mysql 컨테이너를 위에서 생성한 docker-network로 실행
docker run -d --name mysql-container --network docker-network  -e MYSQL_ROOT_PASSWORD=1234  <dockerhub ID>/mysql-image2:latest 

# spring 컨테이너를 위에서 생성한 docker-network로 실행, local 해당 image가 없으면 자동으로 hub에서 다운
docker run -d -p 8081:8081 --name spring-container --network docker-network <dockerhub ID>/dev:latest

 

* 참고로 name은 아까 SSH연결을 미리 해놓았기 때문에 그때 입력한 name이 자동으로 고정되어 있음
  그리고 Sources 파일의 모든 파일을 사용한다 명시해야 함

 

build후 조취

 

 

여기까지 모두 작성한 뒤 git-hub 저장소에 push 행위가 일어나면 jenkins에서 빌드를 실행하지 않아도 알아서 시작됨.


 

 3. 테스트

현재 개발 서버가 정상적으로 실행이 된 상태이고 로컬 PC에서 git 저장소에 push를 날려 자동 빌드가 되는지 확인한다.

 

스프링정상동작확인

메인페이지3 이라는 고정값을 메인페이지 4로 수정한 뒤 저장소에 push 한다.

gitpushjenkins빌드
git push 후 자동 빌드 확인

 

최종적으로 push를 감지해 자동 빌드가 일어나고 개발 서버에 변경 사항이 반영된 것을 확인할 수 있다.

변경 확인
변경 사항 개발 서버에 자동 반영 완료

 

반응형

'Jenkins' 카테고리의 다른 글

jenkins git 연동 시 파일 권한 문제  (0) 2023.09.06