ã¯ããã«
éçºã®éçšã§ãæ°ããæ©èœãäœæããŸããå€ãã®å Žåãå¹
åºãã¹ãããŒã¯ã§å€ãã³ãŒãã«è§Šããããã«ãªãããã®äœæ¥ã®ããžãã¯ãç Žå£ããŸããã ãã®ãããå€ãã³ãŒãã®åäœãã¹ããšçµ±åãã¹ããäœæããèµ·åãèªååããå¿
èŠããããŸããã ç§ã®æã§ãã¹ãŠã®ãã¹ãã远ããããã®ã¯ããªããšãªãæ²ããã
Jenkinsã®æè¿ã®
CI Djangoãã¥ãŒããªã¢ã«
ãšDjangoã®ããªãå€ã
Webtestãã¥ãŒããªã¢ã«ãæãåºããŠãã ãã ã ãã®çµæããžã§ã³ãã³ã¹ãè²ãŠãããšè©Šã¿ãããŸããããã©ãããããã圌ã¯ç§ã®ããŠã³ããé¢éžãããç§ã¯TeamCityã眪深ãåºæ¥äºãšããŠæãåºããŸããã ãç§ã¯
PyCharmã§æžããŠãããããã«ã¢ãããŒããèŠã€ããã®ã§ãããããæºã1ã€ãããªãã®ã§
TeamCityã
ææ®ããŸãïŒã ïŒããã³è©³çްïŒã以åã®ããã¥ã¢ã«ãšã¯ç°ãªããŸã:)
åèšïŒ TeamCityçµ±åãµãŒããŒãäžããèªåïŒç°å¢ïŒæŽæ°ã䜿çšããŠ
ä»®æ³ pythonç°å¢ã§
錻 ãã¹ããš
webtestãã¹ãã§
Djangoãããžã§ã¯ãããã¹ãããããã®ã¬ã€ãã³ã¹ãå¿
èŠãªäºº
-catãžãããã
ãæ³šæ TeamCityã«ã¯ãïŒããã¥ã¡ã³ãã«ãããšïŒsun / oracleããŒãžã§ã³ã®JVMãå¿
èŠã§ã...
çè«
virtualenvã䜿çšããPythonä»®æ³ç°å¢
éçºçšPCã®ã·ã¹ãã ã¯ãããžã§ã¯ãã®ãã¹ãŠã®èŠä»¶ãæºãããŠããŸãããããã¯ãã¹ãçšã®ãµãŒããŒã®å Žåãšã¯ã»ã©é ãïŒPythonã§ã2.6ã§ãããæçµçã«2.7ãå¿
èŠã§ããïŒã®ã§ãå¿
èŠãªãã®ãéãã«ã€ã³ã¹ããŒã«ããããã«ç°å¢ä»®æ³åã®äžè©±ãããªããã°ãªããŸããã§ãããããã«ã
root
æš©éãŸãã¯
sudo
erãå¿
èŠãªããªããŸãã
ä»®æ³ç°å¢ãäœæããã«ã¯ã
virtualenvãã€ã³ã¹ããŒã«ããããã¢ãŒã«ã€ããã
virtualenv.py
ãããŠã³ããŒãããŠæœåºããå¿
èŠããããŸãã 2çªç®ã®ãªãã·ã§ã³ã䜿çšããŸãã ããã¯ãã¹ãŒããŒãŠãŒã¶ãŒã®ãã¯ãŒã䜿çšããããšããŸã£ããæããšã©ãŸãããŸãã ã¯ãããŸã ã·ã¹ãã ã«pythonãã€ã³ã¹ããŒã«ããå¿
èŠããããŸãã
python virtualenv.py -p python2.7 .env
ããã§ã
-p python2.7
ã¯å¿
èŠãªããŒãžã§ã³ã®pythonãèšå®ããŸã
ïŒåŸ®åŠãªç¹ã¯ãå¿
èŠãªããŒãžã§ã³ã®pythonãã·ã¹ãã èªäœã«ã€ã³ã¹ããŒã«ããå¿
èŠããããŸããããããã©ã«ãpythonãã§ã¯ãªããããã¹ã¯ãªããã¯ããããåŒãåºããŠã€ã³ã¹ããŒã«ããããšã¯ã§ããŸããïŒ .env
ç°å¢ãé
眮ããã
.env
ãã£ã¬ã¯ããªã ããã«ãç°å¢ããpythonãšã¢ãžã¥ãŒã«ã䜿çšããã«ã¯ã
.env/bin/python
ãä»ããŠããããåŒã³åºãå¿
èŠããããŸã
.env/bin/python
ãããæ writeã«æžããšãå®è¡ã§ããŸã
source .env/bin/activate
PATHç°å¢å€æ°ã眮ãæããŸãã
ãã¡ããªãã¯ã«ããèªåå
ã¿ãŒã²ããã·ã¹ãã ã«ã€ã³ã¹ããŒã«ãããpythonã«å ããŠã
ãã¡ããªãã¯ã¢ãžã¥ãŒã«ãå¿
èŠã§ãã ã€ãŸãããã¹ããµãŒããŒã§ã
sudo pip install fabric
ãŸãã¯
sudo easy_install fabric
ãå®è¡ããå¿
èŠããããŸããã€ã³ã¹ããŒã«äžã«ãã¢ã»ã³ããªã®ããã«
python-dev
ãã
python-dev
ãœãŒããå¿
èŠãšãã
pycrypto
ããã«ãããããæåã«ã€ã³ã¹ããŒã«ããå¿
èŠããããŸãã Fabricã䜿çšãããšãããŒã«ã«ãŸãã¯ãªã¢ãŒãïŒSSHçµç±ïŒã·ã¹ãã ã§ã¢ã¯ã·ã§ã³ãå®è¡ããã¹ã¯ãªãããPythonã§å®è¡ã§ããŸãã ã€ã³ã¹ããŒã«åŸã
fab
ã¢ããªã±ãŒã·ã§ã³ãã·ã¹ãã ã«è¡šç€ºãããcallãã©ã«ããŒã§
fabfile.py
ãã¡ã€ã«ãæ€çŽ¢ãããæå®ãããã¹ã¯ãªãããå®è¡ãããŸãã
äŸïŒ
fab test
å®è¡ãããšã
fabfile.py
ãã¡ã€ã«ãã
test
æ©èœãå®è¡ãããŸãã
ãžã£ã³ãŽã®éŒ»ãšãŠã§ããã¹ã
次ã«ããã¹ãèªäœã«ã€ããŠå°ã説æããŸãã Djangoã«ã¯ç¬èªã®ãŠããããã¹ããšæ©èœãã¹ãïŒãã¹ãã¯ã©ã€ã¢ã³ãã䜿çšïŒããããŸããããããã«ã¯è€æ°ã®æ¬ ç¹ããããŸãã äžè¬ã«ãç§ã¯æ©èœãã¹ãã®ããã«ãŠããããã¹ããš
ãŠã§ããã¹ãã®ããã«
錻ã䜿ãå§ããŸããã ã¯ããã«ãwebtestã«ã€ããŠã®èšäºãžã®ãªã³ã¯ã瀺ããŸããããããã©ã®ããã«æ©èœãããããã瀺ããŠããŸãã ãã¹ãã«ã¯æ¬¡ã®ã¢ãžã¥ãŒã«ãå¿
èŠã§ãïŒãã®åŸã
pip -r
ãä»ããèªåã€ã³ã¹ããŒã«çšã®ã¢ãžã¥ãŒã«ã®ãªã¹ããšãšãã«ããã®ãªã¹ãããã¡ã€ã«ã«è¿œå ããŸãïŒã
coverage>=3.0 nose webtest django-nose django-webtest
ããã«ã
django_nose
djangoãããžã§ã¯ãã®
INSTALLED_APPS
settings.py
ãã¡ã€ã«ã«è¿œå ããããåããã¡ã€ã«ã§
TEST_RUNNER = 'django_nose.NoseTestSuiteRunner'
æå®ããå¿
èŠããããŸãã
泚æïŒ south
䜿çšããå Žå
south
ã
django_nose
ãã®åŸã«è¿œå ããå¿
èŠããããŸãã
å®éãDzhangovskyãã¹ãã·ã¹ãã ã§æ¢ã«èšè¿°ãããŠãããŠããããã¹ããããå Žå-ãããã«è§Šããããšã¯ã§ããŸããããã¹ãŠããã®ããã«åäœããŸãã webtestã䜿çšããŠæ©èœãã¹ããäœæããæ¹æ³
ã«ã€ããŠã¯ãäžèšã®
èšäºãã芧
ãã ãã ã
ãã¹ãã¯éåžžââã©ããéå§ãããŸãã
python manage.py test
ãã®ã³ãã³ãã¯ããã¹ãã®ãããã¡ã€ã«ãã¯ã©ã¹ãããã³é¢æ°ã®ååã«
"test"
ãšããåèªãå«ãŸããŠããå Žåãnoseãã¹ããšwebtestãã¹ãã®äž¡æ¹ãå®è¡ããŸã-ããã¯
nose
ããã®ããŒãã¹ã§ãã ããã«ã
nose
ã¯
ã«ãã¬ããžã䜿çšããŠãã¹ãã®ã³ãŒã
ã«ãã¬ããžãèšç®ã§ããŸãïŒãã¹ãã¯ã³ãŒãã§ã¯ãªããçæãããããŒãžãä»ããŠæ©èœãããããæ©èœçãª
webtest
ãã¹ããçè§£ããŠããŸããïŒã
Django-nose
ã§ã¯ã
ãªãã·ã§ã³ã䜿çšããŠ
錻ãã¹ã
ãå®è¡ã§ããŸãã ãããè¡ãã«ã¯ããããžã§ã¯ãã®
settings.py
ãã¡ã€ã«ã«
settings.py
ãŸãã äŸïŒ
NOSE_ARGS = [ '--nocapture', '--with-coverage', '--cover-html', '--cover-html-dir=%s' % os.path.join(PROJECT_PATH, 'cover', 'unit'), '--cover-package=django_dir' ]
ãã®ã¹ãã«ã䜿çšãããšãHTML圢åŒã®ãã¹ãã«ãã¬ããžã¬ããŒããçæãããããžã§ã¯ãã®
cover/unit
ãµããã£ã¬ã¯ããªã«é
眮ã§ããŸãã
ç·Žç¿ãã
ãããžã§ã¯ãæ§é
ç§ã®ãããžã§ã¯ãã®ãã©ã«ããŒæ§é ã¯æ¬¡ã®ãšããã§ãã
. .. project_dir project_dir/django_dir project_dir/build project_dir/build/pipreq.txt project_dir/fabfile.py project_dir/virtualenv.py
project_dir
ã¯ãä»®æ³ç°å¢ã®ãããã£ã¬ã¯ããªããã¡ã¯ããªãã¡ã€ã«ããã®ä»ã®äŸ¿å©ãªãã®ãªã©ãããããçš®é¡ã®äŸ¿å©ãªãã®ãå«ãŸããŠãããæ¢ã«
django_dir
ãµããã£ã¬ã¯ããªã«ãããããžã§ã¯ãèªäœã¯
djangoã«ãããŸãã ãã¹ãŠã¯
project_dir
ããå§ãŸããŸãããä»®æ³ç°å¢ãåãããã£ã¬ã¯ããªãªã©ãããã€ãã®äŸå€ã¯ãããŸãããããŒãžã§ã³ç®¡çã·ã¹ãã ïŒç§ã®å Žåã¯
GIT ïŒã«å
¥ããŸãã
ãã¹ãå®è¡
å®éãç§ãã¡ã®ç®æšã¯ããªããžããªå
ã®å€æŽãæ€åºããåŸïŒæ¹æ³ãç¥ã£ãŠããïŒ
TeamCityãæããŠãæŽæ°ãããdjangoãããžã§ã¯ãïŒæ¹æ³ã¯ç¥ããªãïŒããã¹ãããçµæã«ã€ããŠèª¬æããããšã§ãïŒããã§åœŒãå°ãå©ããå¿
èŠã§ãïŒã
å®éã«ã¯ãå®éšã®çŽåºŠã®ããã«ããã¹ãèªäœã«å ããŠãç°å¢å
šäœããã§ãã¯/æŽæ°ããããšãæãŸããããã倿Žãåãåã£ãåŸã«TeamCityãèµ·åããå°ããªå·¥å ŽãäœæããŸãã
ã³ãŒã
project_dir/fabfile.py
ïŒ
virtualenv.py
ã¯ãããžã§ã¯ãã®ã«ãŒãã«ãããããã·ã¹ãã ã«ã€ã³ã¹ããŒã«ããå¿
èŠã¯ãããŸããã
project_dir/build/pipreq.txt
å¿
é ã³ã³ãã³ãïŒ
django coverage>=3.0 nose teamcity-nose webtest django-nose django-webtest ... /...
åè¿°ã®
teamcity-noseããã¡ã€ã«ã«ãªã¹ããããŠããããšã«
泚æããŠ
ãã ãã ããã®ã¢ãžã¥ãŒã«ã¯ããã¹ãã®çµæãTeamCityã«äŒããã®ã«åœ¹ç«ã¡ãŸãã æ§æãæ¥ç¶ã¯å¿
èŠãããŸãããTeamCityãæäœäžã«äœæãã
TEAMCITY_PROJECT_NAME
ç°å¢
TEAMCITY_PROJECT_NAME
ãèŠã€ãããšãèªåçã«èµ·åããŸãã
å®éããã¹ãŠãèªåãã¹ãã®æºåãã§ããŠããŸãã éå§ããã«ã¯ã次ã®ã³ãã³ããå®è¡ããã ãã§ãïŒ
fab test
ãããžã§ã¯ãã®ã«ãŒãã§ã
TeamCityãã€ã³ã¹ããŒã«ããŠæ§æãã
ããŸãæ°ã«ããŸããã§ãã
ããããŠã³ããŒãããŒãžãã tar.gzãªãã·ã§ã³
ãããŠã³ããŒãããŸãã ã ãã®ãã¹ãŠã®å¹žçŠã®ééã¯ãäžåãª333MBã§ãã ããããçµ±åãµãŒããŒèªäœã«å ããŠã
Tomcatãå«ãŸããŠã
ãŸã ãããã«ããããµãŒããŒèšå®ããã®ä»ã®ããããã«ããhemoããç§ãã¡ãæããŸãã
TeamCityã«ã¯ã誰ããæ°ã«å
¥ããªããããããªãããããã£ïŒåé ã«èšèŒïŒããããŸã-åäœããã«ã¯ãå°å³/ OracleããŒãžã§ã³ã®
JVMãå¿
èŠã§ãã
Ubuntuã§ãããååŸããæ¹æ³ã¯ãäŸãã°
ããã§èªãããšãã§ã
ãŸã ã
å®éãããŠã³ããŒãåŸããã®ãã®ãæ©èœããå Žæã«è§£åããŸãïŒããã©ã«ãã§ã¯ãããŒã¿èªäœã¯ããµãŒããŒãå®è¡ãããŠãã
.BuildServer
ããŒã ãã£ã¬ã¯ããªã®
.BuildServer
ãµããã£ã¬ã¯ããªã«ä¿åãããŸãïŒã ãµãŒããŒã¯ã³ãã³ã
bin/runAll.dh start
ãããã«å¿ããŠ
bin/runAll.dh stop
ã
bin/runAll.dh stop
ãããŸãïŒã¢ãŒã«ã€ããè§£åããããã©ã«ããŒã«ããå ŽåïŒã ãµãŒããŒã¯ããã©ã«ãã§ããŒã
8111
ã§å®è¡ãããŸãããããŒã
9090
ã§èµ·åãã
build agent
ããããŸãã æåã¯
conf/server.xml
ã§ã2çªç®ã¯
buildAgent/conf/buildAgent.dist.properties
ïŒãµã³ãã«ïŒããã³
buildAgent/conf/buildAgent.properties
ïŒç¹å®ã®ãšãŒãžã§ã³ãïŒã§å€æŽã§ããŸãã
ä»ã®ãã¹ãŠã®èšå®ïŒãããã説æããŸãïŒã¯ãWebã€ã³ã¿ãŒãã§ãŒã¹ãä»ããŠè¡ãããŸãã äžè¬ã«ãteamcityãèµ·åããŠãã©ãŠã¶ãŒã«ç§»åããŸãïŒhttpïŒ// localhostïŒããŒã«ã«ã§èµ·åãããå Žåã¯8111ïŒã ã·ã¹ãã ã®å®¹éã«å¿ããŠãã©ã€ã»ã³ã¹å¥çŽãŸãã¯ã¡ãã»ãŒãžã衚瀺ãããŸãã

