https://www.youtube.com/watch?v=sIPU_VkrguI&list=PLgXGHBqgT2TvpJ_p9L_yZKPifgdBOzdVH&index=43&pp=iAQB
- 컴파일 : 프로그래머가 작성한 코드를 기계어로 변환하는 과정
- 빌드 : 소스코드 파일을 컴퓨터에서 실행할 수 있는 소프트웨어 산출물로 만드는 과정
- 배포 : 빌드의 결과물을 사용자가 사용할 수 있는 환경에 배치하는 것
CI
- 지속적 통합(Continuous Integration)
- 여러명이 하나의 코드에 대해서 수정을 진행해도 지속적으로 통합하면서 관리할 수 있음을 의미
- 고객의 요구사항에 빠르게 대응하기 위해 나온 실천 방안
- 개발을 진행하면서도 품질을 관리할 수 있다
CI가 있기 전에는 주기적으로 분기 소스 코드들을 병합해야 했다.
이는 많은 수작업을 동반해서 많은 리소스를 낭비해야 했다. 또한 코드 병합할 때 에러가 발생하면 디버깅을 하는데에도 많은 시간이 소요되었다.
CI를 활용하면 작은 단위로 나누어서 코드를 완성할 때마다 자동으로 병합해서 비용을 줄일 수 있다.
CI의 4가지 원칙
- 모든 소스가 살아있고 누구든 현재 소스에 접근할 수 있는 단일 지점을 유지할 것
- 빌드 프로세스를 자동화해서 누구든 소스로부터 빌드할 수 있을 것
- 테스팅을 자동화해서 언제나 누구든 테스트를 수행할 수 있을 것
- 누구든 현재 실행 파일을 얻으면 가장 완전한 실행 파일을 얻었다는 확신이 들도록 할 것
CD
- 지속적 배포(Continuous Deployment)
- 빌드의 결과물을 프로덕션으로 릴리즈 하는 작업을 자동화하는 것을 의미
- 프로젝트의 규모가 커져서 서버가 매우 많아지면 모든 서버에 일일이 접속해서 배포 스크립트를 수동으로 실행시키는 것은 매우 비효율적인 작업이다. 이를 위해 CI의 연장선으로 나온 개념이 CD
CI/CD Tools
- Jenkins
- Travis CI
- Github Actions
무중단 배포
- 다운 타임 없이 서버를 운영할 수 있게 해주는 배포 방식
배포 자동화를 통해 서비스를 운영할 때 새로운 서비스를 추가하거나 업데이트할 때 기존 서비스를 종료하고 새로운 서비스를 시작해야 한다. 이 과정에서 기존 서비스를 종료하면 사용자들은 서비스를 이용하지 못하는데 이를 해결하기 위해 나온 개념이 무중단 배포이다
무중단 배포 구현 방법
- AWS에서 Blue-Green 무중단 배포
- 도커를 이용한 무중단 배포
- L4, L7스위치를 이용한 무중단 배포
- Nginx를 이용한 무중단 배포 → 쉽고 저렴하다는 점에서 인기가 많음
리버스 프록시
- 인터넷과 서버 사이에 위치한 중계 서버
- 클라이언트가 요청한 내용을 캐싱
- 서버 정보를 클라이언트로 부터 숨길 수 있어서 보안에 용이
로드 밸런싱
- 서버에 가해지는 부하를 분산해 주는 역할
- 하나의 서버가 멈추더라도 서비스 중단 없이 다른 서버가 서비스를 유지할 수 있는 무중단 배포 가능
무중단 배포 방식
- Rolling 배포
- 무중단 배포의 가장 기본적인 방식
- 서버를 차례로 업데이트 하는 방식
- 업데이트 시킬 서버를 로드밸런싱 라우팅을 해제하고 해당 서버를 업데이트 한 후 다시 라우팅 설정해주는 방식으로 업데이트
- 위 작업을 모든 서버에 반복해서 업데이트
- 인스턴스를 추가하지 않아도 돼서 관리가 간편
- 사용중인 인스턴스에 트래픽이 몰릴 수 있음
- 구버전과 신버전의 공존으로 인한 호환성 문제
- Canary 배포
- 신버전을 소수의 사용자에게만 배포
- 문제가 없는 것이 확인되면 점진적으로 다른 서버에 신버전 배포
- Rolling 배포와 마친가지로 일부 서버만 업데이트를 먼저 진행한 후 모니터링을 통해 문제가 없는것이 확인되면 나머지 서버도 업데이트하는 방식
- 문제 상황을 빠르게 감지 가능
- A/B 테스트로 활용 가능
- 모니터링 관리 비용이 든다
- 구버전과 신버전의 공존으로 인한 호환성 문제
- Blue/Green 배포
- Blue를 구버전, Green을 신버전으로 지칭
- 구버전과 동일하게 신버전 인스턴스 구성
- 신버전 배포시 로드 밸런서를 통해 신버전으로만 트래픽 전환
- 운영중인 서버와 대기중인 서버를 각각 두고 대기중인 서버에 업데이트를 진행한 후 업데이트한 서버로 트래픽을 변경시켜준다.
- 배포하는 속도가 빠르다
- 신속하게 롤백이 가능
- 남아있는 기존 버전의 환경을 다음 배포에 재사용
- 시스템 자원이 2배로 필요