본문 바로가기

개발

Kotlin으로 만든 디스코드 봇 Jenkins 적용기

반응형

학교 급식, 시간표를 빠르게 보기 위한 용도로 제작된 디스코드 봇이 있습니다.

 

(대충 이런 느낌)

 

해당 디스코드 봇은 Kotlin에 JDA 라이브러리를 이용했는데 번거롭고 귀찮던 배포 과정을 Jenkins로 간단하게 줄이면서 있었던 일들을 써볼까 합니다.

불편했던 기존 과정

기존 과정은 정직한 방법(?)이었습니다.

 

1. Gradle로 빌드 & .jar 패키징

2. 서버에 FTP로 .jar 파일 전송

3. SSH 접속 후 Docker image build

4. Docker 컨테이너 재시작

 

간단하면서도 복잡하게 보였던 이 과정을 봇을 업데이트할 때마다 하자니 번거롭습니다.

마침 Jenkins로 배워봐야겠다 싶어 이 과정을 Jenkins로 자동화해보았습니다.

Jenkins를 써보자!

(아래 과정은 GitHub 계정 등록, Gradle · Docker 연동 등 준비 과정이 완료된 상태로 쓰는 개발기입니다.)

 

Jenkins를 처음 구축하고 들어가면 새로운 프로젝트(한글 번역: 새로운 Item)를 만들 수 있습니다.

이후 원하는 이름을 써주고 Freestyle project로 시작하면 됩니다.

 

여담으로 Jenkins 신버전에서는 Pipeline 추가로 기존 과정보다 더 간편하게 가능한 듯합니다.
기회가 되면 다뤄보는 걸로

 

GitHub 연결하기

프로젝트 설정 화면에서 GitHub project를 체크해 GitHub repository를 연결해주고 소스 코드 관리에서도 Git을 선택해

연결해줍시다. 사진에서는 안 나오는데 빌드 유발 칸에서는 GitHub hook trigger for GITScm polling를 체크해줍시다.

 

Build 칸으로 들어오면 요청이 들어왔을 때 수행할 작업을 정할 수 있습니다.

해당 디스코드 봇은 Gradle로 빌드를 하기 때문에 clean 명령어와 shadowJar 명령어를 실행하게끔 추가했습니다.

.jar 패키징을 완료했으면 Docker image build를 해야 합니다. Execute shell을 추가해서 서버에서 실행될 명령어를 입력해줍니다.

 

여기서는 이미지 빌드를 하기 위한 docker build 명령어를 이용했습니다. 참고로 build를 하기 위한 Dockerfile은 소스코드 루트에 위치시켜야 합니다.

 

docker build --tag kronosbot .

 

docker build 명령어가 끝냈으면 이 이미지로 컨테이너를 만들어 시작해야 됩니다. 다만, 기존 컨테이너가 올라가 있으면 실행되지 않으므로 기존 컨테이너를 종료하고 삭제하는 명령어를 추가해줍시다.

 

docker ps -q --filter "name=kronosbot" | grep -q . && docker stop kronosbot && docker rm kronosbot || true

kronosbot 컨테이너가 있으면 중지하고 삭제합니다.

 

삭제가 되었으니 이제 새로운 컨테이너를 올릴 수 있습니다. docker run 명령어를 이용해 컨테이너를 올려줍니다.

 

최종 모습 (밑에 명령어 한개 더 있음)

 

해당 디스코드 봇은 Selenium을 필요로 하기 때문에 같이 재시작해줍시다.

 

글 쓰면서 생각났는데 굳이 같이 재시작할 필요는 없겠네요

GitHub Webhook 연동하기

제가 원하는 건 GitHub에 push를 했을 때 작업이 이루어지는 겁니다. 이를 위해 GitHub에 Webhook을 추가해줍시다.

위에서 설정한 Repository - Webhooks 설정에서 추가를 해줍니다. Payload URL은 http(s)://jenkins url/github-webhook/ 형태입니다.

 

GitHub Webhooks

 

편해진 배포 과정

Jenkins와 연동을 시키고 GitHub에 push를 하면 자동으로 빌드되고 배포까지 됩니다!

더 이상 FTP에 접속하고 직접 배포하는 일을 하지 않아도 됩니다.

 

빌드 기록

 

다음번에는 React로 만든 Static Page도 Jenkins에 연동해보려고 합니다.

또 GitHub에서 Actions이라는 Jenkins와 같은 CI 툴을 내놨습니다. 이것도 나중에 써봐야겠습니다.

반응형