CI에 대한 간략 요약

About CI(Continuous Intengration: 지속적 통합)

참조: http://happystory.tistory.com/89

  • 지속적으로 퀄리티 컨트롤(품질 관리)를 적용하는 프로세스를 실행하는 것.
  • 소프트웨어의 질적 향상과 소프트웨어를 배포하는 데 걸리는 시간을 줄이는데 초점.
  • 초기에 그리고 자주 통합해서 통합 시 발생하는 여러가지 문제점을 조기에 발견하고, 피드백사이클을 짧게 하여 소프트웨어 개발의 품질과 생산성을 향상시키는 것.

CI를 구축하지 않고 개발을 진행하면 각자가 개발한 코드를 다른 품질관리를 안거치고 커밋을 하게되고 거의 개발 막바지에 통합을 하여 테스트를 진행하게 됨.이 경우 통합되었을 때 잘못된 코드를 반영하게 되면 거의 모두 장애로 발견됨

CI서버는 형상관리 서버에 commit된 소스코드를 주기적으로 polling하여 compile, unit test, code inspection등의 과정을 수행하며, 신규 또는 수정된 소스코드가 결함이 있는지의 여부를 지속적으로 검증함.(code inspection: 개발이 끝난 후에, 전문 인스펙션팀이 정해진 프로세스와 패턴에 따라 코드를 검증하고 Defect를 찾는 프로세스)
검증 결과는 이메일, RSS등의 피드백 메커니즘을 통해 개발자들에게 전달되고, 이를 통해 조기에 결함을 발견하여 해결할 수 있다.

CI 시스템 구축을 위한 핵심 요소

  1. CI Server
    • Build process를 관리하는 서버
    • eg. Jenkins, Hudson, CruiseControl.NET, TeamCity
  2. SCM(Source Code Management)
    • 소스코드 형상관리 시스템
    • 소스코드의 개정과 백업 절차를 자동화하여 오류 수정 과정을 도와줄 수 있는 시스템
    • 여러사람이 같은 프로젝트에 참여할 경우, 각자가 수정한 부분을 팀원 전체가 자동으로 동기화할 수 있는 시스템
    • CI 서버에서 자동으로 polling하여 검증할 수 있도록 소스코드를 관리하는 형상관리 시스템이 필요.
    • eg. Git, Subversion, Mercurial
  3. Build Tool
    • Compile, Test, Static Analysis등을 실시해 동작 가능한 소프트웨어를 생성
    • Build란, 소스코드 파일을 컴퓨터에서 실행할 수 있는 독립 소프트웨어 가공물로 변환하는 과정을 말하거나 그에 대한 결과물을 일컫는 것.
      • Build에 있어서 가장 중요한 단계는 __소스코드 파일이 실행 코드로 변환되는 Compile 과정__이다.
      • Compile과 build를 혼동하여 쓰는 경우가 있으나 Compile은 build 과정 중 한 단계일 뿐이며, build는 형상 관리시스템에 있는 소스코드를 가져와 compile하여 사용자들이 실행할 수 있도록 실행 파일로 만드는 일련의 과정을 모두 포함함.
    • eg. Maven, Ant, Make, MSBuild
  4. Test Tool
    • 작성된 테스트 코드에 따라 자동으로 테스트를 수행해주는 도구; build tool의 스크립트에서 실행
    • eg. JUnit, CppTest, MSTest, Selenium(사용자테스트 자동화 가능)
    • 단위 테스트는 테스트 대상이 되는 코드 기능의 아주 작은 특정 영역을 실행해 보는 것으로, 개발자가 작성한 테스트 코드로 특정 메소드(Function)을 시험해보는 것이 일반적.
    • JUnit은 Ant와 같은 빌드 툴과도 쉽게 통합되기에 가장 널리 사용됨.
  5. Test Coverage Tool
    • 테스트 코드가 대상 소스 코드에 대해 어느정도 커버하는지 분석하는 도구
    • eg. Emma, Cobertura, TestCocoon
    • 개발자가 작성한 테스트코드가 테스트 대상 소스코드에 대해 어느정도 테스트를 수행하는지를 코드라인과 백분율을 통해 리포팅 하는 것.
  6. Inspection Tool
    • 프로그램을 실행하지 않고, 소스코드 자체로 품질을 판단할 수 있는 정적분석 도구
    • 코딩 컨벤션 준수 검사, 코드 메트릭 측정(??), 중복코드 검사, 코드 인스펙션 검사등이 있음.
    • eg. CheckStyle, FindBugs, Cppcheck, Valgrind
    • 프로그램을 실행하여 분석하는 동적분석(JUnit도 일종의 동적 분석에 속함)과는 달리 소스코드 자체로 프로그램 상의 예상되는 잠재적인 결함을 검출하는 도구

3~6번(build tool, test tool, test coverage tool, inspection tool) 도구는 XML 형태의 빌드 스크립트(Ant 등)로 수행 내용을 작성하여 CI서버에서 형상관리 서버에서 polling한 소스코드를 빌드하면서 자동으로 수행됨.

빌드 스크립트를 통한 CI 자동화 수행 절차 (example)

  1. Source code를 Binary File로 Compile
  2. Binary file을 배포 형태로 package
  3. (선택) Unit test(including Coverage) 수행
  4. (선택) Static Analysis 수행
  5. (선택) 분석 결과 reporting
  6. packaged 파일을 Test Server에 deploy