모든 커밋은 반드시 통합서버에서 메인라인을 빌드해야 한다.(Every Commit Should Build the Mainline on an Integration Machine)

팀은 데일리 커밋을 수행하면서 테스트가 통과된 빌드를 자주 하게 되는데, 이는 메인라인이 건강한 상태에 있다는 것을 의미해야 한다. 그러나 사실 아직도 뭔가 잘못된 게 있다. 그 원인중에 하나는 숙련-사람들은 커밋을 수행하기전에 업데이트와 빌드를 하지 않는다-이며, 또 다른 원인은 개발자 머신간 환경의 차이 때문이다.

결론부터 얘기하자면 개발자들은 정기적인 빌드를 통합서버에서 수행해야 하며, 통합서버에서 수행되는 이 빌드가 성공적으로 끝나야만 커밋이 성공적으로 끝난다는 사실을 유의해야 한다. 커밋을 수행하는 개발자는 이에 대한 책임이 있으므로, 개발자는 메인라인 빌드를 모니터링하고, 에러가 나면 그것을 수정해야 한다. 이 말은 개발자가 오후 늦게 수행한 커밋에 대해 메인라인 빌드가 실패하면, 성공할 때까지 집에 못 갈 수 도 있다는 것을 의미한다.

위 사항을 장려하기 위해 내가 알고 있는 방법은 두가지다. : 수동 빌드를 하거나 CI서버를 사용하는 것이다.

“수동 빌드”개념은 단순하다. 본질적으로 수동빌드는 개발자가 저장소에 커밋하기 이전에 수행하는 로컬빌드와 유사하다. 통합서버에서 개발자가 메인라인의  (그의 최종 커밋본이 존재하는) head 를 체크 아웃하여, 통합빌드를 수행하는 것이다. 눈으로 진행사항을 보고 있다가 성공하면 커밋을 완료하는 것이다.(jim Shore의 설명을 보시길)

CI서버는 저장소에 대한 모니터 역할을 수행한다. 저장소에 커밋이 될 때마다 서버는 자동으로 소스를 통합서버에 체크아웃하여 빌드작업을 시작하고 빌드 결과를 커밋터에게 알려준다.커밋터는 (통상 이메일등으로) 빌드결과를 받기전까지는 커밋을 완료할 수 없다.

ThoughWorks의 우리들은 CI서버의 열혈팬이다. -실제로 우리는 널리 사용되는 오픈소스 CI서버인 CruiseControlCruiseControl.NET의 초기개발을 이끌었으며, 또한 우리는 이후에 그로부터 상용 Cruise CI서버를 만들게 되었다. 우리는 수행하고 있던 거의 모든 프로젝트에서 CI서버를 사용하였고, 사용 효과에 대해 만족했다.

모든 사람이 CI서버를 선호하지는 않는다. JimShor는 수동 빌드 접근법을 선호하는 이유에 대해 잘 정리된 주장을 제시한다. 나는 CI서버를 사용하는 것이, 단순하게 SW를 설치하는 것 이상의 작업을 필요로 한다는 그의 주장에 동의한다. 이글에 있는 모든 지침들은 CI가 효율적으로 진행되기 위해 제시된것 들이지만, 그와 마찬가지로 CI를 잘 하는 많은 팀들은 CI서버를 매우 유용한 툴로 생각한다.

많는 조직들이 시간 스케줄(예를 들어 밤에)에 맞추어 정기적인 빌드를 수행한다. 이것은 지속적인 빌드와 같은 의미는 아니며 지속적인 통합에는 많이 미흡하다. 전체적인 관점에서 지속적인 통합은 가능한한 문제를 빨리 찾아내자는 것이다. 야간빌드는 누군가 버그를 발견하기 전까지는 하루종일 그 버그가 미감지된 상태로 있다는 것을 의미한다. 이렇게 버그들이 시스템에 그렇게 오랫동안 존재해 있다면, 해당 버그들을 찾고 제거하는데는 오랜 시간이 걸릴것이다.

지속적인 빌드의 핵심은 메인라인 빌드가 실패하면 즉시 수정하자는것이다. CI 작업에서 주 관점은 개발자들은 항상 자신들이 잘 알고 있는 안정된 베이스에서 개발하고 있다는 것이다. 비록 사람들이 커밋하기 전에 업데이트와  로컬빌드에 주의를 기울이지 메인라인 빌드 실패가 발생지만, 메인라인 빌드가 실패하는 것은 나쁜일이 아니다. 메이라인 빌드가 실패되었을 때는 이를 빨리 수정하는 것이 중요하다. 메인라인 빌드가 깨지는 것을 회피하기 위해서 개발자들은 pending head 사용을 고려할 수 도 있다.

팀에 CI에 대한 소개를 할 때 이 점이 제일 정리하기 어려운 일중에 하나다. CI 도입 초기에 팀은 특히 그들이 기존 코드 베이스에서 작업하고 있다면, 메인라인빌드를 하는 일반적인 습관을 들이는 것이 힘들 수 있다. 그러니 실망하지 말고, 정기적으로 application에 인내와 꾸준함을 들여야만 목적을 이룰 수 있다.

메인글로 돌아가기

원문보기
Continuous Integration

본 포스트는 Martin Fowler 선생께서  쓴 글을 번역 게재한 글이다. 선생은 본인의 글을 직접 게재하는 것을 허용하지는 않지만, 번역은 허용하고 있다.
원문에도 한국어 번역글로 등록이 되어있는데, 이 글보다 몇 년 앞서 더 훌륭한 솜씨로 한글로 번역해 놓은 글이 있으니 참조하면 좋을 듯 하다. (황상철님의 실용주의이야기 의 ‘지속적인 통합‘)

댓글 남기기