만약? 애플리케이션을 개발하여 배포했는데 어떠한 동작이 올바르게 동작하지 않아 문제가 발생했다고 가정해보자.
해당 문제를 개발자는 수정완료 했고 다시 컴파일, 빌드, 배포하는 과정을 거쳐야하며 수정된 코드가 제대로 동작하는지 테스트하고 검증하는 과정도 거쳐야한다. 작은 수정이 있을 때마다 이 과정들을 다시 반복해서 거쳐야하며, 시간도 많이 걸리고 실수에 노출되어 있다.
그래서 이런 단점을 보완하기 위해서 생겨난 것이 CI/CD 이다.
이제 개발자를 위한 CI/CD에 대해 알아보자.
CI/CD(Continuous Integration/Continuous Deployment)란?
- CI는 Continuous Integration의 약자로, '지속적인 통합'을 의미하며, 개발자를 위한 자동화 프로세스로
의미 그대로 지속적인 통합을 통해 소스 코드 변경 사항을 자동으로 빌드, 테스트, 검증하여 문제를 빠르게 발견하고 수정하는 개발 방법이다. 이 방법을 통해 코드 충돌 및 오류를 빠르게 발견하여 예방 할 수 있고, 빌드 및 테스트를 자동화하여 개발자들의 시간과 노력을 절약 할 수 있고 결과적으로 코드의 품질이 올라간다는 장점을 가지고 있지만 단점도 있다. 초기 구성이 복잡할 수 있으며 CI 자동화에 대한 투자가 필요하다.
- 예시: Jenkins, Travis CI, CircleCI 등.
- 간략한 순서
1) 개발자가 구현한 코드를 기존 코드와 병합한다.
2) 병합된 코드가 올바르게 동작하고 빌드되는지 검증한다.
3) 테스트 결과 문제가 있다면 수정하고 다시 처음으로 돌아간다. 문제가 없다면 배포 진행한다. - CD는 Continuous Deployment 또는 Continuous Delivery의 약자로, '지속적인 배포' 또는 '지속적인 서비스 제공'을 의미한다. 간단히 말하면 배포 자동화 과정인데, 지속적인 통합(CI)을 기반으로 소프트웨어를 수동/자동으로 릴리스하고 배포하는 방법이다. 개발자들이 변경한 코드를 빠르게 스테이징 또는 운영 환경에 배포할 수 있으며, 자동화된 배포 프로세스를 통해 인적 오류를 줄이고 배포시간을 단축시켜준다. 하지만 배포 자동화를 위해 충분한 테스트와 검증이 필요하며, CI와 같이 초기 구성이 복잡할 수 있다.
지속적인 제공(Continuous Delivery)란?
- 개발자들이 애플리케이션에 적용한 변경사항이 버그 테스트를 거쳐 리포지토리에 자도으로 업로드되는 것을 의미하며, 운영팀은 이 리포지토리에서 애플리케이션을 실시간 프로덕션 환경으로 배포할 수 있다.
귀찮은 push 작업없이 최소한의 노력으로 새로운 코드를 배포하는 것을 목표로 한다.
지속적인 배포(Continuous Deployment)란?
- 개발자의 변경사항을 리포지토리에서 고객이 사용 가능한 프로덕션 환경까지 자동으로 릴리스하는 것을 의미하며, 애플리케이션 제공 속도를 저해하는 수동 프로세스로 인한 운영팀의 프로세스 과부하 문제를 해결해준다. 파이프라인의 다음 단계를 자동화함으로서 지속적인 제공이 가진 장점을 활용한다.?
- 예시: AWS CodeDeploy, Jenkins, Travis CI, CircleCI 등.
대표적인 CI/CD의 방법으로는 Jenkins와 Travis가 있는데 Jenkins에 대해 알아보겠다.
Jenkins란?
- Java Runtime 위에서 동작하는 자동화 서버
- 다양한 플러그인을 종합해서 CI/CD 파이프라인을 만들어서 자동화 작업
- 로컬에서 개발 > 커밋 > 푸시 하면 정해진 파이프라인을 따라 빌드, 테스트 등을 하여 배포시키는 것
Jenkins 구축하기
- 자신의 서버에 알맞게 Jenkins를 설치한다.
- 설치된 Jenkins에 접속하여 기본적인 설정을 한다.
플러그인을 설치하고 user계정을 등록한다. 접속할 url도 지정한다. - Jenkins 관리에서 자신의 프로젝트에 알맞는 설정을 한다.
다양한 plugin을 추가할 수 있다. - 새로운 job을 추가해서 Jenkins에게 부여하고 싶은 일을 지정한다.
여기서 다양한 파이프라인을 줄 수 있다.
(파이프라인이란? 새 버전의 소프트웨어를 제공하기 위한 단계를 의미.)