CI/CD의 장점은 잘 알려져 있습니다. 그렇다면 여러분은 DevOps 프로세스를 잘 활용하고 계신가요?
지속적 통합, 전달과 개발은 코드를 빌드, 테스트, 릴리스하는 프로세스를 간소화합니다. 이러한 프로세스에서는 기존의 방식보다 사용자에게 완성된 제품을 더 빠르게 전달할 수 있습니다. 잘 구현된 자동화 빌드 파이프라인을 활용하면 팀이 완성된 소프트웨어를 지속적으로 빠르게 전달하고 최신 변경 사항에 대한 피드백을 신속하게 받을 수 있습니다.
지금부터 파이프라인에 적용을 고려할 지속적 통합 및 전달의 모범 사례를 살펴보겠습니다.
모든 소스 코드, 구성 파일, 스크립트 및 종속성을 버전 관리 시스템에 저장하는 것은 지속적 통합을 구현할 때 필수적인 첫 걸음입니다.
버전 관리 시스템이 있다고 다 해결되는 것은 아닙니다. 사용하는 방식도 중요합니다. 지속적 통합의 목표는 다수의 기여자가 만드는 변경 사항을 쉽게 구현하는 것입니다. 이 방식의 핵심은 코드 변경 사항을 더욱 빈번하게 커밋하고 공유하는 것입니다.
작동 방식은 다음과 같습니다.
철저하게 검토해야 한다거나 일일 업무량을 넘어선 작업을 처리해야 한다는 우려 때문에 커밋을 자주하는 것이 처음에는 불편할 수 있습니다. 이때 평가보다는 협업의 문화를 팀 내에 형성하는 것이 필수적입니다. 업무 방식을 변경할 때는 팀이 함께 논의하는 것이 좋습니다. 작업을 작고 관리하기 용이한 단위로 쪼개면 각 구성원이 이 방식에 적응하는 데 도움이 됩니다.
지속적으로 릴리스 가능한 코드베이스를 관리하면 CI/CD 사용 시 최대한 이점을 누릴 수 있습니다. 이러한 방식은 버그가 발생하면 즉시 해결함으로써 효율성을 재고하며, 프로덕션에서 문제가 발생할 경우 빠르게 수정을 배포할 수 있습니다.
자동화된 테스트와 파이프라인 단계에서는 코드 릴리스가 가능한지 여부에 관한 피드백을 즉각적으로 제공합니다. 이 모범 사례에서는 강조 표시되는 문제가 있다면 어떻게 대응해야 하는지에 초점을 맞춥니다.
팀은 빌드에 대한 책임을 공동으로 지고, 문제 발생 시 신속한 수정을 우선해야 합니다. 변경 사항을 마지막으로 만든 개발자를 탓하기보다는, 특히 압박을 받고 있을 때 팀이 협업해서 문제를 해결하며 CI/CD 워크플로를 강화하고 지속적인 개선을 지원하는 건설적인 문화를 장려해야 합니다.
구문 실수나 종속성 누락과 같이 간단한 오류로 인해 빌드가 실패하는 위험을 줄이기 위해 팀원은 변경 사항을 공유하기 전에 초기 테스트를 로컬에서 빌드하고 테스트해야 합니다. 또한 중복 작업을 막기 위해 전원이 CI/CD 시스템과 동일한 스크립트를 사용해야 합니다.
흔한 실수 중 하나는 CI/CD 파이프라인의 각 단계마다 새로운 빌드를 생성하는 것입니다. 여러 환경에 맞춰 코드를 다시 빌드할 경우 일관성 문제가 발생할 위험이 있고, 이에 따라 이전의 모든 테스트가 통과되었다고 확신하기 어려워집니다.
대신 동일한 빌드 아티팩트를 사용해 빌드 파이프라인의 각 단계를 진행하고 최종적으로 라이브 릴리스를 완료해야 합니다.
변수, 인증 매개변수, 구성 파일 혹은 스크립트를 빌드 자체에 임베딩하지 않고 개발 스크립트를 통해 호출함으로써 시스템에 종속되지 않는 빌드를 유지하세요.
빌드 아티팩트를 소스 코드의 부산물로 간주하세요. 소스 관리 시스템이 아니라 Nexus와 같은 중앙 집중식 아티팩트 저장소에서 아티팩트의 버전을 관리하고 보관하세요.
CI 서버를 사용하여 같은 빌드 아티팩트를 모든 테스트 환경에 배포하는 과정을 자동화하세요. 아티팩트가 여러 단계를 거치면서 팀에서도 아티팩트를 더욱 신뢰할 수 있게 됩니다.
CI/CD는 주로 자동화된 테스트로 소프트웨어 품질을 보증하지만, 그렇다고 가능한 모든 결과에 대한 테스트를 목표로 할 필요는 없습니다.
테스트 커버리지와 작업 성과 사이에서 균형을 찾는 것이 매우 중요합니다. 테스트 결과가 나올 때까지 너무 오랜 시간이 걸리면, 개별 구성원들이 프로세스를 우회하거나 가속화할 이유나 방법을 찾게 될 위험이 있습니다.
여러 계층의 자동화된 테스트 커버리지를 만들어 유닛 테스트부터 시작한 다음 통합 혹은 구성 요소 테스트를 진행하세요.
빠르게 완료되는 테스트를 먼저 실행하여 최대한 빨리 피드백을 받으세요. 일반적으로 유닛 테스트가 가장 빠르게 실행됩니다.
테스트를 배치 단위로 나누고 병렬로 실행하여 결과를 더 빨리 받는 것을 고려해 보세요.
빠른 테스트가 통과하고 빌드에 신뢰도가 쌓였을 때에만 실행이 오래 걸리는 테스트를 추가하세요.
수동으로 품질 보증을 할 때 소요되는 시간과 팀의 가용성을 고려하면, 수동 품질 보증 단계는 모든 자동화된 테스트가 성공적으로 완료한 후로 제한하는 것이 좋습니다.
모든 가능성을 확인하기 위해 실행이 오래 걸리는 테스트를 사용하지 마세요. 낮은 수준의 테스트로 커버리지를 넓히는 것에 집중하고, 제품과 사용자에게 특히 높은 위험을 야기하는 영역에 높은 수준의 테스트를 집중적으로 사용하세요.
사전 프로덕션 환경을 오래 실행하면 설정이 원래의 설정과 달라질 수 있습니다. 이 구성 편차는 일관되지 않은 테스트 결과를 낳아 CI/CD 프로세스의 신뢰도를 낮춥니다.
파이프라인을 실행할 때마다 테스트 및 스테이징 환경을 새로 고치는 것은 투자할 만한 가치가 있는 모범 사례입니다.
빠르게 새로 고칠 수 있도록 테스트 환경을 컨테이너나 가상 머신에 호스팅하세요.
환경을 생성하고 종료하는 프로세스를 스크립트화하세요. 그러면 CI/CD 서버의 이러한 과정을 자동화할 수 있습니다.
환경 생성을 스크립트화하면 손쉽게 CI/CD 프로세스를 확장하고 다수의 파이프라인을 동시에 실행할 수 있습니다.
정적인 환경을 선택하는 경우에는 각각의 환경을 별도로 관리해야 구성 편차를 피할 수 있습니다. 이러면 QA 프로세스가 느려지고 릴리스가 지연됩니다.
CI/CD 프로세스는 코드와 프로덕션 배포에 필요한 자격 증명에 대한 액세스를 제공하기 때문에 공격자들의 주요 표적이 됩니다. 따라서 CI/CD 프로세스에 보안 모범 사례를 적용하는 것이 중요합니다.
CI/CD 전략에 투자를 한 후, 릴리스 신뢰도가 확보되는 파이프라인을 만들었다면, 개별 구성원이 프로세스를 우회하도록 허용하여 이러한 노력을 헛되게 만들게 해서는 안 됩니다.
사소하거나 긴급한 변경 사항이 있을 때 CI/CD 프로세스를 우회하려는 사람이 종종 있습니다. 그러나 타협해서는 안 되는 이유가 몇 가지 있습니다.
누구든지 프로세스 우회를 요청한다면 잠시 시간을 내어 CI/CD 파이프라인의 장점을 설명해 주세요. 또한, 기존 프로세스에서 개선할 부분이 있다면 어디인지 물어보는 것도 좋습니다.
프로덕션 환경(즉, 제품)의 모니터링을 구현하는 것도 파이프라인을 설정하는 프로세스의 일부입니다.
CI/CD 파이프라인을 위한 모니터링과 유사하게 설정하는 것이 정석입니다.
CI/CD 도구가 수집한 메트릭을 사용하여 잠재적인 문제와 개선 영역을 식별하세요.
트리거되는 빌드의 수를 주, 일 혹은 시간 단위로 비교하여 파이프라인 인프라의 사용 패턴을 파악하세요. 모니터링은 확장이 필요한지 판단하고 최대 부하가 발생하는 시간을 파악할 때 유용합니다.
배포 속도를 시간의 흐름에 따라 추적하여 추세를 식별하고 성능 최적화에 투자할 시기를 평가하세요.
자동화된 테스트로 얻은 통계 자료를 활용하여 병렬화하기에 좋은 영역을 찾으세요.
일상적으로 무시되는 QA 결과를 식별하여 테스트 커버리지를 간소화할 수 있는 곳을 찾으세요.
성공적인 CI/CD 워크플로를 만드는 일에는 프로세스와 사용하는 도구뿐만 아니라 팀과 조직 문화도 중요합니다.
지속적 통합, 전달 및 배포는 핵심적인 DevOps 프로세스입니다. 개발자, QA 엔지니어 및 운영 팀 간의 통상적인 장벽을 허물고 여러 분야의 협업을 촉진하는 것이 목표입니다. DevOps 모범 사례를 도입하면 여러 장점이 있습니다.
팀원이 전체 워크플로를 빠짐 없이 파악할 수 있고 협업할 수 있는 기회도 생기며 다양한 전문성에서 이점을 얻을 수 있습니다.
파이프라인 관리의 책임을 공유하면 한 사람이 단일 실패 지점이 되는 것을 막을 수 있습니다.
소프트웨어 전달에서 책임 공유를 장려하면 빌드 수정, 테스트 자동화 혹은 프로세스 개선 등을 통해 모든 팀원이 기여할 수 있습니다.
팀원들이 아이디어를 실험하고 공유할 수 있는 신뢰의 문화를 촉진하면 조직에 이익이 되고 향상된 소프트웨어를 제공할 수 있습니다.
문제가 발생하면 이를 배움의 기회로 삼아, CI/CD 작업의 신뢰도와 효율성을 개선할 수 있습니다.
지속적 통합, 전달과 배포를 위한 모범 사례를 따르면 여러 장점이 있습니다.
빌드, 테스트, 배포 작업을 자동화하면 릴리스 프로세스가 빨라지므로 소프트웨어 업데이트를 빠르게 전달할 수 있습니다. 시장에 릴리스하는 시간을 줄이고 기능을 사용자에게 빠르게 전달하려면 자동화된 CI/CD는 필수적입니다.
변경 사항을 자주 배포하면 사용자들로부터 피드백을 정기적으로 수집할 수 있습니다. 사용자들의 인사이트는 계획을 다듬고 전략을 조정하는 데 유용합니다.
자동화된 QA 프로세스에서는 개발 주기 초반에 버그를 탐지하여 빠르게 해결할 수 있으므로 코드 품질을 높이고 소프트웨어의 성능을 높일 수 있는 순환을 만들 수 있습니다.
검사가 자동화되면 모든 변경 사항이 일관적으로 검사되며 버그가 프로덕션에 도달하는 위험을 최소화합니다. 그 결과로 사용자는 더욱 원활한 경험을 하게 되고 다운타임이 발생할 확률은 훨씬 낮아집니다.
스프트웨어 빌드, 테스트, 배포처럼 반복적인 과정을 자동화하면 팀원의 여유 시간이 확보되어 새로운 기능 개발, 혁신적인 설계 혹은 전체적인 DevOps 방식 개선과 같이 창의적인 작업에 집중할 수 있습니다.
지속적 통합, 전달 및/혹은 배포를 구현하는 것은 막막하게 느껴질 수도 있는 작업입니다. 성공적인 CI/CD 전략에는 몇 가지 주요 요소를 고려해야 하며 오랜 시간에 걸쳐 탄탄한 DevOps 문화를 만드는 것이 필요합니다.
소프트웨어 개발 프로젝트에서와 마찬가지로 반드시 목표를 정의하고 팀과 소통해야 합니다.
지속적인 전달로 사전 프로덕션 환경에 주 단위의 릴리스를 목표로 하든, 사용자에게 신속한 업데이트를 보내는 지속적 배포를 추구하든, 명확한 목표를 설정하는 것이 필수적입니다.
목표를 정의했다면 목표 달성을 위해 필요한 과정을 관리할 수 있는 크기로 나누세요. 점진적으로 파이프를 구현하면 처음부터 CI/CD의 장점을 경험하실 수 있습니다.
대부분의 팀은 지속적 통합부터 시작합니다. CI에는 버전 관리, 브랜치 전략, 자동화된 테스트 커버리지 추가 혹은 확장과 빌드/테스트 자동화와 같은 작업이 포함됩니다. CI 서버를 사용하면 이러한 활동을 조율하고, 결과를 취합하고, 논리를 구현하여 이어지는 빌드 및 테스트 단계를 자동화하기에 좋습니다.
자동화된 CI 흐름을 설정했다면 지속적 전달 혹은 배포 작업을 진행할 수 있습니다.
환경 생성을 자동화하면 장기적으로 시간을 절약하고 파이프라인의 신뢰도와 안정성을 높일 수 있습니다. 이러한 환경을 활용하여 더욱 자동화된 테스트나 수동 테스트를 실행할 수 있습니다.
구현 단계 및 CI/CD 전략이 실행된 이후에 CI/CD 도구에서 나온 데이터를 분석하고 팀원과 함께 프로세스를 개선할 기회를 찾는 것이 좋습니다. 이렇게 반복이 가능한 방식을 활용하면 지속적으로 개선하고 팀과 조직 내에서 CI/CD의 장점을 최대화할 수 있습니다.
DevOps 모범 사례를 채택하면 지속적 통합, 전달 및 배포 프로세스를 최대한 활용할 수 있습니다.
TeamCity는 CI/CD 파이프라인을 만들고 확장하는 것을 지원하도록 설계된 CI/CD 자동화 플랫폼입니다. 기존의 빌드 및 테스트 자동화 수준에 관계없이 TeamCity는 손쉽게 시작할 수 있습니다.
업계를 선도하는 모든 버전 관리 시스템과 광범위하게 통합되고, 인기 있는 빌드 및 테스트 프레임워크를 지원하며 직관적인 웹 기반 UI를 제공하기 때문에 단 몇 분이면 첫 파이프라인을 만들 수 있습니다. 코드로서의 구성을 완벽하게 지원하기 때문에 UI에서 파이프라인 정의를 모두 생성하고 버전 관리 시스템에 저장할 수 있습니다.
TeamCity는 높은 확장성과 성능을 제공하도록 설계되었기 때문에, 자동화된 테스트에서 피드백을 신속하게 얻을 수 있으며, 주요 IDE와 메시징 플랫폼과 통합되어 있으므로 어디서 업무를 하든 알림을 받을 수 있습니다. 광범위한 보안 기능은 코드와 파이프라인을 공격자로부터 안전하게 지켜줍니다.
프로세스가 성숙해지면 TeamCity의 기본 테스트 커버리지 테스트, 불안정한 테스트 식별, 빌드 에이전트 통계 등을 활용하여 CI/CD 프로세스를 항상 최적의 상태로 유지할 수 있습니다.