지속적인 통합 서버는 어느 시점에서 흥미 롭습니까?


9

Jenkins와 같은 CI 서버에 대해 조금 읽었으며 궁금한 점이 있습니다. 어느 시점에서 유용합니까?

5 개의 수업과 10 개의 단위 테스트 만있는 소규모 프로젝트의 경우에는 실제로 필요하지 않습니다.

여기에는 약 1500 개의 단위 테스트가 있으며, (구식 Core 2 Duo 워크 스테이션에서) 약 90 초 안에 통과합니다 (실제로 "단위"를 테스트하기 때문에 매우 빠르기 때문). 우리가 가진 규칙은 테스트가 실패 할 때 코드를 커밋 할 수 없다는 것입니다.

따라서 각 개발자는 회귀를 막기 위해 모든 테스트를 시작합니다.

분명히 모든 개발자는 항상 모든 테스트를 시작하기 때문에 한 개발자가 다른 개발자의 변경 사항을 가져 오면 즉시 변경 사항 충돌로 인해 오류가 발생합니다.

Jenkins와 같은 CI 서버를 설정해야합니까? 무엇을 가져올까요?

속도 게인에 유용합니까? (이 경우에는 문제가되지 않습니다)

오래된 빌드를 다시 만들 수 있기 때문에 유용합니까? (그러나 우리는 구 버전을 확인하여 Mercurial과 함께 할 수 있습니다)

기본적으로 나는 그것이 유용 할 수 있다는 것을 이해하지만 나는 왜 그런지 정확히 알지 못합니다.

위에서 제기 한 사항을 고려한 설명은 가장 환영받을 것입니다.

답변:


9

속도 게인에 유용합니까? (이 경우에는 문제가되지 않습니다)

프로세스를 순환하는 데 소요되는 시간은 개발 과정에 들어가는 시간입니다.

CD에 직접 레코딩하거나 웹에 업로드하는 등 완벽하게 패키지화 된 즉시 배송 가능한 비트를 구축하는 것이 이상적이므로 마일스톤으로 시간을 절약 할 수 있습니다.

오래된 빌드를 다시 만들 수 있기 때문에 유용합니까? (그러나 우리는 구 버전을 확인하여 Mercurial과 함께 할 수 있습니다)

아니요, 빌드를 다시 만들지 않습니다. 생성 된 빌드를 사용하고 보존 설정이 종료 될 때까지 유지합니다.

일부 Dev 상자와 달리 빌드 서버에서 빌드합니다.

여기에는 약 1500 개의 단위 테스트가 있으며, (구식 Core 2 Duo 워크 스테이션에서) 약 90 초 안에 통과합니다 (실제로 "단위"를 테스트하기 때문에 매우 빠르기 때문). 우리가 가진 규칙은 테스트가 실패 할 때 코드를 커밋 할 수 없다는 것입니다.

또한 코드에서 자동화 된 통합 또는 엔드 투 엔드 테스트를 실행하고 단위 테스트에서 포착 할 수없는 문제를 포착하고 싶지 않습니까?

해당 환경을 설정하고 유지하는 데 어려움이 있기 때문에 개발자 상자에서 실행하지 않으려 고합니다. 통합 테스트도 실행 속도가 매우 느린 경향이 있습니다.

어느 시점에서 유용합니까?

다른 투자와 마찬가지로 투자입니다.

한 번만 사용하면 뒤에서 나오거나 깨질 수도 있습니다. 여러 프로젝트에서 사용하면 아마 나올 것입니다.

또한 응용 프로그램 유형에 따라 다릅니다.

Java 응용 프로그램 서버 또는 IIS에 배포해야하는 웹 응용 프로그램을 만들면 CI는 간단 해집니다. 프로젝트의 일부로 데이터베이스가있는 경우에도 동일합니다. 배포는 수동으로 실행하기가 어려우며 QA 팀 (있는 경우)은 특정 시점에 매일 자주 필요합니다.

또한 요구 사항과 문제가 Joel Spolsky의 12 단계 개선 방법과 어떻게 일치하는지 확인하고 싶을 수도 있습니다 . 특히 2, 3, 10 (모두 흥미롭고 중요하지만).


2
+1 ... 좋아, 이제 나와 대화하고있어! "하고 손실없는 시간 빌드" 많은 같은 인수 I를. 우리의 빌드는 매일 여러 번 수행되며 한 번의 클릭만으로 수행되지만 모든 테스트를 실행하는 것보다 느립니다 (따라서 개발자는 시간을 잃고 있습니다). 또한 더 복잡한 테스트라는 아이디어가 마음에 듭니다. CI 서버를 통해 이점을 얻을 수있는 방법을 확인했습니다. 2, 3 및 10 : 예, 예 및 예 (개미 작업을 한 번 클릭) ... 그러나이 12 가지 규칙을 업데이트해야합니다. 소스 제어를 사용합니까? 예를 들어 CVS 이외의 것을 선호합니다. ) (반쯤 학습;)
Cedric Martin

