CI/CD 파이프라인이란?

CI/CD 최종 가이드

지속적 통합/지속적 전달(CI/CD) 파이프라인이란 정확하게 무엇이고 어떻게 만들 수 있나요?

지속적 통합, 전달 및 배포(CI/CD)에 관한 글을 계속 읽으셨다면 "자동화된 파이프라인"이라는 말과 자동화된 파이프라인이 이러한 작업을 수행하는 데 얼마나 중요한 역할을 하는지 배우셨을 것입니다.

CI/CD를 이용하면 DevOps 방식으로 품질 타협 없이 소프트웨어를 빠르게 전달할 수 있습니다. CI/CD에서는 변경 사항을 자주 커밋하고, 이러한 업데이트를 엄격하게 테스트하고, 피드백을 즉각적으로 처리하는 작업이 진행됩니다. 이러한 작업을 위해서는 자동화된 CI/CD 파이프라인을 반드시 갖추어야 합니다.

CI/CD 파이프라인이 무엇인가요?

CI/CD 파이프라인이라고 하면, 개발 환경의 코드가 테스트, 스테이징, 그리고 최종적으로 사용자에게 전달되는 다양한 단계를 거치는 프로세스를 말합니다.

CI/CD의 목적은 이 프로세스를 정기적으로(하루 혹은 한 시간에 여러 번) 실행하는 것이므로, CI/CD 파이프라인을 최대한 자동화하는 것이 필수적입니다. 한 단계가 성공적으로 완료되면 다음 단계가 자동으로 트리거되어야 합니다. 어떤 단계가 실패하면 문제 해결을 위해 피드백이 빠르게 전달되어야 합니다.

CI/CD 파이프라인을 자동화하면 전반적인 빌드, 테스트 및 소프트웨어 배포 과정이 빨라질 뿐만 아니라 각 단계의 일관성 및 안정성을 확보할 수 있습니다.

빌드 파이프라인 단계

CI/CD 파이프라인의 정확한 형태는 제품이나 조직에 따라 달라지겠지만, 모든 파이프라인은 다음의 일반적인 패턴을 따르는 편입니다.

  1. 프로세스는 빌드를 트리거하나 초기 유닛 테스트 세트를 트리거하는 메인 브랜치(또는 CI 브랜치로 지정한 브랜치)에 커밋하는 것으로 시작합니다. 결과는 일반적으로 대시보드에 표시됩니다. 문제가 있으면 계속하기 전에 해결할 수 있도록 빌드 혹은 테스트 실패 시 파이프라인이 중단되게 설계할 수 있습니다. 수정 사항이 커밋되면, 모든 것이 의도대로 실행되는지 확인하기 위해 파이프라인이 자동으로 처음부터 재시됩니다. 또는 조사를 위해 실패를 플래그로 표시하고 파이프라인이 계속 진행되도록 구성할 수도 있습니다.
  2. 다음 단계는 일련의 자동화된 테스트를 포함하며, 각 테스트 과정을 거친 후 피드백을 제공합니다. 테스트는 일반적으로 가장 빠른 테스트가 먼저 실행되도록 구조화되어 있기 때문에 가능한 한 빨리 피드백을 제공합니다. 리소스를 많이 사용하는 테스트는 선행하는 단계가 성공적으로 완료된 경우에만 마지막으로 실행됩니다. 어느 테스트라도 실패하면, 파이프라인을 멈추고 다시 시작하거나 문제가 조사되도록 제출하고 계속할 수도 있습니다.
  3. 자동화된 테스트가 완료되면 일반적으로 소프트웨어가 일련의 스테이징 환경으로 배포됩니다. 이러한 환경 중 일부는 수동 테스트에 사용되며, 일부는 교육, 지원 및 고객용 미리보기에 사용되기도 합니다.
  4. CI/CD 파이프라인 아키텍처의 최종 단계는 변경 사항을 라이브 환경에 적용하는 것입니다. 릴리스는 수동으로(지속적 전달의 경우) 트리거되거나 자동으로(지속적 배포의 경우) 트리거됩니다.

