CI/CD란?
CI/CD는 프로젝트 빌드 - 테스트 - 병합 - 배포까지의 전 과정을 말한다. 많은 경우, CI/CD라고 하면 자동화를 포함한 뜻으로 사용한다.
CI (Continuous Integration)
CI는 지속적인 통합을 말한다.
변경하거나 추가한 소스 코드를 기존의 프로젝트와 통합하여 빌드하고 테스트하는 과정이 지속적인 통합이다. git
과 Travis CI
/Jenkins
같은 툴을 연동하여 CI를 자동화할 수 있다.
CI를 자동화했을 때 얻는 이점은 크게 세 가지인 것 같다.
-
새로운 소스코드가 기존 코드와 충돌을 일으키는지 검증할 수 있기 때문에 신속한 문제 해결 가능.
-
테스트와 빌드를 자동화함으로써 기계적인 반복을 줄이고 빠른 검증이 가능.
-
이 과정을 통해 완전한 배포 파일을 만들 수 있다.
하지만 테스트 코드를 작성하지 않았다면 CI를 구축하더라도 완전한 배포 파일이라는 것을 장담할 수 없다.
CD(Continuous Delivery & Continuous Deployment)
CD는 지속적인 전달과 지속적인 배포 두 가지를 뜻한다. CI를 거쳐 통합된 프로젝트를 프로덕션 환경으로 이동시키고(Delivery) 배포(Deploy)하는 것을 말한다. 이 과정을 AWS에서 제공하는 CD서비스인 CodeDeploy
와 Nginx
의 리버스 프록시 기능을 이용하여 중단 없는 배포 환경을 구성할 수 있다.
프로젝트에 CI/CD를 적용했을 때 구조는 이렇다. 위 프로젝트에 대입하여 CI/CD를 설명해보자면 이렇다.
CI
- 메인 브랜치에
push
하면 github이trigger
를 작동한다. - Travis CI가 프로젝트를 가져와 빌드 -> 테스트 -> 병합 과정을 거친다.
- 병합을 마친 프로젝트를
S3
에 업로드한다.
CD
CodeDeploy
는 배포 요청을 받으면 S3에서 프로젝트를 가져온다.- 프로젝트를 EC2서버로 옮기고 배포한다.
- Nginx를 reload한다.
여기서 nginx
는 리버스 프록시 서버다. 리버스 프록시는 클라이언트의 요청을 받아서 내부 서버로 요청을 위임한다. 위 표에 대입해서 말하자면 https://recipya.site 로 들어오는 모든 요청을 Nginx가 받아서 현재 실행되고 있는 8081(2) 포트를 사용하는 내부 서버 로 위임한다.
이 방식을 사용하면 새 버전이 릴리스되면 Nginx reload를 통해 새 버전으로 들어오는 요청을 위임할 수 있다. 따라서 새 버전이 릴리스 되더라도 중단없이 서비스를 운영할 수 있다. 이것이 중간에 리버스 프록시를 두는 이유다.
만약 프록시 서버를 경유하지 않고 요청을 받는다면 기존 서버를 닫고 새 서버를 실행하는 시간 동안은 서비스가 중단될 것이다.
참고
스프링부트와 AWS로 혼자 구현하는 웹 서비스(이동욱 저)
www.redhat.com/ko/topics/devops/what-cicd-pipeline
artist-developer.tistory.com/24
deveric.tistory.com/106
ko.wikipedia.org/wiki/%EB%A6%AC%EB%B2%84%EC%8A%A4_%ED%94%84%EB%A1%9D%EC%8B%9C
'infra' 카테고리의 다른 글
Amazon Linux 2 AMI Java 버전 변경 (0) | 2021.01.29 |
---|---|
Ubuntu 20.04 IP고정 (0) | 2020.09.25 |
Ubuntu 특정 port 죽이기 (0) | 2020.09.08 |