Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

Travis CI 소개 #1

 Travis CI를 알게 된 것을 올 초였던것 같습니다.(근데 이제서야!)

mocha 프로젝트의 빌드상태 아이콘

당시 Github에서 놀고 있는데 mocha저장소에 build status라는 아이콘이 눈에 띄었습니다. "어랏? 이 아이콘은 전에도 본적 있는데"하면 클릭했더니 Travis CI 사이트가 열렸습니다.




Travis CI
Travis CI 로고
이름을 보는 순간 눈치를 채겠지만 Travis CI오픈소스 커뮤니티를 위한 지속적인 통합(continuous integration) 서비스입니다. 2011년 초 Ruby 커뮤니티를 위해 시작되었지만 지금은 수많은 언어를 지원하는 형태로 발전하였으면 Travis CI자체도 Github에서 관리되고 있으며 당연히 오픈소스 입니다. Github로 오픈소스가 엄청나게 활발해 지고 오픈소스 프로젝트를 위한 다양한 환경과 문화가 구성되었지만 그 중에 빠져있는 것이 CI 서버였습니다.(제가 모르는 어떤 것들이 있는지 모르겠네요.) 그래서 오픈소스로 개발을 하려고 하더라도 지속적인 통합을 위해서는 자체 서버에 허드슨이나 젠킨스를 두어야 했습니다.(CI 서버를 둔다고 지속적인 통합은 아니겠으나 일반적인 오픈소스가 회사보다 이런 부분이 잘 되어 있으니 CI 서버만 빠져있었다고 할 수 있습니다.) Travis CI는 오픈소스의 이러한 인프라 공백을 메워주는 서비스라고 할 수 있습니다.

Travis CI 기부페이지를 보면 현재 5천여개의 프로젝트의 40만 이상의 테스트를 수행하고 있음을 보여주고 있습니다. 좀 더 써보고 더 맘에들면 기부하고 스티커라도 받아야 겠습니다. ㅎㅎㅎ

현재 Travis CI는 Clojure, Erlang, Groovy Haskell, Java, JavaScirpt, Node.js, Perl PHP, Rython, Ruby, Scala의 언어를 지원하고 있습니다. 올초만 해도 동적언어만 지원하고 있었지만 올 3월에 Java를 포함해서 Scala와 Groovy에 대한 지원을 추가했습니다. Travis CI는 아주 다양한 환경의 테스트를 수행할 수 있도록 지원하고 있습니다. 위의 다양한 언어들을 포함해서 상당히 많은 종류의 데이터베이스가 이미 설치되어 있으며(물론 오픈소스 기준입니다.) Travis CI에서 지원하지 않는 영역에 대한 자유도를 폭 넓게 제공하고 있어서 빌드 나 테스트 전후로 라이브러리나 네이티브 모듈을 설치해서 테스트하는 것이 가능합니다. Travis CI를 써보려고 내용을 정리하다보니 가이드의 내용이 많아서 원래는 프로젝트에 Travis CI 적용하는 것을 적으려다가 약간 범용적인 내용을 따로 정리합니다.




Travis CI 시작하기
기본적인 Travis CI를 사용하는 방법은 Getting Started문서에 잘 나와있습니다. Travis CI는 Github와 연동해서 동작하기 때문에 먼저 Github에 가입되어 있어야 하며 Github의 OAuth를 이용해서 회원가입을 할 수 있습니다. OAuth 인증을 할 때 읽기/쓰기 권한을 요청하는데 쓰기 권한은 자장소의 훅(hook)기능을 사용하기 위해서 필요한 것이고 다른 쓰기작업은 하지 않습니다.
 
Travis CI에 로그인한 프로필 페이지