이제 각 단계에서 고려해야 하는 주요 사항을 자세히 알아보겠습니다.

CI/CD 성공 사례

CI/CD 파이프라인 구축은 일회성으로 그쳐서는 안 됩니다. 파이프라인에 적용할 수 있는 CI/CD 모범 사례를 알아보세요.

플래그 및 브랜치

지속적 통합을 적용하기 위한 첫 번째 단계는 전체 코드 베이스를 Git, Mercurial 또는 Perforce와 같은 버전 관리 시스템(VCS 또는 SCM(소스 제어 관리)이라고도 함)으로 전환한 다음, 팀의 모든 사용자가 변경 사항을 자주 커밋하도록 하는 것입니다. 메인 브랜치에 커밋할 때마다 지속적 통합 파이프라인이 시작되며, 코드 빌드 및 테스트가 실행되어 최신 변경 사항에 대한 신속한 피드백이 제공됩니다.

잦은 커밋은 CI/CD 파이프라인에서 중요한 작업이지만, 완료하는 데 며칠 또는 몇 주가 걸리는 대규모 기능을 작업하는 경우, 작업 중에 주기적으로 커밋하는 것이 비생산적으로 느껴질 수 있습니다.

그러나 일정한 분량의 변경 사항을 파이프라인으로 푸시하면 피드백을 빠르게 받을 수 있습니다. 또한, 기능이 완성될 때까지 기다리는 것보다 복잡한 병합 충돌이 발생할 가능성이 줄어듭니다.

한편, 완성되지 않은 기능을 파이프라인으로 푸시하는 것이 바람직하지 않을 때도 있습니다. 스테이징 환경이라 하더라도 완성되지 않은 작업을 사용자와 공유하는 것은 좋지 않을 수 있습니다.

피처 플래그와 피처 브랜치는 이러한 문제를 해결할 수 있는 방법을 제공합니다. 피처 플래그를 사용하여 사용자에게 코드를 보여줄 환경을 지정하세요. 내가 적용한 변경 사항은 여전히 메인 브랜치에 커밋되어 팀에게 표시되지만, 스테이징 및 프로덕션에서 기능을 보여줄 시점은 직접 정할 수 있습니다.

피처 브랜치를 통해 자동화된 빌드 및 테스트의 이점을 활용하면서 별도의 브랜치에서 기능을 개발할 수 있습니다. 메인 브랜치에 커밋할 때와 마찬가지로 피처 브랜치에 커밋할 때마다 CI/CD 파이프라인이 트리거되어 빌드에 대한 피드백을 신속히 받을 수 있습니다.

빌드 및 테스트

커밋으로 파이프라인의 인스턴스를 트리거한 후에 이어지는 단계는 빌드 및 테스트입니다. 자동화된 유닛 테스트가 있는 경우 이 테스트는 일반적으로 린팅 및 정적 분석 검사를 사용하여 빌드 전에 실행됩니다.

사용하는 빌드 도구(예: Ant 또는 Maven)와 빌드 단계의 세부 정보는 작업 중인 언어와 프레임워크에 따라 달라집니다. 전용 빌드 서버에서 자동화된 빌드를 실행하면 종속성 누락으로 인한 문제, 즉 '내 시스템에서는 작동한다'라는 고질적인 문제를 더욱 철저히 방지할 수 있습니다.

빌드 단계는 설치 프로그램, 바이너리 혹은 컨테이너를 포함한 애플리케이션 아티팩트를 생성합니다. 이러한 아티팩트는 테스트 환경에 배포되고 시스템 구성 요소와 결합되어 통합 테스트, 구성 요소 테스트, 엔드 투 엔드 테스트 및 비기능 테스트(예: 성능 및 보안 분석)와 같은 보다 높은 수준의 자동화된 테스트를 실행합니다.

이러한 테스트는 병렬로 실행되어 파이프라인 속도를 높이고 피드백을 더 빠르게 제공할 수 있습니다.

CI/CD의 자동화된 테스팅

CI/CD 프로세스에서 테스트가 왜 중요하고 어떤 종류의 테스트가 있는지 알아보세요.

