📢 개요
최근 학과에서 알고리즘 대회를 개최했었는데 대회에서 사용한 온라인 저지가 마음에 들지 않아 다음 대회를 위해 새로 개편한다는 소식이 있었다.
나도 그 프로젝트에 참여하게 되었고 내가 맡은 파트는 spring과 테스트 및 배포 자동화 환경을 운영/관리하는 역할이였다.
특히 배포 자동화 환경에 대해서는 꼭 경험해보고 싶은 분야였기 때문에 마침 좋은 기회인 것 같아 계속 포스팅하면서 공부해볼 생각이다.😊
💡 CI/CD의 전체적인 개념
- 애플리케이션 개발 단계를 자동화하여 보다 짧은 주기로 고객에게 제공하는 방법으로 핵심적인 부분만 말하자면 개발 - 빌드 - 테스트 - 배포까지의 전 과정을 자동화하는 것이 CI/CD이다.
- 이러한 구축 사례를 일반적으로 CI/CD 파이프라인이라고 부르며 애자일 방식의 협력을 통해 지원한다.
- 지속적인 통합(Continuous Integration), 지속적인 제공(Continuous Delivery), 지속적인 배포(Continuous Deployment)로 구성된다.
⭐ CI : 지속적 통합
- 개발을 진행하면서 지속적으로 코드에 대한 통합을 진행하는 것
- 개발의 편의성이 증가한다.
- 빌드 및 테스트를 거쳐 공유 레포지터리에 병합된다.
- 자동화된 테스트에서 기존 코드와 신규 코드 간의 충돌이 발생하면 CI를 통해 빠르게 수정 가능하다.
📍 CI를 하면 좋은 점
- 중간에 누군가 합류를 해도 빌드가 되는 코드를 받을 수 있다.
- 혼자서 개발할 때는 잘 체감하지 못하지만 여러 명이서 개발하는 프로젝트라면 매우 중요해진다.
- 직접 소스코드를 보고 디버깅을 하는 등 생산성이 떨어지게 된다.
- 항상 좋은 코드 퀄리티를 유지할 수 있다.
- 항상 테스트 코드를 통과하는 코드만 공유 레포지터리에 올라갈 수 있기 때문
⭐ CD : 지속적인 제공, 지속적인 배포
- 지속적인 제공
- CI를 통해 빌드와 테스트를 진행하고, 이를 통과한 코드에 대해 테스트서버와 운영서버에 자동으로 릴리즈하는 것
- 항상 배포할 수 있는 준비가 되어있는 소스코드를 자동으로 올라갈 수 있도록 한다.
- 지속적인 배포
- CI/CD 파이프라인의 마지막 단계
- 지속적인 제공을 거쳐 배포가능한 코드를 프로덕션 레벨로 릴리즈하는 것을 의미한다.
📍 CD를 하면 좋은 점
- 개발부터 배포까지 간소화되기 때문에 피드백을 빠르게 반영할 수 있다.
- 원클릭으로 빌드, 테스트, 배포를 자동화할 수 있다.(수작업x)
- 애플리케이션 배포의 위험성을 줄여주므로 변경 사항을 작은 조각으로 세분화하여 더 쉽게 릴리즈 할 수 있다.
프로젝트에서 사용할 툴
- Jenkins
- 장점
- 무료이다.
- Reference, 사용자가 많고 따라서 정보가 많다.
- 다양한 플러그인을 제공한다.
- 파이프라인 구성 자유도가 높다.
- 단점
- 직접 설치해서 서버를 운용해야한다.
- 프로젝트 별 보안 및 권한 설정이 불편하다.
💊 CI/CD의 흐름
- CI
- 자신이 개발한 코드를 Github 등 관리 시스템에 저장한다.
- 코드에 변동이 생기면 관리 시스템에서는 CI 툴(Jenkins)로 코드의 변경을 알린다.
- CI 툴에서는 변경된 코드를 Bulid, Test, Merge한다. 이 과정이 완료되면 통합 결과를 알린다.
- CD
- CI를 통해 코드를 검증한다.
- 배포환경과 유사한 곳(docker)에서 실행시켜본다.
- 검증된 소프트웨어를 실제 프로덕션 환경으로 배포한다.
🔔 전체적인 흐름
- Github에 소스코드를 푸시하면 Github에서는 Jenkins에게 알려준다.
- Jenkins에서 빌드-테스트를 진행하고 검증된 소스코드로 도커 이미지를 만든다.
- Jenkins 내부에 설정된 스크립트로 만들어진 도커 이미지를 Docker hub로 푸시한다.
- Jenkins에서 프로덕션 서버로 스크립트 실행 명령을 날린다. 해당 스크립트를 받은 운영서버는 Docker hub에서 이미지를 다운로드한 후 애플리케이션을 배포한다.