CI(Continuous Integration)
지속적 통합은 자동화된 빌드 및 테스트가 수행된 후, 개발자가 코드 변경을 중앙 리포지토리에 정기적으로 통합하는 소프트웨어 개발 방식이다. 버그를 신속하게 찾아 해결하고, 소프트웨어 품질을 개선하고, 소프트웨어 업데이트 검증 및 릴리즈하는 데 걸리는 시간을 단축하는 것을 핵심 목표로 하고있다.
협업에서 개발자가 기존 코드의 복사본을 받아서 작업을 진행할 때, 한편 다른 개발자들 또한 기존의 코드의 복사본을 받아서 작업을 진행하게 된다. 작성을 완료한 코드를 저장소에 제출하려면 먼저 자신이 코드의 복사본을 받았던 시점부터 현재까지의 변경사항을 자신의 코드에 반영하여서 제출하여야 한다. 이때, 저장소의 변경사항이 많을 수록 개발자의 해야 할 일이 많아진다. 작업하는 시간보다 작업 내용을 통합하는데 걸리는 시간이 더 오래걸리는 “통합의 지옥”이라는 상황에 빠지기도 한다. 지속적 통합을 적용한다면 초기에 그리고 자주 통합을 해서 “통합의 지옥”에서 벗어날 수 있다. 또한 재작업 시간을 줄여줘서 비용과 시간을 줄일 수 있다.
Travis CI
Travis CI는 GitHub과 연동해 지속적 통합(CI)을 호스팅해주는 서비스이다. Github 저장소에 새로운 커밋이 push되면 Travis CI 서버가 뒤에서 자동으로 새로운 커밋을 가져와서 빌드, 테스트를 수행하고 그 결과를 알려준다. C, C++, Go, Java, JavaScript, Perl, Python, Ruby 등의 다양한 언어를 제공한다.
TDD(Test-Driven-Development)
테스트 주도 개발. 실제 코드를 작성하기 전에 테스트 코드를 먼저 작성하는 개발 방법론이다. 우선 간단한 테스트 코드를 작성하고 그 테스트를 통과하기 위한 최소한의 코드만 작성한 후 리팩토링한다. 이 과정을 반복하여 순차적으로 프로그램을 개발한다.
TDD with python
pytest를 이용하여 ‘Hello World’를 작성해보자.
우선 pytest를 설치한다.
$ pip install -U pytest
디렉토리를 하나 생성하고 main.py를 만든다
$ mkdir travis_python_hello
$ cd travis_python_hello
$ nano main.py
get_helloworld() 메소드를 테스트하기 위한 test_get_helloworld() 메소드를 작성한다.
(test로 시작하는 메소드는 테스트 코드로 인지한다.)
def test_get_helloworld():
assert 'hello world' == get_helloworld()
$ pytest main.py
으로 테스트를 돌려보면, 아직 get_helloworld() 메소드를 작성하지 않았으므로 ‘get_helloworld()메소드가 정의되지 않았다’는 당연한 결과가 출력된다.
위의 테스트를 통과하기 위한 최소한의 코드를 작성한 후 테스트한다.
def get_helloworld():
print('hello world')
get_helloworld() 메소드의 반환값과 ‘hello world’이 일치하지 않다는 오류가 발생한다. 이를 통과하기 위한 코드로 수정한다.
def get_helloworld():
return 'hello world'
테스트가 통과 됐으니 ‘hello world’를 출력하는 코드를 작성한다.
def main():
print(get_helloworld())
if __name__ == '__main__':
main()
Travis CI 적용
- github에 ‘travis_python_hello’라는 새로운 repository를 생성한다.
- https://travis-ci.org 에 접속하여 로그인을 한다.
- 좌측에 My Repositories에 + 버튼을 클릭한 후 [username]/travis_python_hello에 체크표시를 한다.
이제 로컬 저장소에 .travis.yml파일을 추가한다.
language: python
python:
- "3.5"
# command to install dependencies
install: "pip install -r requirements.txt"
# command to run tests
script: pytest main.py
requirements.txt 파일도 추가한다.
pytest==3.0.2
git 원격 저장소를 지정하고 commit, push 한다.
git init
git remote add origin https://github.com/_[username]_/travis_python_hello.git
git add .
git commit -m "init travis ci"
git push origin master
https://travis-ci.org/[username]/travis_python_hello 에 접속하여 결과를 확인한다.
참고자료
https://ko.wikipedia.org/wiki/%EC%A7%80%EC%86%8D%EC%A0%81_%ED%86%B5%ED%95%A9
https://aws.amazon.com/ko/devops/continuous-integration/
http://hatemogi.com/holiday-project-day-17