ã©ã€ã»ã³ã¹å¥çŽã«çœ®ãæãããããŸã§åŸ
ã€å¿
èŠããããŸãã
次ã«ã管çè
ã¢ã«ãŠã³ããäœæããããã«æ±ããããŸãã ãã®åŸãTeamCityã·ã¹ãã èªäœã衚瀺ãããŸãã
ããã§ã¯ããããžã§ã¯ãã®äœæã«èå³ããããŸãã ååãšèª¬æ-ãã¹ãŠãããã«ç°¡åã§ãã ãããžã§ã¯ãèšå®ããŒãžã«ç§»åããåŸã

[
VCSã«ãŒã ]ã¿ãïŒVCS-ããŒãžã§ã³ç®¡çã·ã¹ãã ïŒã§ãæ°ãããªããžããªãæå®ããå¿
èŠããããŸãã ã·ã¹ãã ããã¹ãçšã®ã³ãŒããååŸããå Žæãããæ£ç¢ºã«ç€ºããŸãã ããŒã¿ãå
¥åããå¿
èŠãããé·ããããã¯ãã¹ããããŸãã ãã¹ãŠã®ãã£ãŒã«ãã«çœ²åãããããã«ãããŒãžãžã®ãªã³ã¯ããããããããã«è¶
人çãªãã®ã¯ãããŸããã æ¥ç¶ã®ç¶æ
ãããã«ç¢ºèªã§ããŸãã
次ã«ã[
å
šè¬ ]ã¿ãã§ãæ°ãã
Buid Configurationãäœæããå¿
èŠããããŸã-ããã¯ãã¹ãã®åºç€ã§ãã
ãã«ãã«ãŠã³ã¿ãŒ -
ãã«ãã®çªå·ä»ããéå§ããçªå·ããŸãã¯æ¬¡ã®ãã«ãã«å²ãåœãŠããããã«ãã®çªå·ã ããªãã¯å®å
šã«
1
眮ãããšãã§ããŸããããã§ã¯ã¹ã¯ãªãŒã³ã·ã§ããã¯æ°é®®ã§ã¯ãããŸãã:)
æåã®ããŒãžã®éèŠãªãã£ãŒã«ãã®ãã¡ãã¢ã»ã³ããª/ãã¹ãã®çµæãã¡ã€ã«ãèŠã€ããæ¹æ³ãã·ã¹ãã ã«äŒãã
ã¢ãŒãã£ãã¡ã¯ããã¹ããããŸãã ç§ãã¡ã®å Žåããããã¯ãã¹ãã«ãã¬ããžã«é¢ããã¬ããŒãã§ãã ç§ã®å Žåã
django_dir/cover/**/*
ã 2çªç®ã®ããŒãžã§ã以åã«å®çŸ©ãããªããžããªãéžæããŸãã
[
ãã«ãã¹ãããã®
远å ]ãã¯ãªãã¯ããŠãæåã®ïŒãããŠãã®å Žåã¯å¯äžã®ïŒãã«ãã¹ãããïŒãã®å Žåã¯ãã¹ãïŒãäœæããå¿
èŠããããŸãã

