왜 했나?
기존 방식이 너무 귀찮아서..
- 직접 gradle 빌드
- FileZila 를 사용해 EC2로 jar 파일을 옮기기
- 서버로 가서 직접 컨테이너 내리고/기존이미지 삭제 후 이미지 만들고 컨테이너 올림
→ 너무 귀찮았다..
Kubernetes 적용은 나중에..
- 사실 처음엔 kubernetes 도 함께 적용할 예정이었으나
- 쿠버가 필요한 정도의 큰 서비스도 아니고
- 사실 쿠버 사용 리소스 지원이 안되어(EBS 및 인스턴스 크기..)
- 당장은 딱 CI/CD 만 적용하기로 함.
사용 기술
- Github
- Jenkins
- Ansible
- Docker
CI/CD 구성
- 코드가 test branch 에 푸쉬되면 github 에서 Jenkins 에게 웹훅으로 트리거를 보낸다.
- 젠킨스는 코드를 땡겨와 gradle 로 빌드한다. (clean build)
- test 성공 시에만 빌드된다.
- 젠킨스가 앤서블 서버로 아티팩트를 복사한다.
- 앤서블이 ansible-playbook 으로 배포한다.
- 기존 컨테이너 내리고 삭제
- 기존 이미지 삭제
- 새 이미지 만들고 그걸 토대로 컨테이너 올리기
- 용량 확보를 위해 빌드에 사용했던 파일들 삭제 (깃으로 땡겨온 코드들 삭제)
주의
- *.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
'개발 잡담' 카테고리의 다른 글
Jenkins 용량 부족, 결국...캐시 삭제(자동화) ㅡㅅㅡ (0) | 2024.06.11 |
---|---|
멀티 서버 Socket 통신에 Message Queue 사용하기 (0) | 2024.06.04 |
조회 쿼리로 성능 개선기 ^ㅅ^ /) ( 1.47s -> 886ms ) (1) | 2024.04.26 |
BDD 는 아는데 DDD는 무엇이냐 (0) | 2024.04.24 |
"IT 엔지니어를 위한 네트워크 입문"을 마치며 (0) | 2024.04.22 |