2 분 소요

서론

“MSA와 쿠버네티스를 활용한 클라우드 게이밍” 졸업 과제에서 인프라를 담당하게 되었습니다. 이제까지 해온 KEEPER나 Doore 프로젝트에서는 Github Action을 활용해서 CICD를 구축했습니다. 그 이유는 굉장히 단순한데 젠킨스 서버를 띄울 경제적인 여유가 없었기 때문입니다. 다행히 저희가 들어간 연구실 박사님께서는 최대한 지원을 해 주시겠다고 하셔서 이번에는 젠킨스를 활용해 CICD를 구축할 생각입니다.

아래에서는 Local 환경에서 Docker로 젠킨스를 띄우고, Spring boot 어플리케이션을 배포해 보는 과정을 알아보도록 하겠습니다.

Github Action vs Jenkins

성능

Jenkins vs Github Action 어떤걸 쓰는게 좋을까? 의 블로그 글을 보면 Jenkins가 약 40%이상 빠르다고 합니다. 깃 액션의 동작 과정을 생각해 보면, docker를 띄우고 관련한 툴을 가져온 다음 테스트 과정을 거치고, S3에 빌드된 결과물을 올리는 등등의 작업을 거치게 됩니다. 물론 빌드 과정 중에서 gradle 같은 것들은 캐싱해 사용하긴 하지만 젠킨스는 하나의 파이프라인을 위한 라이브러리가 저장되어 있기 때문에 속도가 훨씬 빠른 것 같습니다.

GUI

Github Action도 깔끔한 UI를 제공하고 있지만 개인적으로 젠킨스의 UI가 더욱 마음에 듭니다. 깃액션은 깃허브에 종속되어 있어 뭔가(?) 무거운 느낌이 들지만 젠킨스는 CICD만을 위한 UI를 제공하기 때문에 되게 깔끔해 보였습니다.

동시 빌드

저번 KEEPER 핫 픽스때 실수로 dev 서버와 prod 서버에 동시에 CICD를 돌려버렸는데 뭔가 꼬여서 배포가 실패했던 경험이 있습니다. 젠킨스는 실행 큐를 늘림으로써 이러한 에러를 쉽게 해결할 수 있을 것 같습니다.

깃 시크릿

깃 액션의 깃 시크릿은 정말로 말이 많았습니다. 보안적으로는 굉장히 우수하나 문서화가 제대로 되어있지 않으면 유지보수가 굉장히 어렵습니다. KEEPER 프로젝트에서 문서화가 잘 되어있지 않아, yml이 어떤식으로 작성되어있는지 감으로 때려 맞춰야 했고, 감으로 때려맞추다가 DB와의 커넥션이 끊어지고, 다운되는 등 다양한 일들이 많았습니다. 다행히 DB passowrd 부르트포싱에 성공해 복구를 했지만 깃 시크릿이 너무 싫어졌습니다.

Jenkins 설치 방법

젠킨스는 도커를 사용해 아주 손쉽게 컨테이너화 할 수 있습니다. DockerHub에서 이미지를 다운받고 아래의 명령어로 볼륨을 맺으면서 실행하면 됩니다. 볼륨을 맺는 이유는 컨테이너가 죽어서 회생이 불가능해진다면 지금까지 작성한 스크립트가나 기록이 전부 날라가기 때문입니다.

sudo docker run \
--name jenkins \
-d \
-p 8888:8080 \
-p 50000:50000 \
-v myvol:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
-u root \
jenkins/jenkins:lts-jdk17

위의 명령어로 실행시킨 후 초기 비밀번호를 입력하고 통합 플러그인을 다운받으시면 준비 끝입니다.

로컬 배포

깃 pull

새로운 아이템 > Freesyle project에 들어간 다음 소스 코드 관리에 Git을 선택합니다. 여기서 주의해야 할 것은 브랜치 이름입니다.

life

gradle build && jar 파일 보내기

깃허브에 저장된 코드를 가져온 다음의 행위를 결정해야 합니다. gradlew로 빌드 후 jar 파일을 로컬로 가져와야 하기 때문에 아래처럼 작성합니다.

life

SSH Publihser 설정

Jenkins에서 빌드 후 나온 결과물(Jar)을 바로 로컬에 가져올 수 없습니다. Publisher Over SSH라는 플러그인을 설치하고 환경 변수를 수정해줘야 합니다.

life

이미지에서 볼 수 있는 Key 값은 scp 사용하여 원격 서버에 배포하기의 과정을 따라하시면 됩니다. 물론 로컬에서 키 값을 발급받아야 합니다. 다른 EC2 서버에 보내야 한다면 그 EC2에서 키 값을 발급받으면 됩니다.

~/.ssh/authorized_keys에 id_rsa.pub 키를 등록하고, Jenkins에서 Key에는 id_rsa 값을 등록하시면 됩니다. 주의하셔야 할 점은 chmod로 authorized_keys에 권한을 부여하셔야 합니다. 또, 이렇게 설정하고 Test Configuration을 눌렀는데 fail이 뜨신다면 mac 유저분들은 아래의 사진처럼 원격 로그인 설정을 on 해주셔야 합니다.

life

CICD 돌린 후 로컬 파일 확인

CICD 과정이 성공하면 로컬에 .jar 파일이 저장되어 있습니다. 그 jar 파일을 실행시킨다면 spring boot가 톰캣을 띄워주는 것을 확인하실 수 있습니다.

life

결론

개인적으로 젠킨스가 깃 액션보다 UI 적으로나 성능적으로나 이번 프로젝트에 맞는 것 같습니다. 젠킨스는 도커로 쉽게 설치할 수 있고, 빌드 스크립트 작성또한 굉장히 쉬웠습니다. 자세한 설치 과정은 위의 본문에서 확인하실 수 있습니다.

카테고리:

업데이트: