본문 바로가기
Study/지속적인 통합

[지속적인 통합] 4장. 변경될 때마다 소프트웨어를 빌드하기

by Nahwasa 2023. 3. 8.

지속적인 통합 스터디 메인 페이지

* 주의 : 책(폴M 듀발 저 - 지속적인 통합) 내용 중 기억하고 싶은 내용 및 제 생각을 적은 글 입니다. 책이 나온지 오래되어 설명에 나온 기술스택이 현재 사용되지 않는게 많아 기술스택보다는 이론이나 책의 조언들 위주로 작성할 것 같고, 기술스택은 제가 알고있는대로 수정해서 작성합니다. 따라서 책에서 말하고자 하는 바와 다를 수 있습니다.

* 별도로 표기되어 있지 않다면 이미지 출처는 '지속적인 통합 (폴M 듀발 저)' 책 입니다.

 

 

 

CHAPTER 4. 변경될 때마다 소프트웨어를 빌드하기

  • 하루 종일 수작업만 해야 한다면, 프로세스와 제품을 감시하고 개선하는 등의 다른 일을 할 시간적 여유가 전혀 없을 것이다.

 

  • 4장에서는 CI 서버를 사용하여 변경이 발생할 때마다 통합 빌드를 수행하는 방식의 장점을 논의한다.

 

 

조언들

  • 빌드를 자동화하기
    • 자동화된 빌드 스크립트를 작성하면 소프트웨어 프로젝트에서 수행하는 손이 가고, 반복적이며, 오류가 나기 쉬운 프로세스를 상당히 줄일 수 있다.빌드는 버튼을 누르는 것만큼 쉬어야 한다!

 

  • 명렁어 하나로 빌드를 수행하기
    • "필요한 거라면 뭐든지 VCS에 넣어뒀다 빼내서 쓰세요. 그래야 명령어 하나로 시스템 전체를 빌드할 수 있습니다." - 마틴 파울러
    • 바보라도 빌드할 수 있는 프로세스가 있어야 한다.

 

  • IDE에서 빌드 스크립트를 분리해내기
    • 빌드 스크립트와 IDE를 결헙시키는 일은 피해야 한다.
    • IDE는 빌드 스크립트에 의존해도 되지만, 빌드 스크립트는 IDE에 의존해선 안 된다.
    • 즉, IDE가 빌드 스크립트를 작성하기 쉽게 도와주긴 하지만 IDE 없이도 빌드 스크립트가 정상적으로 동작되어야만 한다.
      • 개발자마다 IDE가 다를 수 있으므로
      • CI 서버는 사람의 간섭 없이 자동화된 빌드를 실행시켜야 하므로

 

  • 소프트웨어 자산을 중앙 집중화하기
    • 모든 소프트웨어 자산을 중앙 집중화해야 한다.
      • "내 컴퓨터에선 잘 되는데요" 문제 방지
    • VCS에 모든 파일을 올려놓자!
      • 소스 파일이나 라이브러리 파일과 같은 컴포넌트
      • JAR, DLL 등과 같은 외부 컴포넌트
      • 설정 파일
      • 어플리케이션을 초기화하는 데이터 파일
      • 빌드 스크립트와 빌드 환경 설정
      • 일부 컴포넌트를 설치하는 스크립트
      • 등. 어떤 것이 '전체'를 이루는지 판단 내리는 것은 우리들의 몫임.

 

  • 일관성 있는 디렉터리 구조를 만들기
    • 프로젝트 내내 사용할 무수히 많은 자산의 조합을 저장소에서 가져올 수 있으려면, 일관되고 논리적인 디렉터리 구조 필요.
    • 구현 (implementation)
    • 요구사항 (requirements)
    • 설계 (design)
    • 관리 (management)
    • 배포 (deployment)
    • 테스트 (testing)
    • 도구 (tools)

 

  • 빌드를 빨리 실패하게 만들기
    • 좋은 빌드는 빨리 실패하는 법을 안다.
    • 개별 프로젝트에서 가장 자주 실패할 법한 것이 무엇이냐에 따라 빌드 스크립트에서 더 먼저 실행해야 한다.
    • 예시
      • 저장소에서 최신 변경 사항을 가져와서 컴파일
      • DB나 다른 의존성이 없는 금방 실행되는 테스트를 돌린다.
      • 다른 자동화된 프로세스를 돌린다.

 

  • 전용 통합 빌드 머신을 사용하기
    • "내 컴퓨터에선 작동하는데요"(마법의 컴퓨터) 문제 방지
    • 일반적으로 느려터진 빌드를 기다리느라 시간을 낭비하는 것보단 통합 빌드 컴퓨터에 쓸 하드웨어 자원을 증가시키는데 돈을 쓰는 편이 가치 있다.
    • 빌드를 효율적으로 돌릴 수 있는 전용 빌드 머신 사용 -> 빌드 프로세스를 자주 실행시킬 수 있고, 환경적인 가정을 줄임으로써 빌드 환경이 정말로 반복 가능해진다.

 

  • 지속적인 통합 서버를 사용하기
    • CI를 수행할 때는 CI 서버를 쓰는게 이치에 맞다.
    • 직접 CI 서버를 만들어서 써도 되지만 젠킨스 등 이미 나온 멋진 서버들이 있으니 그거 쓰란 말임.

 

  • 빌드 시간을 짧게 만들기
    • 피드백을 기다리느라 개발 활동을 멈추면 프로젝트에 참여한 모든 사람이 개발 리듬이 느려진다.
    • 팀원들이 VCS에 코드를 자주 커밋하지 않는다면, 통합 빌드가 느린 탓일지도 모른다.
    • 켄트 백 : 빌드가 10분 내로 끝나도록 유지하는게 좋다.
    • 빌드 시간이 느리다면 다음과 같은 접근 방법을 써서 빌드 지속 시간을 진단하고 줄이자.
      • 빌드 메트릭(컴파일 시간, 소스 코드의 줄 수, 검사의 개수와 유형, 검사 시간, 배포 시간 등) 수집
      • 빌드 메트릭 분석
      • 개선 방안을 선택하고 수행
      • 다시 평가하고, 필요하다면 앞선 과정을 반복한다.

 

  • 빌드를 여러 단계로 나누기
    • 가벼운 빌드를 먼저 돌리고 무거운 빌드를 나중에 돌리는 방법으로 빌드 지속 시간을 줄일 수 있다.

 

 

