데이터 과학

지속적 통합(CI) - Travis

학습 목표

  • 지속적 통합이 소프트웨어 개발 속도를 높이는지 이해한다.
  • 지속적 통합 효익을 이해한다.
  • 지속적 통합 서버를 구현한다.
  • 지속적 통합 서버를 호스팅하는 몇가지 선택사항을 식별한다.

테스트 실행을 가능하면 쉽게 만들기 위해서, 많은 소프트웨어 개발 팀에서 지속적 통합(continuous integration, CI)로 알려진 전략을 구사한다. 이름에서 함축적으로 나타나듯이, 지속적 통합은 테스트 묶음(test sutie)을 개발 과정과 통합한다. 변경 사항이 저장소에 전달될 때마다, 지속적 통합 시스템은 코드를 빌드하고 점검한다.

사고 실험 : 본인이 작성한 소프트웨어가 동료 컴퓨터에도 작동할까?

본인이 맥 OSX에서 소프트웨어를 개발한다고 가정하자. 지난주, 연구실 동료를 도와서 리눅스 컴퓨터에서 코드를 빌드하고 실행했다. 그후 일부 변경을 했다.

  1. 휴가에서 돌아와서 저장소를 갱신했다면, 소프트웨어가 여전히 잘 동작할 것으로 어떻게 확신할 수 있을까?
  2. 컴퓨터에서 다시 빌드해서 정상적으로 돌아갈 때까지, 그 과정이 얼마나 오래 걸릴까?

연구실에서 벌어지는 전형적인 사례다. 해당 컴퓨터에서 다시 빌드할 때까지 동료 컴퓨터에 정상적으로 동작하는지 모른다. 만약 빌드 시스템을 갖고 있다면, 저장소를 갱신하고, 코드를 다시 빌드하고, 테스트를 실행하는데 몇분 걸린다. 만약 빌드 시스템이 없다면, 신규 변경사항이 호환되어 정상 동작하는지만 아는데 오후 전체 시간이 걸릴 수 있다.

서버가 수행하는 첫번째 단계는 저장소에서 코드를 가져 나오는 것여서, (자체 CI 서버를 구축하거나 갖지 않는다면) 지속적 통합 서버가 사용할 수 있도록 코드를 넣어둔다.

GitHub에 mean 이름으로 Git 저장소를 설정한다.

GitHub 저장소에 mean.py, test_mean.py 파일이 콘텐츠가 될 수 있다.

  1. GitHub에 가서 create a repository 에서 mean 이름으로 저장소를 생성한다.
  2. 저장소를 클론한다. (git clone https://github.com:yourusername/mean)
  3. mean.py, test_mean.py 파일을 로컬 컴퓨터 디렉토리에 복사한다.
  4. add, commit, push 명령어를 사용해서 GitHub에 mean.py, test_mean.py 파일을 넣는다.

명령(Instructions) 전달

평균 함수 작업은 코드와 테스트로 구성된다. 코드와 테스트를 저장소에 복사하고 저장소에 지속적 통합을 추가한다.

서버 설정 사항 결정하기

자체로 빌드 시스템이 필요없는데 사유는 파이썬은 컴파일이 필요 없기 때문이다.

  1. 그럼 무엇이 필요할까?
  2. requirements.txt 파일에 소프트웨어 의존성(dependencies)을 적는다.
  3. 사실, 거슬러 올라가서 버젼관리를 하면 좋지 않을까?

Travis_CI

트래비스(Travis)는 지속적 통합 서버 호스팅 플랫폼이다. 루비 개발 뿐만 아니라 파이썬 과학 커뮤니티에서 일반적으로 사용된다.

Travis-CI 계정 설정

트래비스를 사용하려면, 필요한 것은 계정인데 무료다.

  1. 자원자가 트래비스 계정을 신청해야 한다.
  2. 트래비스 웹사이트 안내 절차에 따라 트래비스 계정과 GitHub을 연결한다.

저장소 .travis.yml 파일에 Travis-CI 저장소를 빌드하고 테스트하는 의도를 담아 트래비스에 전달한다. 이번 목적으로 .travis.yml 파일은 매우 단순한 내용을 담고 있다:

language: python
python:
  - "2.6"
  - "2.7"
  - "3.2"
  - "3.3"
  - "3.4"
  - "nightly"
# command to install dependencies
install:
  - "pip install -r requirements.txt"
# command to run tests
script: nosetests

pip 파이썬 패키지 관리자가 requirements.txt 파일을 어떻게 사용하는지 알 수 있다. requirements.txt 파일에 필요한 모든 파이썬 패키지 목록을 작성하는 것이 관례다. 만약 nose, numpy, pymol이 필요하면, requirements.txt 파일은 다음과 같을 것이다:

nose
numpy
pymol

.travis.yml 파일 추가

  1. .travis.yml 파일을 저장소에 추가한다.
  2. 커밋하고 푸쉬한다.
  3. CI 서버에 진행사항을 점검한다.

지속적 통합 호스팅

트래비스를 예제로 살펴봤는데 이유는 GitHub과 연동되어 구동하기 매우 쉽기 때문이다. 리눅스에 기반한 많은 기능을 구현할 수 있지만, 현재로는 다른 플랫폼에 대한 구현은 잘 이루어지고 있지 않다. 필요에 따라 다음 서비스를 고려해보는 것도 좋다.

주요점

  • 서버가 자동으로 테스트 실행을 한다.
  • 테스트 실행은 GitHub 풀 요청에 의해 촉발된다.
  • CI는 여러 플랫폼에 빌드, 테스트를 수행한다.
  • .travis.yml 파일에 travis-ci 서버 빌드 환경설정 정보를 적는다.
  • 많은 CI 서버가 무료로 널려있다.