Canvas 1 Layer 1

깃허브(GitHub) 에코시스템
코드 클라이메이트, 젬나시움, 트래비스CI, 커버럴스

소스 관리를 위해 사용하는 깃허브GitHub와 바로 연동해서 사용할 수 있는 좋은 서비스들이 많이 있습니다. 이 서비스들의 장점은 깃허브와 바로 연동할 수 있고, 오픈소스 프로젝트에서는 무료로 사용할 수 있는 경우가 많다는 점입니다. 이 글에서는 주로 루비 프로젝트와 연관된 서비스들을 소개하고자 합니다.

코드 클라이메이트(Code climate) - 지속적 코드 퀄리티 관리 서비스

코드 클라이메이트는 소스 코드를 정적 분석해서 코드의 복잡도, 코드 스멜, 중복 등을 보고서로 작성해줍니다.

프로젝트 등록은 간단합니다. 다음 URL로 이동해서 저장소 주소를 등록합니다.

아래 URL로 이동하면, 해당하는 저장소의 코드 분석 결과를 볼 수 있습니다. <GITHUB_ID>는 깃허브 사용자의 아이디, <REPOSITORY_NAME>은 저장소의 이름으로 바꿔줍니다

레포트는 푸시이벤트에 훅이 걸립니다. 따라서 저장소에 새로운 변경사항이 올라올 때마다 새로 작성됩니다. 무료로 등록한 오픈소스 프로젝트는 레포트 내용은 전부 공개됩니다.

젬나시움(Gemnasium) - 의존성 버전 관리 서비스

젬나시움은 특정 루비 프로젝트에서 의존하고 있는 라이브러리의 최신버전 여부를 알려주는 서비스입니다. 오픈소스는 무료로 사용할 수 있으며 깃허브 프로젝트와 쉽게 연동할 수 있습니다. 먼저 사이트에 접속한 다음 깃허브 아이디로 로그인합니다. 그 다음 원하는 저장소를 연동하면 됩니다.

필요한 저장소를 연동하면 됩니다. 사실 저장소 등록에 직접적인 권한은 필요가 없으며, 아래 URL로 접근하시면 깃허브에 올라와있는 공개된 프로젝트라면 어떤 프로젝트든지 등록이 가능합니다.

https://gemnasium.com/

Rubydoc.info - 루비 문서화 서비스

Rubydoc.infoYARD를 지원하는 루비 문서화 서비스입니다. 사이트에 들어가셔서 오른쪽의 프로젝트 추가Add project를 선택하면 해당하는 저장소의 문서가 자동적으로 생성됩니다. 많은 개발자들이 루비 라이브러리의 레퍼런스를 찾을 때 로컬에 설치된 문서를 활용하기보다는 이 사이트에 접속합니다.

트래비스CI(TravisCI) - 지속적 통합 서비스

트래비스CI는 지속적 통합을 서비스로 제공합니다. 오픈소스에 프로젝트는 무료로 사용할 수 있습니다. 트래비스CI를 사용하면 젠킨스Jenkins 서버를 직접 설치해서 사용하는 등 번거로운 작업을 피할 수 있으며, bundle, npm 등 패키지 관리자 뿐만 아니라 apt-get을 통한 사이트 패키지 설치도 할 수 있어 매우 다양한 작업이 가능합니다. 트래비스CI에서 제공하는 기능에 대해서는 공식 문서를 참조해주시기 바랍니다.

깃허브와 트래비스CI 연동

깃허브 저장소를 트래비스CI와 연동하기 위해서는 저장소 설정에서 트래비스CI 훅을 설정해야 합니다. 깃허브에서 직접 설정을 하지 않더라도, 트래비스CI 쪽에서 깃허브 아이디로 로그인하고 연동하려는 저장소를 on으로 바꿔주면 바로 연동이 됩니다. 여기까지만 해도 푸시가 일어나면 트래비스CI 쪽으로 빌드 요청이 보내지고 자동적으로 빌드를 수행합니다. 하지만 아직은 어떤 작업이 실행될지 정의하지 않은 상태입니다. CI에서 수행하고자하는 작업은 프로젝트의 루트에 .travis.yml 파일로 지정할 수 있습니다.

트래비스CI 설정 파일 - .travis.yml 예제

다음은 .travis.yml 예제 파일입니다.

각각의 부분에 대해서 간단히 설명해보겠습니다.

루비Ruby 언어의 사용을 명시합니다.

어떤 버전의 루비 버전을 사용할 지 지정합니다. 트래비스CI에서는 다양한 버전의 루비를 지원하고 있어 여러가지 환경에서 테스트하는 게 가능합니다. 이런 식으로 여러 개의 버전이 지정되어 있는 경우 푸시 이벤트가 일어났을 때 두 환경에서 모두 빌드를 수행합니다. 이 때 젬파일Gemfile에 루비 버전을 명시한 경우 이 설정과 충돌이 일어날 수 있으므로 주의가 필요합니다.

