[study] CI/CD 파이프라인 구축
CI/CD 파이프라인이란
개발 환경의 코드가 테스트, 스테이징, 최종적으로 사용자에게 전달되는 다양한 단계를 거치는 프로세스입니다.
한 단계가 성공적으로 완료되면 다음 단계가 자동으로 트리거되어야 합니다. 어떤 단계가 실패하면 문제 해결을 위해 빠르게 피드백되어야 합니다.
빌드 파이프라인 단계
1. 메인 브랜치에 커밋하는 것으로 시작합니다. 결과는 일반적으로 대시보드에 표시됩니다.
빌드 혹은 테스트 실패시 파이프라인이 중단되게 설계할 수 있습니다. 수정사항이 커밋되면 파이프라인이 자동으로 처음부터 재시됩니다. 또는 조사를 위한 실패를 플래그로 표시하고 파이프라인이 계속 진행되도록 구성할 수도 있습니다.
2. 각 테스트를 거친 후 피드백을 제공합니다. 테스트는 일반적으로 빠른 테스트부터 진행함으로 빠른 피드백을 제공받습니다. 리소스를 많이 사용하는 테스트일수록 나중에 실행하도록 합니다.
3. 테스트가 완료되면 소프트웨어가 스테이징 환경으로 배포됩니다. 이러한 환경 중 일부는 수동 테스트에 사용되며, 일부는 교육, 지원 및 고객용 미리보기에 사용되기도 합니다.
4. CI/CD 파이프라인 최종단계는 변경사항을 라이브 환경에 적용하는 것입니다. 수동이나 자동으로 적용시킬 수 있습니다.
플래그 및 브랜치
지속적 통합을 적용하기 위한 첫 번쨰 단계는 전체 코드 베이스를 버전 관리 시스템(git)으로 전환한 다음, 팀의 모든 사용자들이 변경사항을 자주 커밋하도록 하는 것입니다. 메인 브랜치에 커밋할 때마다 지속적 통합 파이프라이 시작되며, 코드 빌드 및 테스트가 실행되어 최신 변경 사에 대한 신속한 피드백이 제공됩니다.
완성하지 않은 기능을 파이프라인으로 푸시하는 것이 바람직하지 않을 때도 있습니다. 스테이징 환경이라도 완성하지 않은 작업을 사용자와 공유하는 것이 좋지 않을 수도 있습니다.
그럴 때는 피처 브랜치를 만들어 본인의 기능을 완성한 다음에 메인 브랜치로 커밋할때 파이프라인이 적용되도록 할 수 있습니다.
빌드 및 테스트
커밋으로 파이프라인의 인스턴스를 트리거한 후에 이어지는 단계는 빌드 및 테스트입니다.
자동화된 유닛테스트가 있는 경우 빌드 전에 실행됩니다. 사용하는 빌드 도구와 빌드 단계의 세부 정보는 작업중인 언어와 프레임 워크에 따라 달라집니다. 전용 빌드 서버에서 자동회된 빌드를 실행시키면 종속성 누락으로 인한 문제, '내 시스템에서는 작동한다'라는 고질적인 문제를 방지할 수 있습니다. 빌드 단계는 설치 프로그램, 바이너리 혹은 컨테이너를 포함한 애플리케이션 아티팩트를 생성합니다. 이러한 아티팩트는 테스트 환경에 배포되고 시스템 구성 요소와 결합되어 통합 테스트, 구성 요소 테스트, 엔드 투 엔드 테스트 및 비기능 테스트(성능 및 보안분석)와 같은 높은 수준의 자동화된 테스트를 실행합니다.이러한 테스트는 병렬로 실행되어 파이프라인 속도를 높이고 피드백을 더 빠르게 제공할 수 있습니다.
컨테이너대 VM
자동화된 테스트의 결과가 안정적이려면 테스트 결과가 일관되게 나와야 합니다.
테스트 환경이 프로적션 환경과 최대한 흡사하도록 구성하 테스트 결과를 방해하는 환경적 불일치를 방지하기 위해 테스트 실행간에 환경을 재설정해야 합니다.
가상머신은 새 빌드를 테스트할 때마다 테스트 환경을 새로 고치는 프로세스를 스크립트로 처리할 수 있기 때문에 오랫동안 테스트 환경 실행에서 애용해 왔습니다.
하지만 새로운 가상머신을 해체하고 가동하는 데 시간이 걸릴 뿐 아니라, 소프트웨어를 실행하는 데 필요한 모든 종속성을 제공하려면 각 가상 환경에 대한 구상을 스크립트에 포함해야 합니다. 새 종속성이 추가되면 환경 스크립트를 업데이트해야 합니다. 이는 빌드가 실행되지 않았을 때 비로소 알아차리는 놓치기 쉬운 작업입니다.
초기 빌드 단계의 일부로 코드를 컨테이에 패키징하여 이러한 문제를 방지할 수 있습니다. 컨테이너에는 소프트웨어를 실행시키는 데 필요한 모든 종속성이 포함되어 있어 이동성이 뛰어나 다양한 환경에서 쉽게 배포할 수 있습니다.
배포
코드 변경 사항이 이전의 각 파이프라 단계를 성공적으로 통과하면 프로덕션에 릴리스할 준비가 된 것입니다.
다음과 같은 경우에는 수동 릴리스가 유용합니다.
- 새로운 기능을 공개되는 시점을 통제하고 싶은 경우
- 배포 프로세스 중에 사용자에게 중단 시간이 발생하는 경우
- 사용자가 제품을 설치해야 하며 정기적인 릴리스 일정에 따라 전달할 변경 사항을 배치로 모으려는 경우
지속적 배포에서는 릴리스가 자동으로 진행됩니다. 변경 사항이 이전의 모든 단계를 통과했다는 가정하에 라이브 환경으로 배포합니다. 하루에도 수십 번 사용자에게 배포 할 수도 있다는 의미이며, 자동화된 파이프라인이 없다면 사실상 불가능합니다.