CI - 지속적 통합

지속적 통합(CI, continuous integration)에 대해서 살펴 보겠습니다.

CI가 왜 필요한가?

버그는 초기에 발견하면 금방 해결할 수 있지만, 시간이 지나면 사소한 버그라도 해결에 시간과 노력이 많이 듧니다. 그래서, 문제를 조기에 발견하는 것은 아주 중요합니다.

예를 들어 보겠습니다. Apple의 SSL 라이브러리의 어이없던 “goto fail” 버그는 정적 코드분석해 주는 lint를 수행했거나 관련 단위 테스트만 수행했어도 막을 수 있는 버그 였습니다.[1]

CI에서 lint를 수행했더라면, 아래 코드의 if 문에서 {}가 빠졌고, 두번째 goto fail;이후는 수행되지 않는 코드(unreachable code)임을 알고 릴리즈 되기 전에 바로 수정되었을 것이다.

1
2
3
4
5
6
7
if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0)
goto fail;
goto fail; /* MISTAKE! THIS LINE SHOULD NOT BE HERE */
... other checks ...
fail:
... buffer frees (cleanups) ...
return err;

CI 에서 무엇을 수행해야 하는가?

정적 코드 분석(Static Code Analaysis)

소스코드 오류의 많은 부분들이 사소한 오류(예를 들면 오타)에서 기인하는 경우가 많습니다. lint등 정적 분석 도구를 이용하여 대부분 미연에 잡아 낼 수 있습니다.

각 언어마다 lint 도구가 제공되는데요. List_of_tools_for_static_code_analysis

단위 테스트(unit test)

미리 테스트 케이스를 만들고, 코딩해 보면 경험을 해 보기 바랍니다.
TDD(Test Driven Development)는 테스트 케이스를 통과해 나가면서 코드를 작성하고, 테스트 케이스를 변경/추가하는 과정을 반복하면서 견고한 코드를 만들어 갑니다.

코드 리팩토링Code refactoring을 수행하거나, 기존 코드에 수정을 가할 때 각종 부작용(side effect)의 두려움에서 벗어나게 해 줍니다.

스모크 테스트(Smoke test)

Sanity test라고도 하는데요. 기기를 시동 걸어서 돌려 봤을 연기가 나는지 본다는 의미인데요. 아주 기본적인 기능이 동작하는지를 테스트하는 것입니다.

모든 단위 테스트를 수행하면 시간이 오래 걸리는 경우에, 간단한 스모크 테스트로 전체 기능이 돌아 가는지 보기도 합니다.

종단간 테스트(End-to-End test)

전체 시스템이 잘 동작하는지 사용자 관점의 시나리오로 테스트합니다.
nightwatch 는 브라우저에서 자동화된 사용자 시나리오 테스트를 가능케 합니다.

build

네이티브 코드를 컴파일 하거나, javascript code minify, css 생성등을 통하여 수행가능한 상태를 만들어 냅니다. 이때 정적분석을 위한 lint 과정이 포함되기도 합니다.

Gitple 은?

Gitple개발을 위한 매 커밋commit 마다 다음의 작업을 수행합니다.

  • 정적코드 분석:
    typesript를 위해 tslint, javascript를 위해 jshint 등을 사용합니다. 필요에 따라, jsonlint, css 등도 사용합니다.

  • 단위 테스트:
    javascript test framework인 mocha 를 이용하고, typescript로 테스트 코드 작성하기 위해 ts-mocha를 이용합니다. assert 도구인 chai를 사용합니다.
    REST API 위주 테스트를 위해, supertest 를 사용합니다.

코드 커밋시 마다 현재는 모든 단위 테스트를 수행하지만, 앞으로 시간이 오래 걸리면 선택적으로 수행할 예정입니다. 하지만, 그 때도 전체 테스트 수행은 정기적으로 빈번하지 않게 수행할 예정입니다.

  • 종단간 테스트:
    CI 에는 수행하지 않고, 아주 빈번하게(10분 주기) nightwatch를 이용하여 수행합니다. 다음
    Gitple은 브라우저를 통하여 사용자가 이용하는 시나리오들을 nightwatch를 통해 테스트합니다. 이 테스트는 commit시가 아니라 별도로 주기적으로 테스트합니다.

  • build:
    Gitple의 상담사 워크스페이스는 브라우저에서 수행되는 single page 방식의 웹앱이니다. javascript lint, minify, css 생성등의 과정을 거쳐 웹앱 수행코드를 생성합니다.


추후 포스팅에서 단위 테스트 작성, nightwatch 사용 예등을 설명하겠습니다.

공유하기