IT STUDY LOG

[지속적 통합] 02. 지속적 통합 본문

devops bootcamp 4/클라우드 서비스 운영

[지속적 통합] 02. 지속적 통합

roheerumi 2023. 4. 20. 11:43

# 학습 목표

  • 지속적 통합의 필요성을 설명할 수 있다.
    • 지속적 통합 개념이 나오게 된 배경을 이해할 수 있다.
    • 지속적 통합의 장점을 설명할 수 있다.
    • 지속적 통합의 원칙을 이해할 수 있다.
  • 빌드/테스트의 개념을 이해할 수 있다.
    • 테스트 주도 개발(TDD)에 대한 정의와 필요성을 설명할 수 있다.
    • 테스트 주도 개발(TDD) 사이클을 설명할 수 있다.
    • 테스트의 종류 (단위 테스트, 통합 테스트, E2E 테스트)를 설명할 수 있다.
  • 릴리스의 개념을 이해할 수 있다.
  • CI 도구(여기서는 GitHub Action)를 이용하여 지속적 통합이 이루어지는 과정을 직접 구현할 수 있다
  • 다양한 CI 도구의 차이점을 이해할 수 있다.
  • 코드와 환경 변수를 분리해야 하는 이유를 설명할 수 있다.

 


# 학습 내용

1.  지속적 통합

지속적 통합 리뷰

- 지속적 통합이란 팀 구성원이 각자의 작업을 자주 통합하는 소프트웨어 개발 방식

 

장점

  • 버그를 일찍 발견 가능
  • 빌드 및 테스트와 같이 사람이 해야 할 일들을 자동화 가능
  • 테스트가 완료된 코드에 대해 빠른 전달이 가능
  • 지속적인 배포가 가능
  • 개발자의 생산성을 향상

 

지속적 통합이 있기 전의 개발

지속적 통합이 있기 전의 릴리즈 생성 방식

- 지속적 통합이란 개념이 등장하기 전에는 릴리스를 만들기 위해 수동 빌드 및 배포 프로세스를 사용

- 즉, 개발자가 코드 변경 사항을 수동으로 컴파일하고 테스트한 다음, 새로운 버전을 릴리스하는 데 필요한 파일을 수동으로 복사하고 배포

- 수동 프로세스는 매우 시간이 많이 소요되고, 인적 오류 가능성도 높아서 신뢰성이 떨어지며, 개발자들이 릴리스를 위해 필요한 모든 것을 정확하게 알아야 할 필요성 존재

-> 이는 팀의 협업 능력을 제한하고, 프로젝트 전체에서 일관된 개발 및 배포 프로세스를 구축하는 데 어려움을 초래

 

지속적 통합이 해결한 기존의 개발 방식의 문제점

- 지속적 통합은 자동화된 빌드 및 배포 프로세스를 통해 코드 변경 사항을 빠르게 테스트하고 릴리스할 수 있도록 도와주는 개발 방법론으로, 개발자들은 자신의 코드 변경 사항이 빌드, 테스트 및 배포 프로세스를 통과하여 전체 프로젝트에 안정적으로 통합되는지 확인 가능

품질 향상

- 기존의 개발 방식에서는 코드 변경 사항을 수동으로 빌드 및 테스트하고 배포해야 했기 때문에 시간이 많이 소요되고 휴먼 에러 발생 가능성이 높음 -> 프로그램 품질 저하 요소

- 지속적 통합을 도입하면 코드 변경 사항이 자동으로 빌드, 테스트 및 배포되므로 프로그램의 품질이 향상

개발 생산성 향상

-  지속적 통합을 도입하면 개발자들이 코드 변경 사항을 자주 빌드, 테스트하고 배포할 수 있으므로 개발 생산성이 향상

- 코드 변경 사항을 더 빠르게 피드백 받을 수 있어서 개발자들이 코드 수정을 더 빠르게 수행할 수 있음

결함 수정 속도 향상

- 지속적 통합을 도입하면 결함을 발견했을 때 빠르게 대응 가능

- 지속적 통합을 통해 개발자들은 자신이 수정한 코드가 전체 프로젝트에 안정적으로 통합되는지 빠르게 확인 가능하므로  결함 수정에 소요되는 시간이 단축

협업 향상

- 지속적 통합은 개발자들이 코드 변경 사항을 자주 공유하고 통합할 수 있도록 함

- 개발자들 사이의 협업을 강화해 개발 프로세스 전체에서 일관성을 유지할 수 있도록 지원

- 지속적 통합을 통해 개발자들은 코드 변경 사항이 다른 팀원들과 충돌하는지 빠르게 확인이 가능하므로 개발 프로세스의 협업 능력을 향상 가능

 

지속적 통합을 통해 버그 조기 발견이 가능한 이유

자동화된 빌드 및 테스트 과정

- 지속적 통합은 코드 변경 사항이 자동으로 빌드 및 테스트되므로, 버그가 발생한 코드 변경 사항이 더 이상 시스템에 통합되지 않음

- 즉 버그가 있는 코드 변경 사항이 통합되는 것을 미연에 방지하여 버그를 일찍 발견 가능

빠른 피드백

- 지속적 통합에서는 빌드 및 테스트 과정이 자동화되어 더 빠르게 수행됨

- 버그가 발생한 코드 변경 사항에 대한 피드백이 더 빠르게 제공되므로, 개발자들은 버그를 더 빨리 수정 가능

테스트 커버리지 증가

-  지속적 통합을 통해 자동화된 테스트가 더 자주 수행되므로, 코드 변경 사항에 대한 테스트 커버리지가 향상

코드 변경 사항 추적

- 지속적 통합 시스템에서는 모든 코드 변경 사항이 추적되므로, 버그가 발생한 원인을 더 쉽게 찾을 수 있고 버그 수정 시간 단축 가능

 

