INDEX
개요
개발자들이 모여 서비스를 만들어냈고, 이를 배포까지 한 상황이라고 생각해보자.
이 때, 서비스에 특정 기능이 작동되지 않아 빠르게 수정을 하여 재배포해야하는 상황이 되었을 때,
개발자들은 최대한 빠르게 그 문제를 해결하고, 컴파일, 빌드, 배포하는 과정을 거쳐야하는데,
이 과정들은 시간도 많이 걸릴 뿐더러, 다시 실수하기도 쉽다.
이러한 상황을 효율적으로, 쉽고 빠르게 관리하기 위하여 CI / CD가 생겨나게 되었다.
CI와 CD
CI에 대하여
먼저 CI (Continuous Integration)에 대해 알아보자.
지속적 통합이라는 뜻의 CI는 개발을 진행하면서도 품질을 관리할 수 있도록 하는 것으로 여러 명이 하나의 코드에 대해서 수정을 진행해도 지속적으로 통합하면서 관리할 수 있음을 의미한다.
이 전에는 개발을 끝마치고 배포가 되어야만 코드에 오류는 없는지, 올바르게 동작하는지를 검증하며 코드 품질을 관리할 수 있었다.
이 때, CI를 적용하게 되면 각각의 개발자는 자신이 구현해야 할 기능을 구현하면 된다. 이후 각자 완성이 되면 main 브랜치와 통합하고 통합된 코드가 원활히 빌드가 되는지, 또 올바르게 동작하는지 테스트하며, 만약 통합된 코드에 버그가 있다면 해결하여 다시 위 과정을 반복하면 된다.
하지만 개발자가 직접 코드를 병합하고 빌드, 테스트를 검증하는 것은 시간이 많이 소요될 뿐만 아니라 귀찮고 그 양도 프로젝트의 크기가 커질수록 많아질 수밖에 없다.
그런 이유로, 위 과정을 자동화하여 개발자가 빌드와 테스트를 직접 하지 않고도 수정한 코드를 브랜치에 병합하기만 하면 자동으로 빌드와 테스트를 검증할 수 있는 것이다.
개발자가 단위별로 구현한 부분을 병합할 때마다 자동화된 빌드와 테스트가 모여 실행된다. 이 후, 결과를 통해 우리는 어떤 부분에서 문제가 있는지 배포하기 전에 확인할 수 있고, 배포가 완성된 후에야 버그를 수정할 수 있던 기존의 문제를 빠르고 정확하게 해결할 수 있다.
결과적으로 버그를 신속하게 찾아 해결할 수 있을 뿐 아니라, 소프트웨어 품질을 개선하고 새로운 소프트웨어 업데이트를 검증하고 릴리즈하는데에 걸리는 시간을 단축할 수도 있는 것이다.
간단하게 흐름을 읽어보자면, 다음과 같다.
- 개발자가 구현한 코드를 기존 코드와 병합한다.
- 병합된 코드가 올바르게 동작하고 빌드되는지 검증한다.
- 테스트 결과 문제가 있다면 수정하고 다시 1로 돌아간다. 문제가 없다면 배포를 진행한다.
CD에 대하여
이제 CI(지속적 통합)을 거친 코드에 대해서 신뢰할 수 있고 바로 배포할 수 있게 되었다.
CD (Continuous Deployment)는 지속적 배포의 의미를 갖는다. 위 과정을 통해 성공적으로 병합된 내역을 저장소 뿐만 아니라 실제 사용자가 사용할 수 있는 배포환경까지 릴리즈하는 것을 의미한다.
지속적 배포에서는 지속적 통합을 통해 빌드한 소스코드를 테스트 가능한 알파나 베타 버전으로 만든다. 이 버전에서 테스트를 수행해 문제가 발생하면 수정한 뒤에 정식 버전으로 배포를 진행한다.
또한, CD는 지속적 배포(Continuous Deployment)의 의미도 있지만 소프트웨어가 항상 신뢰 가능한 수준에서 배포될 수 있도록 관리하자는 개념으로 지속적 제공(Continuous Delivery)로 사용되기도 한다.
지속적 제공은 CI를 통해서 새로운 소스코드의 빌드와 테스트 병합까지 성공적으로 진행되었다면, 빌드와 테스트를 거쳐 github과 같은 저장소에 업로드하는 것을 의미한다.
장점
- 위험 감소
사전 프로덕션 환경에 테스터 또는 실제 사용자를 참여시켜 초기에 자주 사용자와 함께 혁신적 기능을 테스트할 수 있으면 실제로 사용자의 문제를 해결해주지 못하는 기능에 몇 달 혹은 몇 년씩 노력을 투입하기 전에 접근 방식의 유효성을 검증할 수 있습니다.
- 검토 시간 단축
나머지 팀원들과 코드를 정기적으로 공유하면 모든 작업자가 동일한 기반 위에서 작업할 수 있을 뿐만 아니라 코드 검토 속도가 빨라지고 변경 사항을 더 쉽게 통합할 수 있습니다.
- 코드 품질 개선
테스트를 자동화하면 테스트를 일관되게 수행할 수 있어 결과의 신뢰성이 높아집니다. 자동화된 테스트는 수동 테스트보다 실행이 더 빠르기 때문에 훨씬 더 자주 테스트하는 것이 가능해집니다.
코드를 정기적으로 철저하게 테스트하면 버그를 더 빨리 발견할 수 있고, 빌드마다 추가되는 기능이 적으므로 해결하기가 더 쉽습니다. 결과적으로 모든 과정이 쌓이면서 코드의 품질은 향상됩니다.
- 진행 상황에 대한 평가 가능
자동화된 CI/CD 파이프라인을 지원하는 데 사용되는 많은 도구는 프로세스를 평가하는 목적으로도 사용할 수 있으므로 빌드 시간부터 테스트 커버리지, 결함률, 테스트 수정 시간에 이르는 전체 평가 지표가 제공된다.
가장 많이 쓰이는 CI/CD 도구 5가지
- 젠킨스
CI/CD 도구 Jenkins
오늘날 시장에서 널리 사용되는 CI/CD 도구 중 하나인 Jenkins는 중앙 빌드 및 지속적인 통합 프로세스가 가능하며, Windows, macOS 및 기타 Unix 계열 운영 체제용 패키지가 포함된 독립형 Java 기반 프로그램이다. 수백개의 플러그인을 사용할 수 있는 Jenkins는 소프트웨어 개발 프로젝트의 빌드 파이프라인 구성, Build 자동화의 확립, 배포 및 테스트 자동화 등을 지원한다.
홈페이지: https://jenkins.io/ - 서클CI
CI/CD 도구 CircleCI
CircleCI는 코드 구축, 테스트에서 배포에 이르기까지 사용자의 파이프라인 전반에 걸쳐 신속한 소프트웨어 개발 및 게시를 지원하는 CI/CD 자동화 도구이다. CircleCI를 GitHub, GitHub Enterprise 및 Bitbucket과 통합하여 사용할 수 있다는 장점이 있다.
홈페이지: https://circleci.com/ - 팀시티
CI/CD 도구 팀 도시
TeamCity는 JetBrains의 빌드 관리 및 지속적 통합 서버로써 Java 환경에서 실행되며 Visual Studio 및 IDE와 통합될수있는데, Windows 및 Linux 서버에 모두 설치할 수 있으며 .NET 및 개방형 스택 프로젝트도 지원한다.
홈페이지 : https://www.jetbrains.com/teamcity/ - Bamboo (대나무)
CI/CD 도구 Bamboo
홈페이지 : https://www.atlassian.com/software/bamboo - GitLab
CI/CD 도구 Gitlab
홈페이지 : https://about.gitlab.com/
DevOps
DevOps 엔지니어의 역할
CI/CD 자동화는 DevOps 엔지니어의 핵심 업무에 속합니다.
CI/CD를 위한 파이프라인을 구성하고, 이를 자동화 단계까지 끌어 올립니다.
또한 중간중간 모니터링 지표를 구성하여, 개발자들의 개발 방향을 가이드합니다.
이를 통하여, 고객들에게 안정적이고 신뢰성 높은 서비스 프로덕션을 제공합니다.
서비스를 개발하는 일도 중요하지만,
그보다 중요한 것은 고객에게 안정감 있는 서비스를 배포하여 운영하는 것입니다.