컨테이너 대 VM

자동화된 테스트의 결과가 안정적이려면 테스트 결과가 일관되게 실행되도록 해야 합니다.

이상적으로는 테스트 환경이 프로덕션 환경과 최대한 흡사하도록 구성하고 테스트 결과를 방해하는 환경적 불일치를 방지하기 위해 테스트 실행 간에 환경을 재설정해야 합니다.

가상 머신(VM)은 새 빌드를 테스트할 때마다 테스트 환경을 새로 고치는 프로세스를 스크립트로 처리할 수 있기 때문에 오랫동안 테스트 환경 실행에서 애용되어 왔습니다.

그러나 새 VM을 해체하고 가동하는 데 시간이 걸릴 뿐만 아니라, 소프트웨어를 실행하는 데 필요한 모든 종속성을 제공하려면 각 가상 환경에 대한 구성을 스크립트에 포함해야 합니다. 새 종속성이 추가되면 환경 스크립트를 업데이트해야 합니다. 이는 빌드가 실행되지 않는 이유에 의문이 들 때 비로소 알아차리게 되는 놓치기 쉬운 작업입니다.

초기 빌드 단계의 일부로 코드를 컨테이너에 패키징하여 이러한 문제를 방지할 수 있습니다. 컨테이너에는 소프트웨어를 실행해야 하는 모든 종속성이 포함되어 있어 이동성이 뛰어나고 다양한 환경에 쉽게 배포할 수 있습니다.

자체 인프라에서 CI/CD 파이프라인을 호스팅하는 경우, 컨테이너를 배포하려면 VM이 여전히 필요하지만 테스트 환경을 준비하는 데 필요한 작업은 줄어듭니다. 클라우드에서 파이프라인을 실행하는 경우, 컨테이너를 사용하면 관리형 서비스를 활용해 인프라 관리를 클라우드 제공업체에 맡길 수 있습니다.

사전 프로덕션 환경

파이프라인 아키텍처의 테스트 및 스테이징 환경 수는 무엇을 빌드하고 있는지와 조직 내 다양한 이해 관계자 그룹의 요구사항에 따라 달라집니다. 예를 들어 탐색 테스트, 보안 검토, 사용자 조사, 영업 데모, 교육 환경 및 지원 담당자가 고객 문제를 복제할 수 있는 샌드박스 등이 있습니다.

이러한 환경의 생성과 배포를 자동화하면 수동으로 새로 고치는 것보다 훨씬 효율적입니다. 환경마다 서로 다른 파이프라인 트리거를 구성할 수도 있습니다.

예를 들어 테스트 환경은 빌드할 때마다 업데이트하고, 스테이징 환경은 적은 빈도로 새로 고치도록 지정할 수 있습니다(예: 최근 성공한 빌드로 하루에 1회 또는 일주일에 1회).

배포

코드 변경 사항이 이전의 각 파이프라인 단계를 성공적으로 통과하면 프로덕션에 릴리스할 준비가 된 것입니다. 마지막 단계는 수동 또는 자동일 수 있습니다.

다음과 같은 경우에는 수동 릴리스(지속적인 전달)가 유용합니다.

  • 새로운 기능이 공개되는 시점을 통제하고 싶은 경우.
  • 배포 프로세스 중에 사용자에게 중단 시간이 발생하는 경우.
  • 사용자가 제품을 설치해야 하며 정기적인 릴리스 일정에 따라 전달할 변경 사항을 배치로 모으려는 경우.

지속적 배포에서는 릴리스가 자동으로 진행됩니다. 변경 사항이 이전의 모든 단계를 통과했다는 가정하에 라이브 환경으로 배포됩니다. 이는 자주 커밋하는 대형 팀의 경우 하루에도 수십 번 사용자에게 배포해야 할 수도 있다는 의미이며, 자동화된 파이프라인이 없다면 사실상 불가능합니다.

CI/CD 도구

