CI/CD 성공 사례

CI/CD의 장점은 잘 알려져 있습니다. 그렇다면 여러분은 DevOps 프로세스를 잘 활용하고 계신가요?

지속적 통합, 전달과 개발은 코드를 빌드, 테스트, 릴리스하는 프로세스를 간소화합니다. 이러한 프로세스에서는 기존의 방식보다 사용자에게 완성된 제품을 더 빠르게 전달할 수 있습니다. 잘 구현된 자동화 빌드 파이프라인을 활용하면 팀이 완성된 소프트웨어를 지속적으로 빠르게 전달하고 최신 변경 사항에 대한 피드백을 신속하게 받을 수 있습니다.

지금부터 파이프라인에 적용을 고려할 지속적 통합 및 전달의 모범 사례를 살펴보겠습니다.

조기에 자주 커밋하기

모든 소스 코드, 구성 파일, 스크립트 및 종속성을 버전 관리 시스템에 저장하는 것은 지속적 통합을 구현할 때 필수적인 첫 걸음입니다.

버전 관리 시스템이 있다고 다 해결되는 것은 아닙니다. 사용하는 방식도 중요합니다. 지속적 통합의 목표는 다수의 기여자가 만드는 변경 사항을 쉽게 구현하는 것입니다. 이 방식의 핵심은 코드 변경 사항을 더욱 빈번하게 커밋하고 공유하는 것입니다.

작동 방식은 다음과 같습니다.

  • 각 커밋은 자동화된 테스트 세트를 트리거하면서 변경 사항에 대한 피드백을 신속하게 제공하여 버그를 빠르게 수정하도록 합니다. 커밋을 자주 하면 할수록 이런 피드백을 더욱 정기적으로 받을 수 있습니다.
  • 팀과 변경 사항을 자주 공유하면 모두가 같은 기반으로 빌드하게 되면서 협업에도 도움이 되고 크고 복잡한 변경 사항을 통합할 때 병합 충돌이 발생할 위험이 줄어듭니다.
  • 브랜치 전략에서는 변경 사항을 메인 브랜치, 전용 피처 브랜치 혹은 지정된 개발 브랜치에 푸시할지 정합니다.
  • 팀원 모두가 최소 하루에 한 번은 변경 사항을 커밋하고 공유하는 것이 좋습니다.

초기 장벽 극복하기

철저하게 검토해야 한다거나 일일 업무량을 넘어선 작업을 처리해야 한다는 우려 때문에 커밋을 자주하는 것이 처음에는 불편할 수 있습니다. 이때 평가보다는 협업의 문화를 팀 내에 형성하는 것이 필수적입니다. 업무 방식을 변경할 때는 팀이 함께 논의하는 것이 좋습니다. 작업을 작고 관리하기 용이한 단위로 쪼개면 각 구성원이 이 방식에 적응하는 데 도움이 됩니다.

빌드를 그린으로 유지

지속적으로 릴리스 가능한 코드베이스를 관리하면 CI/CD 사용 시 최대한 이점을 누릴 수 있습니다. 이러한 방식은 버그가 발생하면 즉시 해결함으로써 효율성을 재고하며, 프로덕션에서 문제가 발생할 경우 빠르게 수정을 배포할 수 있습니다.

자동화된 테스트와 파이프라인 단계에서는 코드 릴리스가 가능한지 여부에 관한 피드백을 즉각적으로 제공합니다. 이 모범 사례에서는 강조 표시되는 문제가 있다면 어떻게 대응해야 하는지에 초점을 맞춥니다.

문제를 협업하여 해결하기

팀은 빌드에 대한 책임을 공동으로 지고, 문제 발생 시 신속한 수정을 우선해야 합니다. 변경 사항을 마지막으로 만든 개발자를 탓하기보다는, 특히 압박을 받고 있을 때 팀이 협업해서 문제를 해결하며 CI/CD 워크플로를 강화하고 지속적인 개선을 지원하는 건설적인 문화를 장려해야 합니다.

사소한 실패 방지하기

구문 실수나 종속성 누락과 같이 간단한 오류로 인해 빌드가 실패하는 위험을 줄이기 위해 팀원은 변경 사항을 공유하기 전에 초기 테스트를 로컬에서 빌드하고 테스트해야 합니다. 또한 중복 작업을 막기 위해 전원이 CI/CD 시스템과 동일한 스크립트를 사용해야 합니다.

단 한 번만 빌드