7

어느 시점에서 유용합니까?

  • 빌드 + 테스트주기는 몇 분이 걸립니다. 5 분 동안 테스트를 실행하면 특히 작은 변경 사항에 대해 더 이상 모든 테스트를 직접 실행하지 않아도됩니다.
  • 여러 변형을 만들기 시작합니다. 사용자 정의가 다른 두 명의 고객이있는 경우 각 변형에 대해 테스트를 실행해야하므로 작업량이 매우 빠르게 증가하기 시작합니다. 개발자 컴퓨터에서 하나의 변형에 대해 테스트 스위트를 실행하고 나머지를 실행하려면 CI로 남겨 두십시오.
  • 사소한 테스트 환경 설정이 필요한 자동 통합 테스트를 작성합니다. 개발자가 개발 변경으로 인해 다양한 방식으로 환경을 수정했을 수 있기 때문에 하나의 표준 테스트 환경에 대해 테스트하려는 것보다. CI는 표준 환경에 가장 적합한 장소입니다.
  • 테스터는 CI에서 최신 빌드를 가져올 수 있습니다. 따라서 개발 툴을 가지고 배우고 사용할 필요가 없으며 개발자가 직접 빌드를 보내지 않아도됩니다.
  • 출시를 준비 할 때 :
    • 테스트가 더욱 중요해 지므로 테스트를 위해 준비된 빌드로 한 곳을 갖는 것이 훨씬 더 유용합니다.
    • 모든 빌드가 동일한 빌드 환경으로 빌드되었으므로 개발자 설치 간의 미묘한 차이로 인해 발생할 수있는 문제를 피할 수 있습니다.
    • 버전 제어 시스템에서 확인 된 내용을 정확하게 작성하고 있는지 확인하십시오. 누군가가 체크인하는 것을 잊어 버린 경우 개발하는 동안 다음 개발자에게는 실패하기 때문에 매우 빨리 찾을 수 있습니다. 그러나 이러한 빌드가 QA 또는 프로덕션으로 미끄러 져 버그를보고하면 추적하기가 매우 어려워집니다.

아직 CI가 필요하지는 않지만 테스트 단계에 도달하면 CI가 유용 할 것이라고 생각합니다. Jenkins는 몇 시간 만에 설치되며 테스트를 단순화하고 바보 같은 실수를 피할 수 있습니다 (특히 생산에 대한 빠른 수정을 서둘러 할 때 발생 함).


+1 감사합니다. 그러나 빌드 인수는 실제로 얻지 못했습니다. 모든 개발자가 개정판을 체크 아웃하고 각각의 머신에서 정확히 동일한 빌드를 구성 할 수있을 때 앱이 더 강력하지 않습니까? "개발자 계정에 연결된 빌드"의 문제를 " CI 서버에 연결된 빌드 "로 바꾸지 않습니까? CI 서버 자체가 잘못 구성되어 CI 서버 설치의 미묘한 차이에 따라 빌드가 달라집니다! 그게 내가 좀이 유용 할 수 있습니다 실현 말했다 : 난 그냥 "설치 및 참조"에 필요가 있다고 생각 :)
세드릭 마틴

@CedricMartin : CI 서버는 단 하나이므로이 환경과 이전 빌드 환경의 차이로 인해 버그가 발생하지 않으며 CI 서버에서 다른 작업을 수행하지 않으므로 깨뜨릴 가능성이 적습니다. .
Jan Hudec

@CedricMartin : CI 서버가 잘못 구성된 경우 개발자가 항상 자체 컴파일을 수행하므로 빌드가 개발자 상자에서 수행 된 것과 다르게 작동 함을 알 수 있습니다. 더 많은 사람들이 알아 차릴 수 있기 때문에 특정 개발자 상자가 잘못 구성된 경우보다 더 쉽습니다.
Jan Hudec

6

나를 위해 팀에 둘 이상의 구성원이 있으면 CI가 흥미로워집니다.

CI를 "나를 위해 테스트를 실행하는 또 다른 PC"라고 생각하지 말아야합니다. 정의되고 자동화 된 빌드 프로세스 및 릴리스 관리 에 대한 CI .

CI는 소프트웨어 릴리스를 생성하는 단일 권한있는 엔터티입니다. CI를 기반으로하지 않으면 발생하지 않습니다.

CI를 사용하면 모든 것을 자동으로 제어 할 수있는 제한 사항이 있으며,이 경우 수동으로 조정, 해킹 및 바로 가기를 표시하고 CI와 함께 작동하지 않으므로 처음에는 피해야합니다.

피해야 할 문제 :

  • 릴리스 구축 책임자
  • 이 사람이 연중 무휴 이용 가능합니까?
  • 그러나 그것은 내 기계 증후군을 기반으로합니다.
  • 출시 한 버전에 대한 모든 모호성을 제거합니다

