본문 바로가기
개발 잡담

CI/CD 도입..(with Jenkins)

by 휴일이 2024. 5. 29.

왜 했나?

기존 방식이 너무 귀찮아서..

  • 직접 gradle 빌드
  • FileZila 를 사용해 EC2로 jar 파일을 옮기기
  • 서버로 가서 직접 컨테이너 내리고/기존이미지 삭제 후 이미지 만들고 컨테이너 올림

→ 너무 귀찮았다..

Kubernetes 적용은 나중에..

  • 사실 처음엔 kubernetes 도 함께 적용할 예정이었으나
  • 쿠버가 필요한 정도의 큰 서비스도 아니고
  • 사실 쿠버 사용 리소스 지원이 안되어(EBS 및 인스턴스 크기..)
  • 당장은 딱 CI/CD 만 적용하기로 함.

사용 기술

  • Github
  • Jenkins
  • Ansible
  • Docker

CI/CD 구성

  1. 코드가 test branch 에 푸쉬되면 github 에서 Jenkins 에게 웹훅으로 트리거를 보낸다.
  2. 젠킨스는 코드를 땡겨와 gradle 로 빌드한다. (clean build)
    1. test 성공 시에만 빌드된다.
  3. 젠킨스가 앤서블 서버로 아티팩트를 복사한다.
  4. 앤서블이 ansible-playbook 으로 배포한다.
    1. 기존 컨테이너 내리고 삭제
    2. 기존 이미지 삭제
    3. 새 이미지 만들고 그걸 토대로 컨테이너 올리기
  5. 용량 확보를 위해 빌드에 사용했던 파일들 삭제 (깃으로 땡겨온 코드들 삭제)

주의

  • *.jar 를 기준으로 빌드하기로 설정해놔서 plan.jar 파일을 disable 하는 gradle 설정 추가 필요
  • Ansible 과 Jenkins 는 같은 서버 위에서 동작하지만 Jenkins 는 도커 위에 올려져있고 ansible 은 직접 설치되어 있음. 둘의 통신을 위해서는 ssh key 가 있어야 하고, 혹시 key 가 달라지는 경우에는 서로의 authorized_keys 파일을 변경해줘야 한다.
    • Jenkins 관리 → System → SSH Server 에 앤서블 서버로 우분투를 설정해놨음.
  • test 브랜치에 푸쉬될 때 트리거가 되도록 설정했는데, 보안을 위해 특정 토큰이 있는 웹훅 요청만 받기로 설정해놨다.
    • 토큰은 webhook 주소 파라미터로 설정해놨으니 깃허브나 젠킨스에 들어가서 쉽게 확인 가능.
  • 지금은 내 깃 아이디로 credential 을 설정해놨으나 추후 회사 admin 깃 계정으로 인증 변경하는 것이 필요함.
  • 현재 AWS EBS (볼륨) 이 30GiB 로 설정되어 있지만 Jenkins를 원활하게 사용할 수 있는 최소 권장 사항은 t2.medium Storage 50GiB 이다. (t3.large, 100GB 가 중간설정..) 추후 EBS 업그레이드가 필요해보인다.
    • 일단 도커 레지스트리를 사용하지 않음 / 빌드 후 파일 삭제로 최대한 용량을 확보해놨지만..
    • 캐시도 삭제했다. 빌드 시간은 늘어나도 용량은 더 확보했다...

 

 

도입 후기

 

새로운 프로젝트 테스트서버에 오늘부터 배포해놓고

수정 사항 있을 때마다 배포해보고있는데 아주아주 만족스럽 ^ㅇ^/)
특정 브랜치에 푸쉬만 하믄 바로바로 배포되는 마법! 만족 ! 또만족 @!

728x90