본문 바로가기
DevOps

#3 Build(빌드)자동화와 Deployment(배포) 자동화

by Anonymouszero 2025. 4. 26.
반응형

CI/CD (DevOps와 동일한 말 아님)
 - CI : Continuous Integration(지속적 통합)
        : 소스 변경 시 올바른지 확인하는 과정 거침
        : 테스트, 빌드 등을 확인하여 통합
 - CD : Continuous Deployment(지속적 배포)
         :  전달(Delivery) or 배포(Deployment)
         : CI를 통해 문제 없음을 확인한 뒤 시스템에 적용하는 과정 or 고객에게 전달하는 과정

DevOps : 개발의 결과가 운영에 전달되는 개념
              : CI/CD의 개념을 포괄함

CI(Continuous Integration / 지속적 통합)
 - 지속적으로 소스 변경사항 추적 > 확인 절차(빌드, 테스트 등) > 통제(Notification) or Artifact 생성
1) 목적
 - 통합의 지연으로 발생하는 문제 > 자주 통합하여 이를 줄여야 함
  > 지연 : 변경 사항과 원본이 결합한 뒤 안정적인지 확인해야 함
             : 안정적이어야 통합이라 부름
             : 위의 과정(확인 과정)이 길어짐(안하게 됨) > 시간이 오래걸리기 때문
             : 버그/결함이 개발을 할 때마다 증가한다고 봄 > 확인이 필요하지만 이 부분이 생략
               > 혼자 개발할 경우 단순 누적 됨
               > 팀 단위 개발할 경우 다른 사람이 버그를 의존하게 됨 > 심각한 결함이 노출될 수 있음

 - 개발은 협업
  : 다수의 개발자가 공동으로 작업할 때 (맡은 기능이 다름 > 의존성 존재)
   > 다른 개발자의 변경사항을 알아야 함(=통합 =인지)
    1. 오류를 서로 수정하게 되었을 때 방식이 다르다면 하나로 합치기 힘듦
    2. 둘 다 잘 못 수정 > 또 다른 개발자가 이를 의존하게 되었을 때 빌드가 안되는 등의 문제 발생
    : 통합의 지연이 존재할 경우의 문제  >> 자주 통합하여 문제 해결 + 빌드 시도
      > 병합 충돌                                   >> 빠른 발견이 가능해 짐 
      > 빌드 오류                                   >> 빠른 발견이 가능해 짐
      > 잠재적인 버그 확대                     >> 버그에 대한 의존성의 빠른 제거가 가능 함(완벽히 제거는 불가능)

2) 협업 방식
 - SCM(Software Configuration Management) 수행
  : 소프트웨어 형상 관리
  : 소프트웨어 개발 및 유지 보수 과정에서 발생하는 소스코드, 문서 등
    각종 결과물(형상)에 대한 변경사항을 체계적으로 관리하고 제어하기 위한 활동

 - SCM을 위한 방법
  - VCS(Version Control System) : 버젼 관리 시스템 
   : 소스코드의 형상관리
   : 다양한 버젼의 소프트웨어나 콘텐츠를 관리하고 추적하는 도구
   : SVN, Git과 같은 솔루션 활용
    ~> RCS -> CVS -> SVN으로 변화
    ~> 최근에는 Git을 사용 (Github는 클라우드 시스템으로 둘이 다름)

  - 나(우리 팀)에 맞는 VCS 선택 
   : 소스코드의 변경 사항 발생을 인지 가능한 VCS 선택
   : Propagation까지 가능한 능력이 필요(보통 VCS가 가지고 있음)
   : 지속적 통합을 자동화 할 수 있음

  - SCM과 CI
   : 모든 사람의 코드 변경 내용 발생 > 인지 > 변경 확정(Commit) > 검증(Compile 혹은 Build, Test 등) 수행
   : 지속적 통합 수행(Commit > Build > Test > ... )
   : 충돌의 조기 발견 가능
   : 다른 사람의 코드와 상호작용 확인
   : 버그가 자리잡기 전에 제거(버그에 대한 의존성을 조기 제거 가능함)

CD(Continuous Deployment / 지속적 배포)
: CI의 결과(Artifact / 실행 Binary) > System에 전달(지속적 전달) > System에 Install/Configuration(지속적 배포)
: 운영 단계에 적용하는 것

배포란?
- 테스트가 완료된 결과물(CI의 결과물)을 운영 시스템(Production System)에 반영하는 것
- 배포에서 사람의 개입을 줄이고 루틴화 > 오류 제거 > 자동화