흔한 실수 중 하나는 CI/CD 파이프라인의 각 단계마다 새로운 빌드를 생성하는 것입니다. 여러 환경에 맞춰 코드를 다시 빌드할 경우 일관성 문제가 발생할 위험이 있고, 이에 따라 이전의 모든 테스트가 통과되었다고 확신하기 어려워집니다.

대신 동일한 빌드 아티팩트를 사용해 빌드 파이프라인의 각 단계를 진행하고 최종적으로 라이브 릴리스를 완료해야 합니다.

시스템에 종속되지 않는 빌드 유지하기

변수, 인증 매개변수, 구성 파일 혹은 스크립트를 빌드 자체에 임베딩하지 않고 개발 스크립트를 통해 호출함으로써 시스템에 종속되지 않는 빌드를 유지하세요.

빌드 아티팩트 버전을 중앙 집중식으로 관리 및 보관하세요

빌드 아티팩트를 소스 코드의 부산물로 간주하세요. 소스 관리 시스템이 아니라 Nexus와 같은 중앙 집중식 아티팩트 저장소에서 아티팩트의 버전을 관리하고 보관하세요.

배포 자동화하기

CI 서버를 사용하여 같은 빌드 아티팩트를 모든 테스트 환경에 배포하는 과정을 자동화하세요. 아티팩트가 여러 단계를 거치면서 팀에서도 아티팩트를 더욱 신뢰할 수 있게 됩니다.

테스트 간소화

CI/CD는 주로 자동화된 테스트로 소프트웨어 품질을 보증하지만, 그렇다고 가능한 모든 결과에 대한 테스트를 목표로 할 필요는 없습니다.

테스트 커버리지와 작업 성과 사이에서 균형을 찾는 것이 매우 중요합니다. 테스트 결과가 나올 때까지 너무 오랜 시간이 걸리면, 개별 구성원들이 프로세스를 우회하거나 가속화할 이유나 방법을 찾게 될 위험이 있습니다.

계층이 있는 테스트 커버리지 채택하기

여러 계층의 자동화된 테스트 커버리지를 만들어 유닛 테스트부터 시작한 다음 통합 혹은 구성 요소 테스트를 진행하세요.

빠른 피드백을 우선하세요

빠르게 완료되는 테스트를 먼저 실행하여 최대한 빨리 피드백을 받으세요. 일반적으로 유닛 테스트가 가장 빠르게 실행됩니다.

병렬 테스트를 고려하기

테스트를 배치 단위로 나누고 병렬로 실행하여 결과를 더 빨리 받는 것을 고려해 보세요.

긴 테스트는 천천히 시작하기

빠른 테스트가 통과하고 빌드에 신뢰도가 쌓였을 때에만 실행이 오래 걸리는 테스트를 추가하세요.

수동 QA 의존도 제한하기

수동으로 품질 보증을 할 때 소요되는 시간과 팀의 가용성을 고려하면, 수동 품질 보증 단계는 모든 자동화된 테스트가 성공적으로 완료한 후로 제한하는 것이 좋습니다.

높은 수준의 테스트에 집중하기

모든 가능성을 확인하기 위해 실행이 오래 걸리는 테스트를 사용하지 마세요. 낮은 수준의 테스트로 커버리지를 넓히는 것에 집중하고, 제품과 사용자에게 특히 높은 위험을 야기하는 영역에 높은 수준의 테스트를 집중적으로 사용하세요.

환경 정리

사전 프로덕션 환경을 오래 실행하면 설정이 원래의 설정과 달라질 수 있습니다. 이 구성 편차는 일관되지 않은 테스트 결과를 낳아 CI/CD 프로세스의 신뢰도를 낮춥니다.

파이프라인을 실행할 때마다 테스트 및 스테이징 환경을 새로 고치는 것은 투자할 만한 가치가 있는 모범 사례입니다.

컨테이너나 가상 머신 사용하기

빠르게 새로 고칠 수 있도록 테스트 환경을 컨테이너나 가상 머신에 호스팅하세요.

코드로서 인프라 방식 채택하기

환경을 생성하고 종료하는 프로세스를 스크립트화하세요. 그러면 CI/CD 서버의 이러한 과정을 자동화할 수 있습니다.

확장성 고려하기

환경 생성을 스크립트화하면 손쉽게 CI/CD 프로세스를 확장하고 다수의 파이프라인을 동시에 실행할 수 있습니다.

정적인 환경 지양하기

정적인 환경을 선택하는 경우에는 각각의 환경을 별도로 관리해야 구성 편차를 피할 수 있습니다. 이러면 QA 프로세스가 느려지고 릴리스가 지연됩니다.