장점 (모든 것을 언급하기에는 너무 많음) :

  • 자동 버전 번호 매기기
  • 이슈 추적 통합
  • 자동 메트릭 생성
  • 정적 코드 분석
  • 자동화 된 배포
  • 멀티 스테이지 설정

5

귀하의 질문에 완벽하게 반영되는 CI (Continuous Integration)에 대한 한 가지 근본적인 문제가 있습니다. CI 서버 소프트웨어는 설정하기가 쉽지 않기 때문에 CI 사례를 구현하고 방어하기가 어렵거나 프로젝트를 CI를 통해 실행하는 것이 쉽지 않습니다. 섬기는 사람. 이를 통해 실제로 CI 수용의 이점이 어디에 있는지 알기가 어려워집니다.

우선, CI는 통찰력과 품질에 관한 것입니다. Good CI는 프로젝트에보다 가까이 다가 가고 품질 메트릭, 문서, 코딩 표준 준수 등에 대한 적절한 피드백을 제공합니다.이 모든 것을 쉽게 시각화하고 한눈에 파악하고 쉽게 이해할 수있는 도구를 제공해야합니다. 일련의 변경 사항을 이러한 모든 프로젝트 메트릭의 특정 스냅 샷과 연결하십시오.

단순히 단위 테스트를 실행하는 것이 아닙니다 . 전혀! 어느 정도 품질을 제공합니다. CI는 오류를 수용하며, 오류를 피하거나 버리지 않습니다. 그것이하는 일은 나중에 대신에 일찍 오류를내는 도구를 제공하는 것입니다. 따라서 이전에 테스트 한 코드를 CI 서버에 실제로 커밋하지 않습니다. 깨끗하고 깨지지 않은 코드를 커밋하려고 노력해야하지만 실제로는 CI 서버를 사용하여 코드를 통해 자동으로 통합 빌더를 자동으로 실행하고 모든 것이 올바르게 완료되었는지 평가해야합니다. 있다면 깔끔한! 문제가 해결되지 않았다면 아무런 문제가 없습니다. 훌륭한 CI 관행은 다음 우선 순위가 깨져있는 것을 고쳐야한다는 것입니다. 좋은 CI 서버에서는 쉽게 지적 할 수 있습니다.

팀 규모가 커짐에 따라 모든 사람의 코드 통합이 자연스럽게 어려워집니다. 중앙 집중식 CI 서버가 모든 통합 부품을 테스트하고 팀 구성원에게 부담을주는 것이 작업이어야합니다. 따라서 모든 사람이 조기에 (그리고 가능한 한 깨끗하게) 커밋 한 다음 빌드 상태를 모니터링해야합니다 (보통 알림이 포함되어 있음). 또한 개발자의 커밋으로 인해 문제가 발생하면 즉시 문제를 해결하고 자동화 된 빌드를 즉시 OK 상태로 되돌릴 책임이 있습니다.

제 생각에는 모든 단일 프로젝트가 지속적으로 통합되는 것이 좋습니다. 지금까지 내가 아는 모든 단일 CI 서버의 복잡한 복잡성 때문에 사람들은 소규모 / 간단한 프로젝트에서 CI 관행을 실제로 지키지 못했습니다. 사람들은 추악하고 지나치게 복잡하며 배달이 부족한 부풀린 소프트웨어를 구성하는 데 며칠을 소비하는 것보다 더 좋은 일을하기 때문입니다.

나는 똑같은 문제를 겪었고, 그 때문에 약 1 년 전부터 자유 시간에 Cintient를 개발하게되었습니다. 저의 전제는 설치, 구성 및 사용을 간단하게하고 다른 모든 제품이 거의 실패하거나 미달하는 품질 메트릭을 제공하도록하는 것이 었습니다. 그래서이 긴 대답 후에 프로젝트에 대한 GitHub 링크 (무료 및 오픈 소스, natch)를 지적하는 뻔뻔스러운 플러그가옵니다. 또한 멋진 스크린 샷이 있습니다. :-) https://github.com/matamouros/cintient

내가 당신을 도왔기를 바랍니다.

(참고 : Bryan Oakley의 의견에 따라 더 나은 답변을 얻기 위해 더 많은 시간을 할애해야한다는 사실에 대해 편집했습니다. 또한 그가 옳다고 생각합니다.)


나는 이것이 질문에 답하지 않고 단지 광고 일뿐이므로 투표를하지 않았습니다. 당신은 해결 결코 암시 적보다 다른 문제의 부분은 "내 도구로, 지금"의미한다.
Bryan Oakley

@ bryan-oakley가 제안한대로 답변을 편집하는 데 시간이 걸렸습니다.
matamouros

@ matamouros : 편집에 좋은 일입니다.
Bryan Oakley
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.