회원가입 후에 프로필 페이지에 가면 위와 같이 Github에서 사용중인 저장소의 리스트를 볼 수 있습니다. 여기서 Travis CI를 사용할 저장소의 훅을 위처럼 켜주면 됩니다. 자신이 속한 Organization의 저장소는 자동으로 처리되지는 않으며 수동으로 훅을 설정해 주어야 합니다. (#242, #325 이슈 참조)

이제 자신의 저장소에 .travis.yml 파일을 추가합니다. 이 파일은 YAML파일로 Travis CI의 빌드 설정 및 테스트 환경등에 대한 모든 설정을 기록하는 파일로 모든 설정을 여기서 합니다. 이 파일은 반드시 저장소의 루트위치에 있어야 합니다.


language: ruby
rvm:
  - 1.8.7
  - 1.9.2
  - 1.9.3
  - jruby-18mode # JRuby in 1.8 mode
  - jruby-19mode # JRuby in 1.9 mode
  - rbx-18mode
  - rbx-19mode

.travis.yml은 위와 같은 형식이 됩니다. 저는 Ruby 개발자는 아니지만 Travis CI의 시작이 Ruby라서 가이드중 일부가 Ruby기준으로 되어 있어서 일단 Ruby용을 적었습니다. Getting Started문서에서 언어별 .travis.yml에 대한 내용을 확인할 수 있습니다. 여기서 제일 중요한 것은 language키로 여기서 Travis CI가 사용할 빌더를 지정합니다.

.travis.yml을 추가했으면 Github 저장소에(훅은 이미 설정되어 있어야 합니다.) 커밋을 푸시합니다. 푸시하면 자동으로 Travis CI Queue에 추가되고 해당 언어데 대한 워커가 사용가능해 지면 빌드를 시작합니다. 최초의 빌드는 반드시 푸시를 통해서만 이루어지고 이후에는 푸시를 하거나 Github의 Test Hook 버튼(저장소의 Admin메뉴에서 Service Hooks에 가면 Travis CI 훅이 켜져있는 것을 볼 수 있고 여기서 Test Hook 버튼이 나타납니다.)을 클릭해서 빌드를 실행할 수 있습니다.




Travis CI 환경
Travis CI는 가상머신을 스냅샷해서 각 빌드를 수행하고 빌드가 끝나면 롤백합니다. 그래서 테스트 슈트는 호스트 OS에 영향을 끼치지 않고 각 실행간에 어떤 상태도 유지되지 않으며 패스워드 없이 sudo를 사용할 수 있습니다. 또한 데이터베이스를 생성하거나 메시지큐등을 사용하는 테스트도 가능합니다. 이 환경은 Travis CI environment라고 부르며 공개된 가상머신 이미지를 사용합니다. 이 글을 쓰는 시점에 Travis CI는 우분투 11.10 서버에디션 32비트를 사용하고 있습니다.

각 환경은 빌드 툴로 GCC 4.6.x, make, autotools, et cetera, 네트워크 도구로 curl, wget, OpenSSL, rsync를 포한하고 있으며 런타임은 Ruby, OpenJDK, Python, Node.js를 사용하고 있습니다. 다음의 데이터 스토어과 메시지 큐가 이미 설치되어 있습니다.

  • MySQL 5.1.x
  • PostgreSQL 9.1.x
  • SQLite 3.7.x
  • MongoDB 2.0.x
  • Redis 2.4.x
  • Riak 1.1.x
  • Apache Cassandra 1.0.x
  • Neo4J Community Edition 1.6.x
  • ElasticSearch 0.19.x
  • CouchDB 1.1.x
  • RabbitMQ 2.8.x
  • ZeroMQ 2.1.x

더 자세한 환경에 대한 내용은 About Travis CI Environment을 보시면 됩니다.




빌드 상태 이미지
Travis CI에서는 빌드 상태를 나타내는 이미지를 제공하고 있으면 다음과 같은 이미지 URL이 됩니다.

https://secure.travis-ci.org/[YOUR_GITHUB_USERNAME]/[YOUR_PROJECT_NAME].png

이 이미지를 Github 저장소의 Readme 문서에 추가하면 저장소에서 현재 커밋의 빌드상태를 표시할 수 있습니다.

특정 브랜치에 대한 상태만 버튼으로 나타내고 싶다면 URL에 다음과 같이 ?branch= 파라미터를 붙힙니다.

https://secure.travis-ci.org/[YOUR_GITHUB_USERNAME]/[YOUR_PROJECT_NAME].png?branch=master,staging,production




글이 길어져서 나눠서 포스팅합니다. 이 포스팅은 Travis CI 소개 #2로 이어집니다.
2012/05/01 01:36 2012/05/01 01:36