[Spring Boot] Jenkins 이용하여 CICD 구축하기(1)

모지리 개발자·2022년 10월 6일
7

CICD

목록 보기
1/2
post-custom-banner

Intro

프로젝트를 진행하면서 간단하게 CICD를 구축해야했었습니다. 이 글은 Jenkins를 이용하여 간단하게 CICD를 구축하면서 느꼈던 점들과 시행착오에 대해서 작성한 글입니다.

내가 하고싶은 것

항상 무엇인가를 시작하기 전에는 내가 뭘 하고싶은지, 어떤식으로 시작할지 정리하고 하는게 더 빠르고 더 효율적으로 작업할 수 있다고 생각하여 어떤식으로 CICD를 구축할지 우선 생각해보았습니다.

아래의 그림은 제가 하고싶었던 방식입니다.

굉장히 단순하죠?
1. Intellij에서 코드를 작성하고 Push한다.
2. GitHub는 jenkins로 Webhook을 날린다.
3. Jenkins에서 Test와 Build를 한다.
4. ssh 통신을 통해 ubuntu 서버에 build된 jar 파일을 옮기고 실행한다.

정도입니다.

고민했던 것들

AWS vs Ncloud

사실 AWS를 쓰고싶긴했습니다. 기능은 2가지 모두 비슷할거라고 생각했지만 AWS를 이용하여 프로젝트를 많이 해오기도 했었고 익숙해서 AWS를 사용하고싶었지만! 돈이 없는 관계로ㅎㅎ Ncloud를 사용했습니다. 또 사용해보면서 느낀거지만 NCloud가 너무 편한점도 많았습니다. 우선 한글이었거든요. 그리고 설명도 상세하게 잘 나와있어서 편했습니다.

Naver Cloud Platform 할인크레딧에 들어가보시면 신규로 가입하게 되면 10만원이나 줍니다. 알뜰하고 야무지게 사용해보도록 하겠습니다.

Docker를 사용해볼까?

언제부턴가 주변에 Docker를 이용하여 프로젝트를 진행한 프로젝트를 많이 보았습니다. 그래서 사실은 나도 해야하나...싶었습니다. 그래서 고민을 해봤습니다. 우선 Docker가 왜 필요한지에 대해 고민해보았습니다.
Docker는 MSA가 대세로 떠오르면서 MSA의 단점인 복잡성을 해결해주고 서비스의 관리를 용이하게 해준다는 장점이 있다고 합니다. 근데 내 프로젝트에 필요한가..? 라는 생각이 들었습니다.

우선 이번 프로젝트는 MSA로 진행하지 않을 예정이었습니다. 위에서도 언급했지만 프로젝트를 배포해서 실제 유저를 만나보는 것 정도가 이번 프로젝트의 목표였습니다.

그리고 궁극적으로 Docker를 사용하지 않기로한 이유는 잘 몰라서 였습니다.
컨테이너 기반의...어쩌구 저쩌구

과거에 무작성 프로젝트에 신기술을 도입해봤던 적이 있습니다. 솔직히 멋있었거든요. 이력서에 나 이거 써봤다. 써보고싶었습니다. 그때 도입했던 기술은 HASURA라는 기술이었습니다. 하지만 도입하고 후회했습니다. 처음써보는 기술이었고, 프로젝트는 기간 내에 완수해야하고 팀원들마다 HASURA에 대한 습득력도 다 다르고, 결국 HASURA는 자연스럽게 할줄 아는 사람만 건드리게 되는..그런 식으로 변해갔습니다. 그리고 그때 무작정 좋은 기술있다! 하고 도입하는 것은 오히려 안좋은 결과를 만든다는 것을 느꼈습니다.

현재 진행하고 있는 프로젝트가 끝나야할 기간까지는 1달 정도가 남았고 팀원들 중에 Docker에 대해 제대로 이해하고있거나 혹은 관리라도 가능한 팀원이 있다면 고민해봤겠지만 Docker를 제대로 알고 있는 팀원이 없기도 했고 도입하게 되면 Docker를 프로젝트를 하는 중 공부를 해야하는 또 다른 나의 리소스를 투입해야하기 때문에 우선은 미뤄두었습니다.

그래서 "이번 프로젝트에서는 Docker를 사용하지 말자"는 아니고 "각자 공부를 해보고 도입할 수 있으면 하자" 로 변경 되었습니다.

Server 생성하기

위의 플로우차트를 보면 알 수 있지만 저는 2개의 서버가 필요했습니다.
하나는 Jenkins서버이고 하나는 Ubuntu서버 였습니다.

jenkins 서버 생성하기

jenkins 서버는 Jenkins 서버 생성 가이드를 참고했습니다.
구축한 서버 환경에 대해 작성해두겠습니다.
CentOS-7.8
사양은 [Compact] 1vCPU, 2GB Mem, 50GB Disk [g1] 입니다.
Compact-g1 Server는 개발 테스트 용도나 서버 성능 이유가 적은 개인 커뮤니티 혹은 소규모 웹사이트 운영에 이용시 가격대비 좋은 서버라고 합니다. 그리고 월 34000원이고 이보다 한단계 더 높은 standard급은 월 8만원 가량이기에 부자가 아닌 저에게는 Compact 사양의 서버가 적당했습니다.

