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. 전체적인 흐름
- 로컬 개발 환경에서 Git hub로 push를 날린다.
- 젠킨스와 git hub를 연동하여 push 이벤트 발생을 감지하여 코드를 받아와 빌드를 한다(jar파일 생성).
- mysql 이미지는 미리 docker-hub에 업로드 후 변경하지 않고 사용한다.
- 젠킨스는 막 생성한 jar 파일과 Docker file을 토대로 이미지를 생성한 뒤 docker-hub에 푸쉬한다.
- 개발 서버에서 docker hub에 올라온 이미지를 가져온다.
- 이미지를 통해 컨테이너를 실행한다.
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에 대한 규칙을 열어주어야 한다.) - 이동하게 되면 처음에 비밀번호를 입력하는 창이 나올 텐데 그때 위에서 확인한 초기 비밀번호를 입력해 준다.
- 이후 아이디와 비밀번호를 입력한 뒤 로그인을 해준다. 로그인을 하면 아래와 같은 화면이 보인다
2-2. Jenkins 환경 구성
1. Github 토큰 발급 및 등록
해당 토큰을 통해 jenkins에서 github 저장소를 접근할 수 있다.
1. 먼저 계정을 눌러 해당 탭에서 설정을 들어간다.
2. 이후 Developer Settings > Pseronal access token > Tokens(classic) 탭을 들어간 뒤 Generate new token을 눌러준다.
3. 아래 화면처럼 토큰에 두 가지 권한을 준다 이후 Generate token을 눌러 발행한다.
(발행한 토큰값은 꼭 따로 저장해두어야 한다.)
- repo : 젠킨스가 저장소에 접근하여 pull push 등을 할 수 있는 권한 부여
- admin:repo_hook : 최종적으로 젠킨스가 push가 일어나는 걸 감지하고 자동으로 작업을 시작해야 하는데 그것에 대한 권한.
4. 이제 발급을 받았으니 jenkins에 등록해 준다.
2. Jenkins project 생성 및 구성
1. 본격적으로 배포를 대행해 줄 jenkins 프로젝트를 생성한다.
2. jenkins 프로젝트의 설정은 아래의 블로그를 참조하였고, 다른 부분만 서술한다.
https://kdg-is.tistory.com/270
3. Jenkins 빌드 유발
해당 부분은 GitLab이라는 것을 사용하여 많이 하시던데 굳이 필요성을 못 느껴서 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 파일의 모든 파일을 사용한다 명시해야 함
여기까지 모두 작성한 뒤 git-hub 저장소에 push 행위가 일어나면 jenkins에서 빌드를 실행하지 않아도 알아서 시작됨.
3. 테스트
현재 개발 서버가 정상적으로 실행이 된 상태이고 로컬 PC에서 git 저장소에 push를 날려 자동 빌드가 되는지 확인한다.
메인페이지3 이라는 고정값을 메인페이지 4로 수정한 뒤 저장소에 push 한다.
'Jenkins' 카테고리의 다른 글
jenkins git 연동 시 파일 권한 문제 (0) | 2023.09.06 |
---|