빌드 유형과 메커니즘

  • 빌드 메커니즘
    • 주문형 : 누군가 직접 통합 빌드를 시작시키는 것
    • 일정 기반 : 예를들어 한 시간마다 빌드를 돌리는 것
    • 변경 사항을 폴링 : 일정 간격으로 CI서버에서 VCS의 변경사항을 확인해서 변경 사항을 감지하면 통합 빌드
    • 이벤트 주도 : 예를들어 PR이나 merge 시 빌드 시작

 

  • 개인 빌드 - 주문형
    • VCS에 있는 최신 변경 사항을 자신이 변경한 코드와 통합해서 코드를 커밋하기 전에 개인 빌드를 돌려봐야 한다.
    • 절차
      • 저장소에서 고칠 코드를 체크아웃
      • 체크아웃한 코드를 변경
      • 저장소에서 가장 최근의 변경 사항을 가져옴
      • 단위 테스트를 포함하여 빌드를 돌린다
      • 변경한 코드를 저장소에 커밋

 

  • 통합 빌드 - 주문형, 변경 사항 폴링, 일정 기반, 이벤트 주도
    • 팀이 저장소에 커밋해 넣은 변경 사항과 주흐름(Head나 Trunk라고도 알려진)을 통합
    • 별도의 전용 컴퓨터에서 돌려야 한다.

 

  • 릴리즈 빌드 - 주문형, 일정 기반
    • 사용자에게 출시할 제품을 준비하는 과정

 

 

이런 게 과연 효과가 있을까요?

"내 프로젝트엔 70억 줄짜리 코드가 있습니다. 이런게 과연 효과가 있을까요?"

  • 프로젝트가 클수록, 변경의 불변성을 위해서 CI가 더 필요합니다.
  • CI가 없어도 된다는건 "난 차라리 코드 베이스에 문제가 있더라도 모르고 지낼래. 차라리 내가 무슨 일을 하고 있었는지 기억나지 않을 때까지 기다릴래" 라고 말하는 것과 동일하다.

 

레거시 애플리케이션이 있는데, 이런 게 과연 효과가 있을까요??

  • 자동화된 테스트가 없더라도 변경 요청이 있을 때마다 자동화된 테스트를 추가하는 것부터 시작해보자.
  • 물론 결함이 하나 있다면, 개발할때 만들지 않은 테스트부터 작성해야 한다는 점임.

 

"통합 빌드가 너무 오래 걸려요!"

  • 빌드를 빠르게 만들자!

 

"빌드 실패가 자주 납니다. 뭔가 잘못하고 있는 걸까요?"

  • 작동하지도 않는 코드를 커밋하고 있는 거임.
  • 개발자 각자가 통합 빌드를 돌리는 것과 똑같은 프로세스들을 돌리는 '샌드박스'를 가져야 한다.

 

"빌드 머신을 별도로 둘 여력이 없습니다."

  • 하드웨어는 통합 문제가 발생했을 때 잃게 될 시간과 비교하면 쌉니다.

 

"우리가 만드는 소프트웨어는 아주 복잡하다구요. 사람이 직접 해야 합니다."

  • CI를 만들어야 하는 완벽한 이유가 됩니다.
  • 한 번에 모든걸 밀어 넣기보단 조금씩 빌드를 발전시켜나가 보세요.
    • 대부분의 CI 시스템들은 이런 방식으로 만들어졌음!

 

 

질문

  • 빌드를 자동화했습니까? IDE가 없어도 빌드를 돌릴 수 있나요?
  • 모든 소프트웨어 자산을 버전 관리 저장소에 모아놨습니까? 버전 관리 저장소에서 필요한 파일을 모두 가져와서 빌드를 온전히 수행할 수 있나요?
  • 가장 실패할 법한 빌드 태스크를 빌드 스크립트의 앞부분에 놓아서 빌드 실패 통지를 신속히 받을 수 있게 해놓았습니까?
  • 소프트웨어 빌드 프로세스를 위한 '통합 버튼'이 있습니까? DB 통합을 자동화해 놨습니까? 테스트는요? 검사는요? 배포는 어떤가요? 빌드 프로세스로부터 피드백을 받아서 사용하고 있나요?
  • 별도의 컴퓨터에서 통합 빌드 프로세스를 수행합니까?
  • 통합 빌드에 걸리는 시간이 얼마나 됩니까? 빌드 시간을 짧게 줄여서 피드백을 개선할 방법을 찾고 있나요?
  • CI 서버를 사용해서 소프트웨어를 통합하고 있습니까? 혹은 사람이 직접 빌드를 통합하기 위한 체계 잡힌 프로세스를 갖추고 있나요?
  • 통합 빌드를 얼마나 자주 수행합니까? 매주마다? 저녁마다? 매시간마다? 아니면 변경될 때(지속적으로)마다 합니까?