파이프라인 보호하기

CI/CD 프로세스는 코드와 프로덕션 배포에 필요한 자격 증명에 대한 액세스를 제공하기 때문에 공격자들의 주요 표적이 됩니다. 따라서 CI/CD 프로세스에 보안 모범 사례를 적용하는 것이 중요합니다.

  • 버전 관리 액세스: 버전 관리 저장소의 액세스를 보호하고 기여자에게는 다단계 인증을 요구하세요. 제3자도 변경 사항을 제출할 수 있도록 하는 경우, 빌드를 트리거하기 전에 이들의 변경 사항을 검토하는 프로세스를 갖추세요.
  • 자격 증명 관리: CI/CD 파이프라인에서 서비스와 환경에 액세스할 때 자격 증명과 API 키가 종종 필요합니다. 자격 증명을 소스 코드에 절대 보관하지 마세요. 대신 전용 비밀 저장소를 사용하고 자격 증명이 로그나 빌드 아티팩트로 유출되지 않도록 주의하세요.
  • 종속성 확인: 지속적 통합 검사의 일부로 타사 종속성에서 알려진 취약점을 검사하세요.
  • 안전한 통신: CI 서버와 빌드 머신 간의 통신이 안전한지 확인하고 모든 머신에 최신 패치를 항상 적용하세요.
  • 최소 권한의 원칙: 파이프라인 전역에서 최소 권한의 원칙을 적용하세요. 이러면 계정이 유출되어도 공격자들이 아일랜드 호핑 공격을 하기가 어려워집니다.
  • 변경 사항 관리: 변경 사항이 적용 전에 검토되도록 파이프라인 구성에 변경 사항 관리를 구현하세요.

프로세스 엄격하게 따르기

CI/CD 전략에 투자를 한 후, 릴리스 신뢰도가 확보되는 파이프라인을 만들었다면, 개별 구성원이 프로세스를 우회하도록 허용하여 이러한 노력을 헛되게 만들게 해서는 안 됩니다.

사소하거나 긴급한 변경 사항이 있을 때 CI/CD 프로세스를 우회하려는 사람이 종종 있습니다. 그러나 타협해서는 안 되는 이유가 몇 가지 있습니다.

  • 자동화된 품질 보증 단계를 건너뛰게 되면 그러지 않았을 때 잡힐 수 있는 버그가 추가될 수 있습니다.
  • 프로덕션으로 릴리스된 문제는 테스트에 사용할 빌드 없이는 재현하거나 디버그하기가 어렵습니다.
  • '긴급한' 릴리스에서 발생한 문제를 진단하고 수정하는 것은 정상적으로 자동화된 프로세스를 거치는 것보다 많은 시간이 소요됩니다.

누구든지 프로세스 우회를 요청한다면 잠시 시간을 내어 CI/CD 파이프라인의 장점을 설명해 주세요. 또한, 기존 프로세스에서 개선할 부분이 있다면 어디인지 물어보는 것도 좋습니다.

파이프라인 모니터링 및 평가

프로덕션 환경(즉, 제품)의 모니터링을 구현하는 것도 파이프라인을 설정하는 프로세스의 일부입니다.

CI/CD 파이프라인을 위한 모니터링과 유사하게 설정하는 것이 정석입니다.

CI/CD 메트릭 분석하기

CI/CD 도구가 수집한 메트릭을 사용하여 잠재적인 문제와 개선 영역을 식별하세요.

빌드 빈도 모니터링하기

트리거되는 빌드의 수를 주, 일 혹은 시간 단위로 비교하여 파이프라인 인프라의 사용 패턴을 파악하세요. 모니터링은 확장이 필요한지 판단하고 최대 부하가 발생하는 시간을 파악할 때 유용합니다.

배포 속도 추적하기

배포 속도를 시간의 흐름에 따라 추적하여 추세를 식별하고 성능 최적화에 투자할 시기를 평가하세요.

자동화된 테스트에서 인사이트 도출하기

자동화된 테스트로 얻은 통계 자료를 활용하여 병렬화하기에 좋은 영역을 찾으세요.

QA 결과 검토하기

일상적으로 무시되는 QA 결과를 식별하여 테스트 커버리지를 간소화할 수 있는 곳을 찾으세요.

팀으로 협업하기

성공적인 CI/CD 워크플로를 만드는 일에는 프로세스와 사용하는 도구뿐만 아니라 팀과 조직 문화도 중요합니다.