CI/CD 프로세스를 만드는 데 전용 도구가 중요하기는 하지만, 전용 도구가 없다고 시작할 수 없는 것은 아닙니다. 초기에는 CI/CD 플랫폼 없이 자동화 테스트를 작성하고 자동으로 이런 테스트가 실행되도록 스크립트를 만드는 데 집중해도 됩니다.

이러한 작업을 하다 보면 일정에 따라 실행되는 빌드/테스트 잡이 있는 지속적 통합 파이프라인으로 점차 발전시킬 수 있습니다.

사용자의 요구 사항에 맞는 적절한 CI/CD 도구를 설택하면, 파이프라인을 추가하고 효율적인 빌드 인프라를 관리하고 확장하는 등의 CI/CD 전략을 더 빠르게 시행할 수 있습니다.

업무에 가장 적절한 CI/CD 도구를 선택할 수 있도록 고려할 사항을 목록으로 준비했습니다.

  • 통합 옵션: 사용자의 CI/CD 도구는 VCS, 빌드 도구, 테스트 프레임워크 및 패키지 관리자와 통합되어야 CI/CD 파이프라인의 각 단계를 조율할 수 있습니다. 또한, 팀의 메시지 플랫폼, 이슈 트래커 및 IDE와 통합되어야 원할 때 피드백을 받을 수 있습니다.
  • 기술 스택 지원: 현재 사용 중인 프로그래밍 언어, 플랫폼 및 프레임워크뿐만 아니라 앞으로 요구 사항이 어떻게 변할지도 고려해야 합니다. 현재 개발 중인 도구는 새로운 기술을 지원할 확률이 높습니다.
  • 모두를 위한 인터페이스: 더 많은 인원을 CI/CD에 포함시키려면 GUI, API 및 CLI 중에서 선택할 수 있어야 합니다. 완전한 DevOps 접근 방식을 활용하려면 구성을 코드로 작성할 수 있도록 지원해야 합니다.
  • 맞춤 설정 기능: 표준 CI/CD 파이프라인은 없습니다. 따라서 사용자의 요구 사항에 맞는 자동 프로세스를 유연하게 구축할 수 있는 도구를 선택하세요.
  • 인프라 옵션: 보안 또는 규정 준수를 위해 파이프라인을 사내 서버에 호스팅하고 싶을 수 있습니다. 클라우드만 사용하는 조직일 수도 있고, 추후에 클라우드로 마이그레이션할 계획이 있을 수도 있습니다. 선호하는 것이 무엇이든 선택한 도구가 현재와 미래의 요구 사항을 모두 충족하는지 확인하세요.
  • 확장성 및 성능: 더 많은 프로젝트를 위한 파이프라인을 만들고 파이프라인의 실행 빈도가 높아지면 인프라의 제약을 받을 수 있습니다. 확장이 가능하고 빌드 및 테스트 시스템의 관리를 간소화해 주는 CI/CD 도구를 선택하면 시간과 노력을 아낄 수 있습니다.
  • 비용: 라이선스 비용과 더불어 지원 비용 및 클라우드 호스팅 인프라 옵션도 고려하세요.

CI/CD 도구를 선택하는 방법

이 블로그 게시물에서는 적절한 CI/CD 솔루션을 선택하기 위한 일반적인 지침을 제공하고 TeamCity가 이 프레임워크에서 어떤 위치에 있는지 자세히 알아봅니다.

DevOps에서 CI/CD란?

CI/CD는 DevOps로 알려진 광범위한 작업의 일부입니다. 개발(소프트웨어 제품 및 서비스 제작)과 운영(소프트웨어의 릴리스 및 관리)을 하나로 합치는 DevOps는 작업 방식이자 자세입니다. 애자일 원칙에 따라 구축되어 개발 팀뿐만 아니라 전체 조직이 고품질의 소프트웨어를 더 빠르게 전달할 수 있도록 돕습니다.