서버 생성 후 세팅은 KKKK_HHHH님의 블로그를 참고했습니다.
참고로 젠킨스 버전 업데이트 하는 과정에서 에러가 발생한다면

wget https://get.jenkins.io/war-stable/latest/jenkins.war --no-check-certificate

로 변경하여 입력하면 잘 됩니다.

ubuntu 서버 생성하기

OS는 ubuntu-18.04이고
서버 사양은 [Standard] 2vCPU, 4GB Mem, 50GB Disk [g1] 으로 설정했습니다. Standard로 설정한 이유는 우선 이 서버가 비즈니스로직 호출에 대한 대부분의 호출을 담당 할 것이기 때문에 jenkins 서버보다는 좋은 사양으로 만들어두었습니다.

처음부터 어느정도 사양으로 서버를 구축하는 것이 좋겠다! 라고 정할 수 있으면 정말 좋겠지만 당장은 감이 안와서 후에 네이버에서 제공해주는 ngrinder로 테스트 하면서 scale up 혹은 scale out을 진행할 예정입니다.

할일 정리하기

서버 2대는 모두 생성되었고 github에는 Spring boot로 이루어진 프로젝트를 올려두었습니다. github repo 링크 입니다.

해야할 일은 크게 2가지 입니다.
1. 젠킨스와 github 연동
2. 젠킨스와 ubuntu서버 연결

젠킨스와 github 연동하기

step

  • GitHub Token 발행하기
  • GitHub repo webhook 설정하기
  • Item 만들기

GitHub Token 발행하기

Github 홈페이지에서 우측 상단의 프로필 사진을 클릭한 후 Setting 메뉴를 클릭해줍니다. 그 후 왼쪽 메뉴 중 Developer settings를 클릭해줍니다.

Personal access token을 클릭 한후 Generate new token을 클립합니다. 저는 위 사진과 같이 설정하고 생성했습니다. 발급되서 보여지는 토큰 값은 이제 두번 다시 보지 못하므로 다른 곳에 메모해두는 것이 좋습니다.

GitHub repo webhook 설정하기


repo에서 settings을 선택하고 webhooks 메뉴를 선택합니다.
저는 이미 webhook을 생성한 상태라서 있다고 나오지만 없으시면 우측 상단의 Add webhook을 클릭해주시면 됩니다.

웹훅 추가 시 주의 사항

  • payload URL - 젠킨스 서버 주소에 github-webhook/ 경로를 추가해줍니다.
  • Content type - application/json 타입을 사용합니다.
  • Add webhook 버튼을 누릅니다.

    위의 사진은 제가 작성한 내용입니다.

Credentials 만들기


왼쪽의 Jenkins관리를 클릭 한후 Manage Credentials 메뉴를 선택해줍니다.

그 후 (global) 링크를 눌러 Credentials 등록 화면으로 이동합니다.
Credentials 등록화면에서 Add Credentials 버튼을 누릅니다.


제 설정은 위의 사진과 같습니다.

Username : Github 사용자 이름
Passsord : 위에서 발급받은 Github 액세스 토큰
ID : 유니크한 아무 별칭을 작성해 주시면 됩니다.

Item 만들기

왼쪽의 + 새로운 Item 버튼을 클릭 합니다. 그 후 freestyle project로 생성해보겠습니다.




제 설정 값은 위와 같습니다. 저는 develop branch를 기준으로 작성했지만 다른 분들은 branch를 추가해주시거나 변경해서 사용하시면 될 것 같습니다.
(제 코드를 기준으로)
이제 develop branch에 push가 되면 jenkins서버로 webhook이 날아가게 됩니다.

자 이제 webhook이 날아갔으니 build를 해보자

우선 제 스프링 프로젝트의 gradle 버전은 7.4였습니다.
gradle version은
> gradle > wrapper > gradle-wrapper.properties 에서 확인하실 수 있습니다.

jenkins에서 gradle을 생성해주도록 하겠습니다.
아래와 같이 Jenkins관리 -> Global Tool Configuration 메뉴를 클릭해줍니다.


원하는 gradle version을 지정해주신 다음에 저장을 해주시면 됩니다.

그 후 위에서 만들었던 freestyle project를 다시 들어간 후 Build Steps에서 Invoke Gradle script를 클릭하고

위의 사진과 같이 설정해주시면 됩니다.

Task는 나중에 더 복잡해질 예정이지만 우선은 간단하게만 작성해두었습니다.

프로젝트 왼쪽의 지금 빌드 버튼을 클릭해봅시다.

빌드가 잘 되었습니다.


이렇게 Github과 jenkins를 연동해서 빌드까지 해보았습니다. 다음글에서는 ssh 연결을 통해 외부 서버에 jar파일을 복사하며 CD가 가능하도록 해보겠습니다.

제가 잘못이해하고 있거나 잘못 작성한 부분이 있다면 지적, 비판, 피드백 뭐든 해주시면 감사하겠습니다!

profile
항상 부족하다 생각하며 발전하겠습니다.
post-custom-banner

0개의 댓글