지속적 통합, 전달 및 배포핵심적인 DevOps 프로세스입니다. 개발자, QA 엔지니어 및 운영 팀 간의 통상적인 장벽을 허물고 여러 분야의 협업을 촉진하는 것이 목표입니다. DevOps 모범 사례를 도입하면 여러 장점이 있습니다.

개선된 가시성과 협업

팀원이 전체 워크플로를 빠짐 없이 파악할 수 있고 협업할 수 있는 기회도 생기며 다양한 전문성에서 이점을 얻을 수 있습니다.

책임 공유

파이프라인 관리의 책임을 공유하면 한 사람이 단일 실패 지점이 되는 것을 막을 수 있습니다.

역량 강화 및 기여

소프트웨어 전달에서 책임 공유를 장려하면 빌드 수정, 테스트 자동화 혹은 프로세스 개선 등을 통해 모든 팀원이 기여할 수 있습니다.

신뢰의 문화 촉진

팀원들이 아이디어를 실험하고 공유할 수 있는 신뢰의 문화를 촉진하면 조직에 이익이 되고 향상된 소프트웨어를 제공할 수 있습니다.

문제가 발생하면 이를 배움의 기회로 삼아, CI/CD 작업의 신뢰도와 효율성을 개선할 수 있습니다.

CI/CD 모범 사례를 따라야 하는 이유

지속적 통합, 전달과 배포를 위한 모범 사례를 따르면 여러 장점이 있습니다.

빠른 전달

빌드, 테스트, 배포 작업을 자동화하면 릴리스 프로세스가 빨라지므로 소프트웨어 업데이트를 빠르게 전달할 수 있습니다. 시장에 릴리스하는 시간을 줄이고 기능을 사용자에게 빠르게 전달하려면 자동화된 CI/CD는 필수적입니다.

정기적인 피드백

변경 사항을 자주 배포하면 사용자들로부터 피드백을 정기적으로 수집할 수 있습니다. 사용자들의 인사이트는 계획을 다듬고 전략을 조정하는 데 유용합니다.

코드 품질 개선

자동화된 QA 프로세스에서는 개발 주기 초반에 버그를 탐지하여 빠르게 해결할 수 있으므로 코드 품질을 높이고 소프트웨어의 성능을 높일 수 있는 순환을 만들 수 있습니다.

사용자 만족도 증가

검사가 자동화되면 모든 변경 사항이 일관적으로 검사되며 버그가 프로덕션에 도달하는 위험을 최소화합니다. 그 결과로 사용자는 더욱 원활한 경험을 하게 되고 다운타임이 발생할 확률은 훨씬 낮아집니다.

창의적 작업을 위한 시간 확보

스프트웨어 빌드, 테스트, 배포처럼 반복적인 과정을 자동화하면 팀원의 여유 시간이 확보되어 새로운 기능 개발, 혁신적인 설계 혹은 전체적인 DevOps 방식 개선과 같이 창의적인 작업에 집중할 수 있습니다.

CI/CD 배포 전략을 구현하는 방법

지속적 통합, 전달 및/혹은 배포를 구현하는 것은 막막하게 느껴질 수도 있는 작업입니다. 성공적인 CI/CD 전략에는 몇 가지 주요 요소를 고려해야 하며 오랜 시간에 걸쳐 탄탄한 DevOps 문화를 만드는 것이 필요합니다.

명확한 목표 설정하기

소프트웨어 개발 프로젝트에서와 마찬가지로 반드시 목표를 정의하고 팀과 소통해야 합니다.

지속적인 전달로 사전 프로덕션 환경에 주 단위의 릴리스를 목표로 하든, 사용자에게 신속한 업데이트를 보내는 지속적 배포를 추구하든, 명확한 목표를 설정하는 것이 필수적입니다.

관리 가능한 크기로 업무 나누기

목표를 정의했다면 목표 달성을 위해 필요한 과정을 관리할 수 있는 크기로 나누세요. 점진적으로 파이프를 구현하면 처음부터 CI/CD의 장점을 경험하실 수 있습니다.

CI 시작하기

대부분의 팀은 지속적 통합부터 시작합니다. CI에는 버전 관리, 브랜치 전략, 자동화된 테스트 커버리지 추가 혹은 확장과 빌드/테스트 자동화와 같은 작업이 포함됩니다. CI 서버를 사용하면 이러한 활동을 조율하고, 결과를 취합하고, 논리를 구현하여 이어지는 빌드 및 테스트 단계를 자동화하기에 좋습니다.

