[ TERMS 06 ] CI / CD
1. CI(Continuous Integration) / CD(Continuous Deployment, Continuous Delivery)의 정의
CI와 CD는 지속적인 통합과 지속적인 배포로서 개발 생산성을 위해 자동화하는 과정을 말한다.
2. CI / CD는 어디서 접하게 될까?
> Github 오픈 소스 프로젝트
CI가 사용되는 가장 대표적인 공간은 Github이다. Github는 소스코드들을 버전별로 관리하고 공유하는 공간이다. 이는 여러 소스코드가 개발되고, 이를이 하나로 합쳐진다는 의미이다. 특히 Github의 여러 오픈 소스 프로젝트는 회사 직원뿐만 아니라 다른 개발자들도 기여할 수 있기 때문에 CI 같은 통합 자동화가 이루어져야 한다.
위 이미지는 Github 프로젝트에서 CI 과정을 거친 사진이다. 누군가 프로젝트에 오류를 발견해 이를 수정하고 싶다면 코드를 수정하고 Pull Request를 보낼 것이다. 수많은 사람들이 오픈 소스 프로젝트에서 Pull Request를 보낼 것이고 해당 코드의 문제 여부를 판별하는 것은 큰 시간이 든다. 이때 CI를 통해 작성된 코드가 정상인지 테스트한다면 확인하는 시간을 크게 절약할 수 있다.
> 실제 회사 프로젝트
CI / CD는 개발 프로세스에 많은 시간을 단축해 주고, 개발자들이 온전히 개발에만 집중할 수 있게 한다. 그렇기 때문에 많은 회사가 CI와 CD를 활용해 개발을 진행한다.
작업한 코드를 퇴근하기 전에 업로드하면 자동으로 테스트를 진행하고, 테스트에 성공하면 빌드 과정을 거쳐 실제 서비스에 Deploy하는 환경을 구축한다. 이러한 환경을 최초 설계하는 것은 많은 시간이 들기 때문에 이 방법을 사용하지 않은 회사들도 존재하지만, 이 환경을 구축해 두면 시간을 크게 단축할 수 있기 때문에 많은 회사가 이 개발 프로세스를 사용하기 위해 다양한 시도를 하고 있다.
3. CI / CD 알아보기
> CI
CI는 지속적인 통합을 의미한다. 개발자들은 GIT을 사용함으로써 코드들을 메일 혹은 카카오톡 등을 통해 공유하지 않고 빠르게 합칠 수 있다. 과거에는 이렇게 합친 파일들은 단순히 코드들이고 이상 여부를 개발자들의 몫이었다. CI는 이런 문제점을 해결하기 위해 개발된 프로세스이다.
미리 코드 검사를 진행할 수 있는 테스트 코드들을 작성해서 코드에 이상이 있는지 확인하는 작업인 디버깅을 진행하고, 실제 소프트웨어를 공급하는 가공물로 만들어 주는 빌드 과정을 자동으로 진행한다.
위의 툴들은 CI를 위해 존재하는 툴들로 대부분 무료로 제공되지만, 서버가 필요한 툴과 필요 없는 툴이 있기 때문에 만약 서버가 필요하다면 서버에 대한 요금을 따로 부담해야한다.
CI를 진행하려면 어떤 작업을 실행해야 하는지 정의해 둔 파이프라인(Pipeline) 파일이 필요하다. 먼저 파이프라인이 어떻게 구성되어 있는지 간단한 예를 통해서 알아보자
- script:
python3 -m venv .env
source .env/bin/activate
pip3 install setuptools
pip3 install -r requirements.xt
#The displayName Shows in the pipline UI when a build runs
displayName: 'Install dependencies on build agent'
- script:
#Put commands to run tests here
displayName: 'Run Tests'
- script:
echo Deleting .env
deactivate
rm -rf .env
displayName: 'Remove .env before zip'
위의 코드 블러은 Azure에서 제공하는 Django 테스트를 위한 파이프라인이다. 우선 'script'와 'displayName'으로 구분되어 있다. script는 실제 명령을 진행하고, displayName은 명령이 진행되었을 때 사용자에게 보여 주는 단계이다. 첫 번째 script는 파이썬 가상환경을 생성하고 패키지를 설치하는 과정이다. 이 절차에 대한 displayName은 'Install dependencies'이다. 다음은 주석 처리로 테스트를 돌릴 명령어를 작성하라고 적혀있다. 이는 의존성에 대한 문제가 모두 해결되어 정상적인 테스트가 가능하니 실제로 테스트를 진행하라는 의미이다. 다음은 테스트가 종료되었다고 생각하고 생성했던 가상환경들을 삭제하는 절차이다. 파이프라인은 사람이 직접해야 했던 이 모든 과정을 자동으로 처리해 준다.
> CD
CD는 지속적 배포를 의미한다. CI로 개발자들이 작성한 코드들을 하나로 묶어 완성된 코드를 사용자에게 자동으로 제공한다. 개발자들이 작업하는 각자의 작업 환경을 로컬 환경이라고 이야기한다. 그런데 실제로 사용자가 이용하는 페이지는 개발자의 로컬 환경이 아니라 회사의 서버 혹은 AWS, Azure에서 제공하는 클라우드 환경이다. CD는 서버에 하나로 묶은 파일을 올리는 작업을 자동으로 진행한다. 언제 어떤 파일을 어디에 올릴지 정의해 두면 특정 작업을 마친 후 자동으로 테스트부터 빌드, 배포까지 진행할 것이고, 개발자는 개발에만 집중할 수 있다.
> 컴파일
프로그래밍 언어는 컴퓨터가 읽을 수 있는 기계어, 기계어의 한 단계 위의 언어로 기계어와 일대일로 대응되는 어셈블리어, 일반적인 개발자가 사용하느 프로그래밍 언어가 속하는 고급언어로 나눌 수 있다.
b8 21 0a 00 00 a3 0c 10 00 06 b8 6f 72 6c 64 a3 08 10 00 06 b8 6f 2c 20 57 a3 04 10 00 06 b8 48 65 6c 6c a3 00 10 00 06 b9 00 10 00 06 ba 10 00 00 00 bb 01 00 00 00 b8 04 00 00 00 cd 80 b8 01 00 00 00 cd 80 |
CHARO 0x0007, d CHARO 0x0008, d STOP .ASCII "Hello, World!" .END |
print("Hello, World!") |
기계어 | 어셈블리어 | 고급 언어(파이썬) |
위의 표는 설명했던 언어들을 사용해서 'Hello, World'를 출력할 수 있는 코드들이다. 기계어의 경우 관련 지식이 없다면 도저히 이해할 수 없는 언어들로 구성되어 있다. 어셈블리어는 관련 지식이 없어도 읽을 수는 있지만, 무엇을 의미하는지는 여전히 알 수 없다. 마지막으로 고급언어는 읽을 수도 있고, 관련 지식이 없더라도 해당 코드가 어떤 것을 의미하는지 알수 있다. 컴파일은 개발자가 작성한 코드를 컴퓨터가 이해할 수 있는 언어로 변환하는 과정을 의미한다. 즉, 고급언어를 기계어로 변환하는 과정이다.
> 빌드
개발한 코드들을 사용자가 실행 가능한 하나의 가공물로 생성하는 과정이다. 컴파일하여 개발자가 작성한 코드를 기계어로 변환해도 이를 사용자가 바로 실행시킬 수는 없다. 빌드를 통해 해당 기계어 파일들을 하나의 파일로 묶어 사용자가 실행 가능한 파일로 만들어 주는 과정을 거쳐야 비로소 사용자를 위한 프로그램이 완성되는 것이다. 이때, 빌드는 단순히 파일을 하나로 묶어 줄 뿐만 아니라, 테스트 혹은 Deploy까지 한 번에 진행할 수도 있다.
4. CI / CD를 사용하는 이유
팀 프로젝트를 준비하다 보면 각자 맡은 역할을 준비하는 것보다 모든 작업물을 합치는 데 더 많은 시간을 투자해야 한다. 모든 작업물을 분류해 좋은 작업물을 선별하고, 하나의 결과물로 합쳐야 하기 때문이다. 이 과정이 자동화된다면 팀원들은 각자 맡은 역할에 더 집중할 수 있을 것이다. 프로그래밍에서도 마찬가지이다. 개발자들은 CI를 통해 작업물들을 합치는 과정을 진행하고, CD를 통해 작업물들을 자동화하여 배포할 수 있다.
5. CI / CD 더 알아보기
> 다양한 방식의 CI
CI는 두 가지 방식으로 진행할 수 있다. CI를 진행할 서버를 직접 호스팅하여 개인 혹은 회사에서 CI만을 위한 서버를 직접 관리하는 방식(예 : Jenkins)과 파이프라인에 작성한 파일을 프로젝트에 넣으면 CI를 배포하는 회사에서 서버를 호스팅해 주는 방식(예 : Travis)이다.
구분 | 서버 호스팅 있음 | 서버 호스팅 없음 |
Tools | Jenkins, TeamCity | Travis CI, Github Actions |
추가 기능 | 자유롭게 추가 기능 | 커스터마이징이 어려움 |
속도 | 서버 사양과 비례 | 상대적으로 느림 |
유지 보수 | 서버를 직접관리해야 함 | 서버 관리가 필요 없음 |
위 표는 서버 호스팅 유무에 따른 차이점을 비교한 것이다. 두 방식 모두 각각의 장단점이 존재하므로 상황에 맞춰 선택하면 된다.
> 실제로 사용되는 CI / CD 예시
① Github React Project: https://github.corn/facebook/react
② GitLab Jekyll Project: https://gitlab.com/pages/jekyll
> 함께 알아 두면 좋은 용어
- 유저 테스트
- GIT
- 도커
- 데브옵스
- TDD
'IT 도서 리뷰 > 개발자가 되기 위해 꼭 알아야 하는 IT 용어' 카테고리의 다른 글
[PART4] 클라우드/데브옵스 - TERMS 08 (1) | 2025.05.11 |
---|---|
[PART4] 클라우드/데브옵스 - TERMS 07 (0) | 2025.05.02 |
[PART4] 클라우드/데브옵스 - TERMS 05 (0) | 2025.04.20 |
[PART4] 클라우드/데브옵스 - TERMS 04 (0) | 2025.04.10 |
[PART4] 클라우드/데브옵스 - TERMS 03 (0) | 2025.04.05 |