재밌고 어려운 IT를 이해해보자~!
CI/CD 본문
CI/CD 란?
CI/CD는 지속적 통합(Continuous Integration) 및 지속적 제공/배포(Continuous Delivery/Deployment)를 의미
소프트웨어 개발 라이프사이클을 간소화하고 가속화하는 것을 목표로 한다.
지속적 통합(CI)은 코드 변경 사항을 공유 소스 코드 리포지토리에 자동으로 자주 통합하는 사례를 나타낸다.
지속적 제공 및/또는 배포(CD)는 코드 변경 사항의 통합, 테스트, 제공을 나타내는 프로세스로, 두 가지 부분으로 구성
지속적 제공에는 자동 프로덕션 배포 기능이 없는 반면, 지속적 배포는 업데이트를 프로덕션 환경에 자동으로 릴리스한다
이렇게 연결된 두 사례를 일반적으로 "CI/CD 파이프라인"이라 부르며, 개발 팀과 운영 팀이 DevOps 또는 SRE(사이트 신뢰성 엔지니어링)를 통해 애자일 방식으로 협력하여 이를 지원
CI/CD는 애플리케이션 개발 단계부터 배포 때까지의 모든 단계를 자동화를 통해서 좀 더 효율적이고 빠르게 사용자에게 빈번히 배포할 수 있는 것을 말한다.
CI/CD의 개념만을 두고 보자면 자동화와 직접적으로 관련이 있지는 않다. 하지만 그럼에도 자동화라는 키워드는 CI/CD라는 단어에 거의 항상 따라붙는다. 또한 CI/CD는 DevOps 엔지니어의 핵심 업무라고 불리기도 한다.
CI/CD가 중요한 이유
CI/CD는 조직이 버그 및 코드 오류를 예방하는 동시에 지속적인 소프트웨어 개발 및 업데이트 주기를 유지하는 데 도움이 된다.
애플리케이션이 커짐에 따라 CI/CD의 기능을 활용하면 복잡성을 줄이고 효율성을 높이며 워크플로우를 간소화가능!
기존에 새 코드를 커밋에서 프로덕션으로 가져오는 데 필요했던 수동 개입을 CI/CD가 자동화하므로 다운타임이 최소화되고 코드 릴리스 주기가 단축
코드의 업데이트와 변경 사항을 더 빠르게 통합할 수 있으므로 사용자 피드백을 더 자주 효과적으로 통합할 수 있고, 그 결과 사용자에게 긍정적인 결과를 제공할 수 있으며 전체적인 고객 만족도가 향상
1. 코드 변경사항을 주기적으로 빈번하게 merge
하나의 예시를 생각해보자. 개발자들이 하나의 프로젝트를 진행하고 있으며, 형상관리 툴(git, svn 등)을 사용하고 있다.
또한, 그 프로젝트에 2명 이상의 개발자가 협업을 하면서 같이 개발을 같이 하고 있다.
그렇다면 여기서 개발자들이 빈번하게 merge하지 않고, 2일 3일 혹은 더 오랜 기간 동안 개발을 진행하다가 며칠 동안 작업한 많은 코드들을 한 번에 merge 한다면 어떻게 될까?
그렇다. 분명 충돌되는 많은 코드들이 생겨날 것이다.
이렇게 된다면 새로운 기능의 코드를 작성하는 시간보다, 충돌하는 많은 코드들을 수정하는 데에 시간이 더 오래 걸릴 수 있다. 그리고 이는 어떤 개발자라도 원하는 상황은 아닐 것이다.
그렇기에, 가능한 작은 단위로 나누어서 주기적으로 빈번히 개발하고 계속해서 통합하여 나가는 것이 중요하다.
위의 경우에서의 흐름
1. 개발자들은 계속해서 github 등의 관리 시스템에 통합한다.
2. 통합한 코드가 제대로 동작하는지 빌드 및 테스트를 진행한다.
3. 버그가 발생하거나 하면 다음에 해야 할 목록에 정리해두고 다음날이나 버그를 해결한다.
2. 통합 단계의 자동화
위의 단계는 다 좋은데, "귀찮다는 단점"이 있다.
Build 하고 Test 하는 과정은 굳이 사람이 하지 않더라도 되는 작업이다.
빈번하게 통합해줄 때마다 진행해야 하는 과정이기 때문에, 한 번에 몰아서 한 번만 빌드, 테스트를 진행하는 것보다 시간이 더 오래 소모될 것이다.
물론 한 번에 테스트를 해서 충돌 나거나 해서 문제가 생긴 코드들을 하나하나 다 고치는 것보다는 결과적으로 빠를지라도 당장은 귀찮고 굳이 사람이 할 필요가 없는 작업인 것이다.
하지만, 여기서 자동화를 사용해 준다면 어떻게 될까? github에 코드만 올리고 나머지 작업인 테스트와 빌드는 프로그램이 자동으로 해준다면?? 😮
이거야말로 똑같이 반복되는 귀찮은 작업을 하지 않을 수 있으며, 문제도 더 적어지는 편한 방법일 것이다.
이렇기 때문에 자동화라는 키워드가 CI/CD의 개념만을 보자면 직접적으로 관련이 없어도, 자동화라는 키워드가 떨어지지 않는 이유이다.
자동화를 사용한 이후의 흐름
1. 위와 동일하게 개발자들은 형상관리 툴(github 등)에 작업한 코드를 통합한다.
2. 빌드 및 테스트는 자동으로 진행되므로, 버그가 생기면 다음날 온 버그를 확인해서 버그를 해결한다.
위의 흐름을 보면 알 수 있듯, 위에서 말한 귀찮은 반복 작업은 자동화를 통해서 전부 생략되어 시간도 아끼며 복잡한 작업을 하나 덜하게 되는 걸 볼 수 있다.
CI의 장점
- 코드의 검증에 들어가는 시간이 줄어든다.
- 개발 편의성이 증가한다.
- 항상 테스트 코드를 통과한 코드만이 레포지터리에 올라가기 때문에, 좋은 코드 퀄리티를 유지할 수 있다.
CD (Continuous Delivery)
CD는 Continuous Delivery, 지속적인 제공이라는 의미와 Continuous Deployment, 지속적인 배포라는 의미가 있다.
CI에서 Bulid 되고 Test 된 후에, 배포 단계에서 release 할 준비 단계를 거치고 문제가 없는지 수정할만한 것들이 없는지 개발자가 검증하는 팀이 검증을 한다.
그 후에 나온 결론이 "이제 사용자들에게 서비스를 제공해도 되겠다!"라고 정해져서 배포를 수동적으로 진행하는 것이 "Continuous Delivery, 지속적인 제공"이다.
또한, 위와 같이 배포할 준비가 되자마자 자동화를 통하여 배포를 진행하는 것을 "Continuous Deployment, 지속적인 배포"이다.
CD를 적용한 후의 흐름
1. CI를 적용하여 코드를 검증한다
2. 배포 환경과 비슷한 곳에서 검증을 진행한다.
3. 검증된 소프트웨어를 실제 프로덕션 환경으로 배포한다.
CI/CD는 어느 정도의 자동화를 하냐에 따라 조금씩 다르기 때문에, CI/CD라고 해서 모두 같은 게 아니라 회사마다 혹은 팀마다 어느 정도 다를 수 있다.
CD의 장점
- 개발자는 배포보다는 개발에 더욱 신경 쓸 수 있도록 도와준다.
- 개발자가 원클릭으로 수작업 없이 빌드, 테스트, 배포까지의 자동화를 할 수 있다.