Release
 - 운영 시스템에 개발 결과물을 반영하는 것
 - 문제가 발생한 경우 즉각적 롤백이 필요
  : 개발팀에 수정 요청 > 수정까지 긴 시간이 필요 > Previous Version으로 바꿔야함(운영 입장)
  : 롤백을 할 수 없는 경우가 발생한다면 매우 위험한 상태
 - Old Artifact를 다시 설치하고, 설정 값들을 이전 상태로 변환시키는 행위 : 롤백
 - 사용자가 이러한 경험을 최소화 할 수 있도록, 바로 Release하지 않고 운영팀이 테스트 해볼 수 있는 환경이 필요

Staging(스테이징)
 - 운영 시스템에 준하는 테스트 운영 시스템에 개발 결과물 반영
 : 운영 시스템 수준에서 발생할 수 있는 문제를 발견하는 것이 목적 =  결함을 초기에 발견하기 위함
 : 운영 시스템과 동일하거나 유사한 형태의 시스템 준비
 : 테스트 운영 시스템은 언제든 폐기 혹은 재구성이 가능해야 함
 ~> 원활히, 실수없이 진행, Programmable 하게 진행 => 자동화 가능

지속적 배포
 : 모든 사람의 코드 변경 => 테스트 완료(CI)
 : CI를 통과한 결과물의 관리 => CD
  > Staging단계 -> Release단계

 : CI의 결과물을 체계적으로 관리할 수 있어야 함

개발팀과 운영팀의 협업
1)  형상관리
 - 개발팀 : 소스코드, 문서 등
 - 운영팀 : 개발팀의 결과물(Artifact)

2) 충돌(Conflict) > 롤백
- 개발팀 : 이전의 상태로 되돌릴 수 있는 SCM 솔루션(예 : VCS) 활용
- 운영팀 : 이전 개발팀의 결과물로 시스템을 롤백

파이프라인(Pipeline)
- CI/CD 과정의 통합

CI/CD 과정 그림

- 파이프라인
 : 소스 관리 시스템과 통합이 필요
  ~> VCS 부터 파이프라인이 시작된다고 생각

개발에서의 Pipeline

 : CI/CD 파이프라인의 시작점 = Commit
  > Commit(커밋) : 변경사항을 소스 관리 시스템에 반영하는 행위
  > CI는 Commit을 확인하고 테스트를 보장해야 함 (자동화가 필요) ~> CI Build Server가 필요
  > 이때, Build와 Test에서 어떤 것이 실패인지에 대하여(Failure) 고민해야 함

 > 개발자의 프로세스
 : SCM과 통합  
 : 선택한 브랜치/태그에 커밋이 발생하면 파이프라인(CI 빌드)을 시작

개발자 Process

 : 모든 커밋을 전부 CI 빌드하지 않음(선택적 적용)
 : 브랜치/태그 커밋을 기준으로 선택하여 파이프라인(CI빌드)를 시작 = CI 빌드 서버의 부하를 줄임

> 커밋 전 테스트
 : 알려진 다른 사람의 코드 활용 > 다른 사람 코드와 융합되었을 때 문제가 발생하는지 확인
 : 변경한 코드 내 혹은 변경한 코드로 인한 영향을 파악
 : 만약, 에러 발생시 다른 사람 코드의 문제라면 새로운 issue생성

> 커밋 충돌 (Conflict)
 : 최신의 다른 사람의 코드와 결합에서 문제
 : 동일한(유사한) 위치의 소스 코드 변경사항이 발생
 : 나중에 커밋한 개발자가 어떻게 적용할 것인지 결정해주어야 함 ~> 못한다면 Review등의 행위가 필요(새로운 issue 생성)

> 빌드 실패
 : 최신의 다른 사람의 코드의 의존성 확인
 : 의존성 충돌 문제 확인

> CI 테스트 실패
 : 다른 사람의 변경사항과 결합에서의 비즈니스 로직 검사
 : 소프트웨어 통합 관점에서 유닛 테스트, 통합(integration) 테스트, E2E(end to end) 테스트 등을 수행
  ~> 예상 가능한 문제를 조기에 발견
 : 테스트 완료시 Stable하다고 이야기 = Release 하려는 것이 목적
  > 테스트는 Stable의 여부를 확인 하는 것

+) CI Pipeline의 확장

확장 Pipeline

1. 품질 검사
 > 기능에는 문제 없음
 : 가독성을 위한 작성 스타일 검사(조직 내 규칙 준수 여부 확인)
 : 버그를 유발할 수 있는 코드 패턴 검사
 
2. 문서화
 > 개발 팀이 공유할 수 있는 정보 문서화