필요한 환경 변수를 지정합니다. 트래비스CI에서는 환경변수를 암호화하는 방법도 제공하고 있어, 필요한 경우 민감한 정보를 암호화해서 지정할 수도 있습니다. 이러한 암호화는 travis 젬에서 추가적으로 설명합니다.

실제로 실행될 스크립트를 작성합니다. 우선 before_script가 실행되고, script가 실행됩니다. 여기서 지정하는 명령어들은 셸에서 실행하는 명령어들입니다.

travis 젬 - 트래비스CI 지원 라이브러리

$ gem install travis

travis 젬을 통해서 콘솔 상에서 트래비스CI의 빌드를 관리하거나 빌드 결과를 가져올 수 있습니다. 예를 들어 branches 서브 명령어로 현재 저장소의 빌드 상황을 확인해 볼 수 있습니다.

prog/bbapi$ travis branches
master:           #1    failed     Set class name of owner
GithubEcosystem:  #3    passed     Add some options to .rspec
prog/bbapi$ travis status
build #3 passed

환경변수 암호화

다음은 환경변수를 암호화하는 예입니다.

$ travis encrypt -r <github_id>/<repository_name>
FACEBOOK_API_KEY=<API_KEY>  --add

-r 에는 암호화된 환경변수를 사용할 저장소를 지정합니다. --add 플래그는 이 결과를 바로 .travis.yml에 추가하라는 옵션입니다. 이러한 방식을 통해 API_KEY를 저장소에 공개하지 않고 빌드 시에만 사용할 수 있습니다.

travis가 지원하는 명령어들

   accounts     displays accounts and their subscription status
   branches     displays the most recent build for each branch
   cancel       cancels a job or build
   console      interactive shell
   disable      disables a project
   enable       enables a project
   encrypt      encrypts values for the .travis.yml
   endpoint     displays or changes the API endpoint
   help         helps you out when in dire need of information
   history      displays a projects build history
   init         generates a .travis.yml and enables the project
   login        authenticates against the API and stores the token
   logs         streams test logs
   monitor      live monitor for what's going on
   open         opens a build or job in the browser
   pubkey       prints out a repository's public key
   raw          makes an (authenticated) API call and prints out the result
   restart      restarts a build or job
   setup        sets up an addon or deploy target
   show         displays a build or job
   status       checks status of the latest build
   sync         triggers a new sync with GitHub
   token        outputs the secret API token
   version      outputs the client version
   whatsup      lists most recent builds
   whoami       outputs the current user

travis-lint 젬 - .travis.yml 문법 검사 라이브러리

$ gem install travis-lint

travis-lint 프로그램을 사용해 설정 파일이 정상적인지를 확인해볼 수 있습니다.

$ travis-lint                                                                                            
Hooray, /home/hsin/prog/_working/bbapi/.travis.yml seems to be solid!

커버럴스(Coveralls) - 테스트 커버리지 관리 서비스

커버럴스는 테스트 커버리지를 측정하고 자동적으로 기록해주는 서비스입니다. 현재 루비를 비롯해 파이썬Python, PHP, 노드jsNode.js, 자바스크립트JavaScript, C, C++, 자바Java, 스칼라Scala 등 다양한 언어를 지원하고 있습니다. 테스트 커버리지란 테스트를 실행하는 과정에서 애플리케이션 코드가 얼마나 실행되었는지를 %로 나타낸 수치입니다.

커버럴스는 깃허브와 트래비스CI에 의존적입니다. 깃허브와 트래비스CI를 연동하고, 트래비스 설정 파일에 테스트 커버리지를 측정하는 내용을 추가해줍니다. 이 내용이 커버럴스로 보내지고, 커버럴스는 이 내용을 매번 저장합니다.

깃허브 저장소와 연동(루비 예제)

커버럴스를 프로젝트에 연동하기 위해서는 저장소에서 몇가지 추가 작업이 필요합니다. 먼저 Gemfilecoveralls를 추가해줍니다.

다음으로 spec/spec_helper.rb 파일을 통해 커버럴스(작업복)를 입혀줍니다. 일반적으로 spec_helper.rb 맨위에 추가합니다.

로컬에서 테스트를 실행했을 때 아래와 같은 메시지가 뜨면 정상적으로 coveralls가 입혀진 상태입니다.

[Coveralls] Set up the SimpleCov formatter.
[Coveralls] Using SimpleCov's default settings.
...
[Coveralls] Outside the Travis environment, not sending data.

단 맨 마지막 로그에서 알 수 있듯이 트래비스CI 환경이 아닌 곳에서 실행한 경우 커버리지 데이터를 커버럴스 서비스로 보내지 않습니다. 이제 다음 푸시가 일어날 때부터 트래비스CI를 통해서 자동적으로 커버럴스 페이지가 업데이트됩니다.