지속적 통합 과정에서 반드시 자동화가 이뤄져야 하는 부분

빌드

- 개발자가 작성한 코드를 실행 가능한 소프트웨어로 만드는 과정인 빌드 과정은 반드시 자동화되어야 함

- 빌드 과정에서 수동으로 수행되는 작업은 오류가 발생할 가능성이 높음

테스트

- 빌드된 소프트웨어를 테스트하는 과정도 반드시 자동화되어야 함

- 자동화된 테스트는 반복적인 테스트 과정을 수행하는 데 있어서 높은 일관성과 정확성을 보장하며, 수동으로 테스트를 수행하는 것보다 효율적

배포

- 빌드 및 테스트가 모두 완료된 소프트웨어를 실제 사용자에게 배포하는 과정도 자동화되어야 함

- 배포 과정에서 수동으로 수행되는 작업은 오류가 발생할 가능성이 높음

모니터링

- 자동화된 모니터링은 시스템의 성능, 안정성 및 가용성을 지속적으로 모니터링하여 이상 사항을 감지하고 조치할 수 있도록 지원

- 모니터링 과정에서 수동으로 수행되는 작업은 실시간 모니터링이 어렵기 때문에 자동화되어야 함

 

2. 지속적 통합의 원칙과 장점 

지속적 통합의 원칙 - Martin Fowler가 제시한 원칙

  1. 단일 소스 레파지토리를 유지해야 함
    • 프로젝트에서 제품을 빌드하기 위해 함께 조정해야 하는 수많은 파일이 포함되기 때문
    • 이 모든 파일이 단일 소스 레파지토리가 아닌 곳에 뿔뿔이 흩어져 있다면 추적하는 것이 굉장히 힘들어질 것
  2. 빌드를 자동화해야 함
    • 사람들에게 이상한 명령을 입력하게 하거나 대화 상자를 클릭하게 하는 것은 시간 낭비
    • 빌드가 수동으로 진행된다면, 수많은 실수를 낳을 수 있음
  3. 셀프 테스팅 빌드를 만들어야 함
    • 빌드 프로세스에 자동화된 테스트를 포함 함으로써 버그를 더 빠르고 효율적으로 파악할 수 있음
    • 지속적 통합의 일부인 테스트 주도 개발(TDD)을 통해 손상된 빌드를 즉시 확인, 수정할 수 있음
  4. 매일 메인라인(시스템의 현재 상태를 의미하며 회사마다 어떤 브랜치를 메인라인으로 두는지는 조금씩 다르지만, 여기서는 master 브랜치를 메인라인으로 취급)에 커밋을 해야 함
    • 각자의 진행 상황을 추적하는 데 도움
    • 짧은 주기로 커밋을 하므로, 충돌이 발생한 후 빠르게 충돌 상황을 감지할 수 있음
      • 해당 시점에는 충돌이 많이 발생하지 않아 문제를 쉽게 해결할 수 있음
      • 만약 통합의 빈도가 길어 충돌을 늦게 발견하게 된다면 문제를 해결하기 매우 어려울 수 있음
  5. 모든 팀원이 무슨 일이 일어나고 있는지 알아야 함
    • 지속적 통합은 커뮤니케이션에 관한 것이므로 모든 사람이 시스템 상태와 시스템에 적용된 변경 사항을 쉽게 확인할 수 있어야 함

 

기타 원칙

  1. 모든 커밋은 통합 서버의 메인라인에서 빌드 돼야 함
    • 개발자 간 개발 환경에 차이가 있기 때문
  2. 빌드의 오류를 즉시 수정할 수 있어야 함
    • 빌드가 중단되는 것이 나쁜 것은 아니지만, 이러한 상황이 매번 항상 발생하는 경우 사람들이 커밋 전에 로컬에서 업데이트 및 빌드에 대해 충분히 주의하지 않고 있음을 시사함
    • 지속적 통합 도구를 사용하면 빌드의 오류를 즉시 확인할 수 있음
  3. 빌드가 빨리 되도록 유지해야 함
    • 지속적 통합의 요점은 신속한 피드백을 제공하는 것
    • 오랜 시간이 걸리는 빌드는 지속적 통합의 가장 큰 장애물
  4. 운영 환경과 동일한 환경에서 테스트가 진행돼야 함
    • 다른 환경에서 테스트하는 경우 환경의 차이로 인해 테스트에서 발생하는 일이 프로덕션에서 발생하지 않을 위험
  5. 누구나 최신 실행 파일을 쉽게 얻을 수 있어야 함
  6. 배포 자동화가 이루어져야 함
    • 지속적 통합을 수행하려면 커밋 테스트를 실행하기 위한 환경과 2차 테스트를 실행하기 위한 하나 이상의 환경이 필요함 
    • 이러한 환경 간에 실행 파일을 하루에 여러 번 이동하기 때문에 이 작업을 자동화 할 필요가 있음
    • 따라서 응용 프로그램을 모든 환경에 쉽게 배포할 수 있는 스크립트를 갖는 것이 중요함
    • 매일 프로덕션에 배포하지 않을 수도 있지만, 자동 배포는 프로세스 속도를 높이고 오류를 줄이는 데 도움수 있음
    • 테스트 환경에 배포하는 데 사용하는 것과 동일한 기능을 사용하기 때문에 저렴한 옵션이 될 수 있음

 

지속적 통합에서 테스트가 중요한 이유

  • 테스트를 통해 결함과 버그를 조기에 발견할 수 있으며, 이는 개발자의 생산성을 향상 가능
  • 제품의 결함과 버그를 발견하고 수정하는 것은 소프트웨어의 품질을 보증하고, 더 안정적이고 사용하기 용이하게 만듦

 

# References

- 챗 GPT

Comments