컴파일·빌드·배포부터 CI/CD까지
코드를 사용자에게 보여주기까지 거치는 단계
사용자에게 작성한 코드를 보여주려면 컴파일·빌드·배포 세 단계를 거친다. 이 흐름을 먼저 정리해두고 CI/CD로 넘어갔다.
컴파일
컴파일은 작성한 소스 코드를 기계어, 바이트코드, 또는 다른 프로그래밍 언어로 번역하는 과정이다. 가장 익숙한 형태는 기계어로 번역되는 경우다. Java는 JVM이 이해하는 바이트코드로, TypeScript는 JavaScript로 번역되는 식으로 결과물이 달라진다.
빌드
빌드는 컴파일된 결과물과 그 외 필요한 자원(라이브러리, 리소스, 설정 등)을 묶어 실행 가능한 산출물(아티팩트)을 만드는 과정이다. 컴파일을 포함하는 상위 개념이고, 빌드 결과로 만들어진 파일이 다음 단계에서 실제로 배포된다.
배포
이렇게 만들어진 산출물을 각각의 서버에서 동작하도록 올려, 상품을 사용자에게 공개하는 단계다.
CI/CD가 왜 필요했나
사용자에게 프로젝트를 배포했는데 문제가 발생했다고 가정해봤다. 개발자가 문제를 수정하고, 수정 후 다시 컴파일·빌드·배포를 거치고, 테스트와 검증을 다시 한다. 이 과정을 반복하면 시간 손실이 크다. 이걸 개선하기 위해 CI/CD가 나왔다.
CI — Continuous Integration
CI는 지속적 통합이라는 뜻으로, 개발을 진행하면서도 품질을 관리할 수 있도록 하는 것이다. 여러 명이 하나의 코드에 대해 수정을 진행해도 지속적으로 통합 관리할 수 있음을 의미한다.
CI가 나오기 전까지는 개발을 끝마치고 배포가 되어야만 코드를 검증·관리할 수 있었다. CI를 적용하면 각 개발자가 자신의 기능을 구현하고, 완성되면 main 브랜치와 통합한 뒤 빌드가 잘 되는지 보고 테스트하며 버그를 해결한다.
이를 자동화하면 개발자가 빌드와 테스트를 직접 하지 않고도 수정한 코드를 브랜치에 병합하기만 하면 자동으로 빌드와 테스트가 검증된다. 개발자가 단위별로 구현한 부분을 병합할 때마다 자동화된 빌드와 테스트가 트리거되어 실행된다.
CI의 흐름은 이렇게 돌아간다.
CD — Continuous Delivery와 Continuous Deployment는 다른 개념이다
CD는 두 개념을 가리킨다. 처음에는 같은 말의 다른 표기 정도로 알고 있었는데, 사실은 자동화 범위가 다르다.
Continuous Delivery(지속적 제공)는 CI를 통과한 빌드·테스트 결과물을 자동화된 파이프라인을 통해 staging 또는 release-ready 환경까지 자동으로 배포해두는 것이다. 언제든 프로덕션에 올릴 수 있는 상태를 항상 유지한다. 단, 실제 프로덕션 배포는 사람의 수동 승인을 거친다.
Continuous Deployment(지속적 배포)는 Continuous Delivery에서 한 단계 더 나아간다. 모든 자동화된 검증을 통과한 변경 사항이 수동 승인 없이 자동으로 프로덕션까지 릴리즈된다.
핵심 차이는 "프로덕션 배포에 사람의 수동 승인이 끼는가"다. 둘 다 강력하고 신뢰할 수 있는 자동화 배포 파이프라인이 깔려 있어야 가능해서, 잘 굴러가면 하루에도 여러 번 일어나는 릴리즈가 특별하지 않은 일이 된다.
CI/CD 적용 전후 비교
Before
개발자들이 각자 파트를 개발하고 각자의 브랜치에 코드를 push한다. 어느 한 부분에서 에러가 발생해도 통합 전까지는 눈치채지 못한다. 각자의 코드를 git에 올려 통합한 뒤에야 에러를 찾고 디버깅하고 코드를 수정한다. 이 과정을 반복하다 에러가 해결되면 배포를 시작한다.
배포 시작 전후로 많은 시간과 리소스가 소요됐다. 코드의 양이 많다면 에러 추적이 어려워 디버깅 분량도 같이 늘어났다.
After
개발자들은 각자의 브랜치에 코드를 push만 한다. git push를 트리거로 만들어 CI 서버가 알아서 build, test, lint를 실행하고 결과를 알려준다. 결과에 에러가 있으면 해당 부분을 수정해 통합 브랜치에 merge하고, build·test가 정상적으로 수행되면 CI 서버가 그대로 deploy까지 이어간다.
일일이 빌드·테스트·배포 과정을 개발자가 직접 한다는 것은 리소스 낭비이고, 심하면 업무의 대부분을 거기에 투자해야 할 수도 있다. CI/CD를 구축해 자동화하는 것이 사실상 필수로 여겨진다.
CI/CD 도구
CI/CD를 구축할 때 쓰는 도구로는 Jenkins, GitHub Actions, CircleCI, Travis CI 등이 있다.