CI/CD 파이프라인을 구현할 때 DevOps의 의미를 이해하면 시작할 때 유용합니다. 다음의 사항은 염두에 두는 것이 좋습니다.

  • DevOps에서는 소프트웨어의 제작, 릴리스 및 관리에 참여하는 모든 인원이 사용자의 요구 사항에 맞고 문제 없이 작동하는 소프트웨어를 전달한다는 공통 목표를 가져야 합니다.
  • 시프트 레프트라는 개념이 DevOps 방식의 핵심입니다. 이는 프로세스 뒷단에서 지연이 발생하지 않도록 문제를 최대한 이른 시기에 찾는 것을 말합니다. CI/CD가 정기적이고 빠른 피드백에 집중하는 이유가 바로 이것이며, 사용자는 이러한 피드백을 통해 시프트 레프트를 수행할 수 있습니다.
  • 개발자의 기술과 전문성을 운영에 투입하면 인프라 관리 및 환경 업데이트와 같은 작업을 자동화할 수 있는 가능성이 열립니다.
  • 운영 팀이 일반적으로 처리하는 업무를 개발 팀에 보여줌으로써 개발자가 전체 프로세스를 파악할 수 있게 되어 사전 예방적으로 버그와 사용자의 피드백을 해결할 수 있습니다.

CI/CD 파이프라인으로 변경 사항을 커밋할 때나 소프트웨어의 새로운 버전을 릴리스할 때 처리되는 작업을 자동화할 수 있습니다. 이러한 작업을 자동화하면 실행 및 피드백 전달 속도를 높일 수 있으며, 이를 통해 필요한 조치를 더 일찍 취하고 소중한 시간과 리소스를 절약할 수 있습니다.

CI/CD 파이프라인 한눈에 이해하기

CI/CD란 DevOps 작업의 하나로, 자동화를 활용하여 소프트웨어 개발 주기의 각 단계에 관한 피드백을 빠르게 제공합니다. 최근에 변경된 코드로 인해 발생한 문제를 찾아내어 소프트웨어 개발이 효율화됩니다. 시프트 레프트(상호 작용을 앞당기고 피드백을 빠르게 전달)를 통해 실패하더라도 더 이르게 하고, 자동화된 파이프라인을 만들어서 이러한 테크닉을 작업에 적용할 수 있습니다.

CI/CD 프로세스를 직접 설계할 때는 지속적 통합부터 시작하여 단계별로 구축하는 것이 좋습니다. 파이프라인의 정확한 단계와 각 단계가 트리거되는 시기를 결정하는 로직은 사용자의 제품과 조직에 따라 다릅니다.

고유한 요구 사항에 맞게 파이프라인을 구성할 수 있는 유연성을 제공하는 동시에 관리가 용이한 CI/CD 플랫폼을 선택하면 안정적인 릴리스 프로세스를 구축하고 소프트웨어 품질을 개선할 수 있습니다.

TeamCity의 이점

TeamCity는 DevOps 작업 방식에 맞춰 설계된 CI/CD 솔루션입니다. 우수한 버전 관리 시스템을 모두 지원할 뿐만 아니라 다양한 빌드, 테스트 및 패키지 관리 도구와 더불어 인기 VM 및 컨테이너 관리 플랫폼까지 지원하여 기존의 프로세스를 자동화된 CI/CD 파이프라인으로 탈바꿈할 수 있도록 도와 드립니다.

유연한 트리거 옵션과 시각적인 파이프라인 에디터로 손쉽게 모든 워크플로의 파이프라인을 구성할 수 있습니다. 구성은 코드 형태로 자동 저장되어 코드로 구성할 때의 장점뿐만 아니라 논리를 GUI에서 만드는 자유까지 누릴 수 있습니다.

TeamCity의 고성능 설계 덕분에 하나의 빌드 서버로도 수천 개의 프로젝트를 처리할 수 있습니다. 온프레미스 및 클라우드 기반 배포 옵션을 선택할 수 있어 유연하게 원하는 곳에서 파이프라인을 실행하고 수요에 맞춰 확장할 수 있습니다. 테스트 병렬화와 실시간 결과는 피드백 루프를 더욱 단축시켜 실패할 때는 더 빠르게 실패하여 개발자 경험을 더 생산적으로 만듭니다.

아직 궁금한 점이 있나요? 자주 하는 질문 섹션에서 더 자세히 알아보세요.