MSA 구조로 총 5개의 서버를 운영하다 보니, 서버의 코드를 수정할 때마다 GitHub에 코드 푸시, Docker 이미지 패키징, 서버에서 이미지 가져오기, 그리고 Docker-Compose 재실행 작업을 반복해야 했습니다. 이 과정이 개발 작업 시간을 지연시켜, 자동화가 필요했습니다.
Docker와 Jenkins를 이용해서 CI/CD 자동화 시스템을 구축해보자!
Jenkins는 오픈 소스 자동화 서버로서, 소프트웨어 개발과 배포 프로세스를 자동화하는 데 사용됩니다. CI/CD(Continuous Integration/Continuous Deployment) 파이프라인의 핵심 구성 요소로서, 개발자들이 코드 변경 사항을 지속적으로 통합하고 배포할 수 있도록 도와줍니다.
a. 소스 코드 가져오기 (Pull Source)
b. 프로젝트 빌드 (Build Project)
c. Docker 이미지 푸시 (Push Docker Image)
a. 배포 요청 (CD Request)
b. 이미지 가져오기 (Pull Image)
c. 배포 (Deploy)
이미지를 다운로드합니다.
다운로드를 확인합니다.
[명령어 설명]
docker run -d -p 9090:8080 -v /jenkins:/var/jenkins_home --name jenkins -u root jenkins/Jenkins
-d
이 옵션은 컨테이너를 백그라운드에서 실행하도록 설정
-p
포트 매핑 옵션입니다. 왼쪽의 포트 번호는 호스트(외부) 포트 번호이고, 오른쪽의 포트 번호는 컨테이너 내부의 포트 번호
-v
볼륨 마운트 옵션입니다. 이 옵션은 호스트와 컨테이너 간의 디렉토리 공유를 설정
Jenkins가 실행중인 것을 확인할 수 있습니다.
global 클릭
Credential을 등록해줍니다.
Repository에서 Settings > Webhooks
Webhooks을 연결해줍니다.
GitHub 계정에 로그인합니다.
오른쪽 상단의 프로필 아이콘을 클릭한 후, 드롭다운 메뉴에서 Settings를 선택합니다.
설정 페이지의 왼쪽 사이드바에서 Developer settings를 클릭합니다.
Personal access tokens 메뉴를 선택하고 Generate new token 버튼을 클릭합니다.
토큰에 이름과 필요한 권한을 지정한 후, Generate token 버튼을 클릭하여 새로운 토큰을
생성합니다.
필요한 권한
repo : 리포지토리에 접근하고 조작할 수 있는 권한입니다.
admin:repo_hook : 리포지토리 웹훅을 관리할 수 있는 권한입니다.
Jenkins home -> 새로운 item -> pipeline -> 이름 설정
Build Triggers 부분에 Github의 Webhook 기능이 활성화 될 수 있도록 체크합니다.
Jenkins 홈 -> Jenkins 관리 -> system
SSH를 연결해줍니다.
Jenkins 설정
Jenkins 홈 -> 관리 -> 시스템 설정 : Jenkins 홈 화면에서 Manage Jenkins를 클릭한 후,Configure System을 선택합니다.
SSH 키 설정
상단에 id_rsa 키 값 입력 : 화면 상단에 복사한 id_rsa 키 값을 입력합니다.
SSH 설정
[코드 설명]
실행되고 있는 애플리케이션이 있다면 종료하고 다시 배포한다는 내용
Jenkins 홈 -> Jenkins-ss-server 클릭 -> 지금 빌드 클릭 -> 빌드 성공
/home/ubuntu 디렉토리에 project라는 폴더가 생기고 위의 설정한 /project/server 경로에 .jar파일이 생성된 것을 볼 수 있습니다.
설치할 플러그인
도커허브에서 토큰 발급합니다.
Multibranch Pipeline 생성
Github credential을 누르고, github주소를 입력합니다.
Jenkins 파일 설명
Set Executable Permissions 단계
sh 'chmod +x gradlew': gradlew 파일에 실행 권한을 부여합니다.
Gradle Build 단계
sh './gradlew clean build': Gradle을 사용하여 프로젝트를 클린 빌드합니다.
Docker Build 단계
dockerImage = docker.build repository + ":$BUILD_NUMBER": Docker 이미지를 빌드하고, 태그를 repository:빌드 번호 형식으로 지정합니다. 빌드된 Docker 이미지 객체는 dockerImage 변수에 저장됩니다.
Login 단계
sh 'echo $DOCKERHUB_CREDENTIALS_PSW | docker login -u $DOCKERHUB_CREDENTIALS_USR --password-stdin': Docker Hub에 로그인합니다. 환경 변수 DOCKERHUB_CREDENTIALS_USR와 DOCKERHUB_CREDENTIALS_PSW를 사용하여 자격 증명을 전달합니다.
Push 단계
sh 'docker push BUILD_NUMBER': 빌드된 Docker 이미지를 Docker Hub 리포지토리에 푸시합니다.
프로젝트에 사용할 bb-server를 docker-compose 파일로 올리고 실행하였습니다.
젠킨스와 mariadb, bb-server가 실행되고 있는 것을 보실 수가 있습니다.
bb-server를 수정해보겠습니다. HelloWorld를 반환하는 컨트롤러를 추가하였습니다.
깃허브에 푸시합니다.
Jenkins Pipeline 단계가 정상적으로 실행됩니다.
push전에는 99koo/bb-server가 하나이지만
변경된 내용이 적용되는 것을 확인할 수 있습니다.
총 5개 서버 중 제가 작업중인 세개의 서버를 연결하여 MSA 프로젝트에 적용중입니다.