Python 프로젝트를 Jenkins 에 연동하는 방법에 대해서 정리해 보았습니다.
Jenkins 설치는 어렵지 않으며, 구글링을 통해서 쉽게 설치할 수 있으니, 여기서는 생략하도록 하겠습니다.
환경은 CentOS 에서 진행했습니다.
준비작업
Python 프로젝트를 Jenkins 연동을 하려면 몇가지 사전 설치 작업이 필요합니다.
일단 Python 이 설치가 되어 있어야 합니다.(이건 당연한 이야기), 그리고 virtualenv 또한 설치되어 있어야 합니다.
# 1. Python download$ tar xvf Python-3.5.2.tgz
$ cd Python-3.5.2
# 2. Compile$ ./configure CFLAGS=-fPIC --enable-shared --prefix={파이썬 설치 경로}
$ make install
# 3. PATH$ vi~/.bashrc
.bashrc-------------------------------export PYTHON_HOME=${APP_HOME}/apps/python
export PATH=${PYTHON_HOME}/bin/:$PATH
--------------------------------------$ source~/.bashrc
# 4. ldconfig - root permission required$vi /etc/ld.so.conf.d/python.conf
python.conf---------------------------{파이썬 설치 경로}/lib--------------------------------------$/sbin/ldconfig -v
# 5. Check$ {파이썬 설치 경로}/bin/python3 -V
 | 
# 1. pip update$ pip3 install --upgrade pip
# 2. virtualenv install$ pip3 install virtualenv
# 3. check$ virtualenv | 
python 3.X 를 설치하는 경우 pip 등 몇가지 python tool 이 포함되지만 설치시에 open-ssl 이 설치되어 있지 않는 경우 pip 등 몇가지가 설치되지 않을 수 있습니다.
설치(make install) 시에 로그로 확인할 수 있습니다. 만약 pip 가 파이선 설치경로/bin 디렉토리에 보이지 않는다면 open-ssl 설치 후 재설치 하시면 됩니다.
(수동으로 pip 설치하셔도 무방합니다.)
Jenkins Plugin 도 설치가 필요합니다.(아래 목록참고)
- git
 - Cobertura
 - HTML Publisher
 - Violation - pep8 이난 pyflakes 등 reporting 설정을 도와주는 플러그인
 - Shiningpanda - Jenkins 에서 virtualenv 를 사용할 수 있도록 해 주는 플러그인
 
이 외에도 몇가지 Python 패키지도 필요합니다.
- xmlrunner
 - pylint
 - pep8
 - pyflakes
 - coverage
 
모두 pip install command 를 통해서 쉽게 설치할 수 있습니다.
또는 requirements.txt 파일(아래참고)을 생성 후 아래와 같이 작성한 뒤 pip install -r requirements.txt 를 하면 쉽게 여러 패키지들을 설치할 수 있습니다.
| 
 xmlrunner==1.7.7 
pylint==1.6.4 pep8==1.7.0 pyflakes==1.2.3 coverage==4.2  | 
프로젝트 설정 및  Jenkins 설정
1. TestCase 수행 결과
Python 프로젝트에서 TestCase 를 모두 수행할 수 있도록 test.py 를 하나 생성해 둡니다.
| 
 