å®éã«ã¯ãç»é¢ã«è¡šç€ºãããå¿
èŠãªèšå®ã»ããã ä¿åããŸãã
次ã«ãåçŽã¡ãã¥ãŒã®å³åŽã§[
ãã«ãã®ããªã¬ãŒ ]ãéžæãããªããžããªã倿Žããããšãã«ã¢ã»ã³ããªã®èµ·åã远å ããŸãã

æåŸã«ããããžã§ã¯ãèªäœã®èšå®ã«æ»ãã[
ã¬ããŒãã¿ã ]ã¿ãã«ç§»åããŠæ°ããã¿ããäœæããŸãã

ããã«ãããTemCityã¯ã€ã³ã¿ãŒãã§ã€ã¹ã«ã¬ããŒãã衚瀺ã§ããŸãã

æå®ããããã¡ã€ã«ãæå®ãããå Žæã«ããå Žåãã¿ãã衚瀺ãããŸãããã®å Žæã«ãªãå Žåã¯ãèšå®ã確èªããã¬ããŒããå®éã«ããã¹ãå Žæã«ãããã©ããã確èªããŸãã
ããã ãã§ãã
ãããžã§ã¯ãã®ãããã¡ãã¥ãŒã«æ®ãã
ãããžã§ã¯ãã«ç§»åããŠæåã®å®è¡ã®ããã«ãã«ãã§[
å®è¡ ]ãã¯ãªãã¯ã
ãŸã ã
ãããããã
ãã¹ãŠã®ãããŒãžã£ãŒã¯ã°ã©ãã£ãã¯ã¹ã倧奜ãã§ãããªããªãã衚瀺ãããã®ãåŸãã«ã¯ãããã€ãã®åçãäœæããå¿
èŠãããããã§ãã æ®å¿µãªããããããã®åçã¯ãXMLæ§æã«å€æŽãå ããããšã§ãçã®ããã°ã©ããŒç®¡çæ¹æ³ã«ãã£ãŠè¿œå ãããŸãã ããã¥ã¢ã«ã¯
ãã¡ãã«ãããŸã ã ãã®å Žæã§ã¯ãéçºè
ã¯ããªãäŒãã§ãããšæããŠããŸã
ïŒãã§ã¹ããã®ãã©ãŒã ãäœæã§ããŸãïŒ ã ãªããªã
buildTypeId
æãéèŠãªãã©ã¡ãŒã¿ãŒã®1ã€ãèŠã€ããæç¢ºãªæ¹æ³ã¯èŠã€ãããŸãã
buildTypeId
ã æãç°¡åãªæ¹æ³ã¯ããã©ãŠã¶ã®ã¢ãã¬ã¹ããŒã調ã¹ãããšã§ãã
localhost:8111/viewType.html?tab=buildTypeStatusDiv& buildTypeId=bt2
localhost:8111/viewType.html?tab=buildTypeStatusDiv& buildTypeId=bt2
2ã€ã®ã°ã©ãã®æ§æãæäŸããŸãã
<?xml version="1.0" encoding="UTF-8"?> <settings> <report-tabs> <report-tab title="Coverage" basePath="/unit/" buildTypeId="bt2"> <revisionRule name="lastFinished" revision="latest.lastFinished" /> </report-tab> </report-tabs> <custom-graphs> <graph title="Build Duration" defaultFilters="showFailed" seriesTitle="key"> <valueType key="BuildDuration" title="main test" buildTypeId="bt2"/> </graph> <graph title="Test Passes" defaultFilters="showFailed" seriesTitle="key"> <valueType key="FailedTestCount" title="fail" buildTypeId="bt2"/> <valueType key="PassedTestCount" title="pass" buildTypeId="bt2"/> </graph> </custom-graphs> </settings>
ããã¯
~/.BuildServer/config/django_dir/plugin-settings.xml
ãã¡ã€ã«ã§ãã ãã¡ã€ã«ãžã®å€æŽã¯ãã®å Žã§ååŸãããŸãã
次ã®ããã«ãªããŸãã

ã«ãã¬ããžã¬ããŒãã¯æ¬¡ã®ãšããã§ãã

ã¢ã»ã³ããªãªã¹ãïŒ

ã¢ã»ã³ããªã®è©³çްïŒ

ãããã«
ããã«ãããã¯ãããaã³ããŸãããããã¯ãŸãã«ãã®éãã§ãã ç§ã¯ãããå©çšå¯èœã«ãããã£ãã ãã®çµæãèªååããããã¹ãïŒã¢ãžã¥ãŒã«åãšçµ±åïŒãè¡ãããããã«ãå¿
èŠãªã¢ãžã¥ãŒã«ã®ååšãšãããžã§ã¯ãã®ããªããå¯èœæ§ãããã§ãã¯ãããŸãã TemaCityãããŸããŸãªã¢ã»ã³ããªã®çµæã«åå¿ããŠè§£äœããããšã¯ãè¯å¿ã«ä»»ããŸãã ãã®ããŒãã§ã¯ãåã¶ã¹ãããšããããŸã-æšæºçãªç³é¹žéç¥ãããã³
jabberã«ããéç¥ãããã³ãªãªãŒã¹ããã·ã¥ã®äœæã®äž¡æ¹ã§ãã
è¯ãéçºãïŒ