CD 작업 진행

자동화된 CI 흐름을 설정했다면 지속적 전달 혹은 배포 작업을 진행할 수 있습니다.

환경 생성을 자동화하면 장기적으로 시간을 절약하고 파이프라인의 신뢰도와 안정성을 높일 수 있습니다. 이러한 환경을 활용하여 더욱 자동화된 테스트나 수동 테스트를 실행할 수 있습니다.

데이터 분석하기

구현 단계 및 CI/CD 전략이 실행된 이후에 CI/CD 도구에서 나온 데이터를 분석하고 팀원과 함께 프로세스를 개선할 기회를 찾는 것이 좋습니다. 이렇게 반복이 가능한 방식을 활용하면 지속적으로 개선하고 팀과 조직 내에서 CI/CD의 장점을 최대화할 수 있습니다.

요약

DevOps 모범 사례를 채택하면 지속적 통합, 전달 및 배포 프로세스를 최대한 활용할 수 있습니다.

  • 코드 변경 사항을 자주 커밋하세요. 그러면 변경 사항을 통합하기가 쉬워지고 자동화 빌드 및 테스트로부터 작업물에 관한 피드백을 정기적으로 받을 수 있습니다.
  • 항상 배포 가능한 상태로 빌드를 유지하세요. 코드베이스를 배포 가능한 상태로 유지하면 코드 품질이 개선되고 프로덕션에서 긴급한 문제가 발생해도 해결할 수 있습니다.
  • 단 한 번만 빌드하세요. 동일한 빌드 아티팩트를 연속적인 환경에서 사용하면 코드가 각 테스트 단계를 통과했는지 명확히 알 수 있습니다.
  • 자동화된 테스트를 간소화하세요. 자동화된 테스트도 실행하는 데 시간이 걸립니다. 빠르게 피드백을 주는 테스트부터 실행하세요.
  • 파이프라인을 실행한 후에 환경을 새로 고치세요. 그러면 구성 편차를 피할 수 있어 모든 CI/CD 단계의 결과를 신뢰할 수 있습니다.
  • 파이프라인을 보호하세요. CI/CD 파이프라인은 소스 코드와 프로덕션 환경에 액세스할 수 있기 때문에 해커들에게 돈이 되는 표적이므로 CI/CD 보안이 매우 중요합니다.
  • 프로세스를 엄격히 따르세요. 변경 사항이 사소하거나 긴급한 경우 CI/CD 파이프라인을 우회하고 싶은 충동이 들 수 있으나 그러면 장기적으로 비용이 더 많이 발생하는 경우가 많습니다.
  • 파이프라인을 모니터링 및 평가하세요. 파이프라인의 데이터를 분석하면 파이프라인의 신뢰도와 효율성을 높이는 데 유용합니다.
  • 프로세스에 팀 모두가 참여하세요. 한 사람이 홀로 파이프라인 유지를 담당해서는 안 됩니다. DevOps 정신을 채택하면 여러 장점이 있습니다.

TeamCity의 이점

TeamCity는 CI/CD 파이프라인을 만들고 확장하는 것을 지원하도록 설계된 CI/CD 자동화 플랫폼입니다. 기존의 빌드 및 테스트 자동화 수준에 관계없이 TeamCity는 손쉽게 시작할 수 있습니다.

업계를 선도하는 모든 버전 관리 시스템과 광범위하게 통합되고, 인기 있는 빌드 및 테스트 프레임워크를 지원하며 직관적인 웹 기반 UI를 제공하기 때문에 단 몇 분이면 첫 파이프라인을 만들 수 있습니다. 코드로서의 구성을 완벽하게 지원하기 때문에 UI에서 파이프라인 정의를 모두 생성하고 버전 관리 시스템에 저장할 수 있습니다.

TeamCity는 높은 확장성과 성능을 제공하도록 설계되었기 때문에, 자동화된 테스트에서 피드백을 신속하게 얻을 수 있으며, 주요 IDE와 메시징 플랫폼과 통합되어 있으므로 어디서 업무를 하든 알림을 받을 수 있습니다. 광범위한 보안 기능은 코드와 파이프라인을 공격자로부터 안전하게 지켜줍니다.

프로세스가 성숙해지면 TeamCity의 기본 테스트 커버리지 테스트, 불안정한 테스트 식별, 빌드 에이전트 통계 등을 활용하여 CI/CD 프로세스를 항상 최적의 상태로 유지할 수 있습니다.