import unittest 
import xmlrunner def runner(output='test_result'): 
    return xmlrunner.XMLTestRunner( 
output=output ) def find_tests(): 
    return unittest.TestLoader().discover(’test_project.tests')
 
if __name__ == '__main__': runner().run(find_tests())  | 
여기에서는 testcase 를 {프로젝트ROOT}/test_project/tests 하위에 생성했다고 가정하고 있습니다.
아래처럼 command 를 수행하면 test_result 디렉토리 하위에 Test결과들이 xml 로 남겨집니다.
| 
 pip install -r requirements.txt 
python -m test.py 
 | 
이를 Jenkins 빌드 환경설정에서 “빌드 후 조치” > “Publish JUnit test result report” 설정을 하면 됩니다.
빌드를 수행해 보면 빌드 결과에 “Test Result” 메뉴가 노출되며, 클릭해서 보시면 아래처럼 결과를 확인 할 수 있습니다.
2. Violation
Violation Plugin 을 이용하여 pep8 이나 pyflakes 를 적용할 수 있습니다.
pylint, pep8, pyflakes 를 사전에 설치하거나 requirements.txt 를 이용하여 설치 후 사용할 수 있습니다.
Jenkins 설정에서 Build > Virtualenv Builder 항목에 아래와 같이 command 를 등록합니다.
| 
 pip install -r requirements.txt 
rm -f pep8.log pyflakes.log python -m test.py 
pep8 --config=pep8.cfg uit > pep8.log || true 
pyflakes test_project > pyflakes.log || true 
 | 
| 
 [pep8] 
max-line-length = 120 
 | 
특정 pep8 의 rule 을 무시하고 싶다면 ignore = {rule1 번호},{rule2 번호},… 순으로 작성하면 됩니다.
그리고 아래와 같이 설정할 수 있습니다.
설정 후 빌드를 하면 아래처럼 결과를 확인 할 수 있습니다.
3. Coverage
Jenkins 설정에서 Build > Virtualenv Builder 항목에 아래와 같이 command 를 등록합니다.
| 
 pip install -r requirements.txt 
rm -f pep8.log pyflakes.log python -m coverage run --rcfile=coverage.cfg test.py python -m coverage xml -o coverage.xml python -m coverage html -d coverage pep8 --config=pep8.cfg uit > pep8.log || true 
pyflakes test_project > pyflakes.log || true
 
 | 
| 
 [report] 
omit =     test_project/tests/* 
 | 
coverage.cfg 파일에 report > omit 설정을 추가 한 것은 test case 코드가 coverage 로 분석되는 것을 막기 위함입니다.
위처럼 설정 후 빌드를 수행하면 아래처럼 Coverage 정보를 확인 할 수 있습니다.
4. LOC
python project 에서 LOC를 확인하기 위해서는 보통 cloc 를 사용합니다.
cloc란 Python코드 뿐만아니라 다양한 언어를 지원하며 빈줄/주석/코드 등의 라인 수를 계산해 줍니다.
cloc 를 사용해야 하는 이유를 공식페이지에서는 아래와 같이 소개하고 있습니다.
| 
 cloc has many features that make it easy to use, thorough, extensible, and portable: 
  | 
한줄로 요약해 보면 "사용이 쉽고, 다양한 언어를 지원하고 output 또한 다양한 포멧으로 지원하는 등 많은 기능을 제공하고 있다”라고 할 수 있습니다.
설치는 간단합니다.
CentOS 환경에서는 압축해제 후 PATH를 설정해 주면 됩니다.
Jenkins 설정에서 Build > Virtualenv Builder 항목에 아래와 같이 command 를 등록합니다.
| 
 pip install -r requirements.txt 
rm -f pep8.log pyflakes.log cloc —by-file —xml —out=cloc.xml 
python -m coverage run --rcfile=coverage.cfg test.py 
python -m coverage xml -o coverage.xml python -m coverage html -d coverage pep8 --config=pep8.cfg uit > pep8.log || true 
pyflakes test_project > pyflakes.log || true
 
 | 
결과는 아래와 같이 언어별로 구분하여 확인 할 수 있습니다.
언어별 트렌드 정보도 차트로 확인할 수 있습니다.
여기까지 잘 진행했다면 기본적인 기능은 연동했다고 할 수 있습니다.
- TestCase 수행 결과
 - pep8(코드 스타일), pyflakes(코드 정적분석)
 - coverage(테스트 커버리지)
 - loc(코드 라인수)
 
참고
- https://www.youtube.com/watch?v=iGtM_OP01FU
 - https://pep8.readthedocs.io/en/1.7.0/intro.html#configuration
 - https://coverage.readthedocs.io/en/coverage-4.2/config.html#
 - http://cloc.sourceforge.net/
 
'Programing > Python' 카테고리의 다른 글
| sqlparse 사용기 (0) | 2016.08.18 | 
|---|---|
| PyJNIus 사용기 (0) | 2016.07.28 | 
| PEP8 이란? (0) | 2016.07.27 | 
| APScheduler 사용기 (0) | 2016.07.26 | 
| JPype 사용기 (0) | 2016.07.19 |