결론)
 - 개발자간 소통 문화 / 피드백
 - 개발 관련자 <-> 동료 개발자 : Messageing Service(SMS, Slack 등)
  ~> 여러 관련자들에게 현재의 개발 상태(성공 여부)등을 메신저 프로그램 등을 통해 공유 가능
  ~> 문제(Isuue)와 명확한 Feedback 전달이 가능해짐


- CD에서의 Build Management
 : CI Build Server관리
  > 복잡한 일 수행
   - 빌드 : 모든 파일 컴파일, 모듈 별 컴파일(각 의존성에 따라 빌드를 해야함)
   - 테스트 : 테스트 방법에 따라 여러 테스트 진행
   - 품질검사, 문서화 : 언어, 툴에 따라 다름
  > 따라서, CI Build 자체를 관리할 필요가 있음
   ex) CI Build 서버에 부하가 많이 걸린다면 병렬로 처리하기 위해 서버를 늘려야 함(탄력적)

 : 빌드 단계가 복잡한 이유
  - 환경의 구성(언어, 운영체제, CPU 아키텍쳐 등)
  - 빌드 툴체인의 다양성(make, cmake, 등)

 : 테스트 단계가 복잡한 이유
  - 유닛 테스트
   : 언어에 따른 도구 사용
   : 코드 커버리지 보고서(Artifact) 생성
  - 통합 테스트
   : 통합 환경 구축 및 테스트
   : 데이터베이스(Clean State), 웹 서버 등... 환경 준비 필요
  - E2E 테스트
   : 종단(End to End)간 테스트
   : 종단 테스트 환경 구축 필요
   : ex) REST API의 경우, HTTP 프로토콜 상에서 API 호출(CURL 등 이용)
  
 : 코드 검토/품질검사 단계가 복잡한 이유
  - 코드 스타일(가독성) : 들여쓰기, 이름 규칙 등
  - 오류 가능성 높은 코드 패턴 검출
   : 복사-붙여넣기 탐지
   : 함수 분기 복잡도
   : 불용 코드 탐지 등

 : 문서화 단계가 복잡한 이유
  - 개발 문서 생성
   : API Document(ex: JavaDoc 등)
  - 설치 / 환경 구성 방법 등
   : 동료 개발자와 공유해야 하는 다양한 정보


빌드 에이전시 구성
: 빌드하는 환경 요건에 맞는 시스템 구성
 1) 가상화 기술을 활용한 Provision 기법
   : 리소스의  탄력적 구성 및 확장성 확보 용이
 2) 사전에 Provision 된 환경에서 빌드/테스트 수행
   : 수행 전/후 Clean up을 통해 빌드/테스트가 오염되지 않도록 조치해야 함
 3) 동시 실행을 통한 파이프라인 효율성 극대화

실패(Failure)의 정의
: CI/CD의 각 단계에서 발생하는 Failure
 1) 자명한 Failure
   : 빌드 실패 / 테스트 실패
 2) 어떤 기준을 충족하지 않는 Failure
   : test coverage N% 이상 만족
   : 코드 품질 경고 N개 이하 만족

아티팩트(Artifact) 관리
  : CI 단계에서의 결과물/부산물

Artifact 발생

 : 단계별 Artifact
  1) Build > Binary
  2) Test > Test  보고서
  3) 품질 검사 > Quality Report
  4) 문서화 > 문서 

 : CD 파이프라인으로 연계 필요
  > 빌드 결과(ex: 실행 바이너리 등)를 Staging / Deployment 단계로 전달
   ~> 지속적 전달 활성화
   ~> CD 단계에서 롤백의 기준 결과물
  > 테스트 / 품질검사 / 문서화 결과를 개발자 공유 환경에 배포

진행 상황 추적
 : 각 단계별 신속한 피드백 제공
  > 빌드 및 테스트에 대한 실시간 보고
   ~> 실패의 원인(실패까지의 과정이 기록되어 있어야 함)
   ~> 빌드 로그 확인
  > 완료된 빌드(아티팩트)의 정보 제공
  > 메시징 서비스와 연계를 통한 알림 기능 : 실시간 통지
   ~> SCM > CI > CD : Message Service 사용
  > 버그 추적 도구와의 통합 등 수행
   ~> Issue Tracker를 사용 (이슈 부터 시작)
   ~> Issue > SCM > CI > CD


  

반응형

'DevOps' 카테고리의 다른 글

#6 IaC 개선(구성 관리 도구와 특징)  (0) 2025.04.26
#5 Github에서의 Issue관리  (0) 2025.04.26
#4 VCS(버전 관리 시스템)과 Issue 관리  (0) 2025.04.26
#2 Devops 개요  (0) 2025.04.25
#1 Devops 개요  (0) 2025.04.25