ç§ã¯ãã°ããã®éTDDãéžæããŠããŸããããäžå®ã®å質管çã®ã¿ã¹ã¯ã¯ç§ã«ãšã£ãŠãŸããŸãç·æ¥ã«ãªã£ãŠããŸãã ç¹ã«ãæ°ããéçºè ãããŒã ã«è¿œå ããå Žåã
ãŸããæã§ãã¹ããå®è¡ããŸããïŒsaveãswitchã$ nosetestsã 次ã«ãã³ãŒãå質ãã§ãã¯ããã¹ãã«è¿œå ããããã¹ãŠãã¹ã¯ãªããã«å ¥ããå¿ èŠããããŸããã
pyflakes *.py
pep8 *.py
pylint *.py
nosetests
æ¯åã¹ã¯ãªãããå®è¡ããã®ã¯éåžžã«é¢åãªã®ã§ãinotifywaitã®å°ããªã·ã§ã«ã¯åä¿ååŸã«ãã¹ããšãã§ãã¯ãå®è¡ãå§ããŸããã
while true; do
inotifywait -e modify project/*.py -qq; clear
./do_tests
done
ãã®åŸãç§ã¯å€ããå°ãªããäœãèµ·ãã£ãŠãããã«æºè¶³ãããã°ãããªã©ãã¯ã¹ããããŸããã ããããããã°ã©ããŒã¯æ ãè ã§ããããšã«å ããŠèªãã«æã£ãŠããã®ã§ãçµæã誰ãã«èŠãããã§ãã äœãèµ·ãã£ãŠããã®ããä¿æããããã«ïŒäžåžãæ¥ãŠããããŠãå æã¯äœãããŠããŸãããïŒããšå°ãããšãã«éåžžã«åœ¹ç«ã¡ãŸãïŒããã§ã«ããŒãžã§ã³ç®¡çã·ã¹ãã ããããŸãã ããããããã¯äœãè¡ããããã瀺ãã ãã§ãããåæ¹èšã®æåã®æŠèŠã瀺ããŠããŸããã ã³ãŒããååšããããšãããããŸããããããã©ã®ãããªç¶æ ã§ãããä»ã«äœãããå¿ èŠããããã¯æããã§ã¯ãããŸããã
ããã«ãäœããè¡ãããšãã§ãããã¹ãã®å®è¡ãå¿ããå¯èœæ§ã®ããååã远跡ããããšã¯éåžžã«å°é£ã§ãããã®çµæããªããžããªã«ã¯ã³ãŒãã¬ãã¥ãŒã«åæ ŒããŠããªãå£ããã³ãŒããå«ãŸãã次ã®ãã«ã§clusterfuckãçªç¶éå§ãããå¯èœæ§ããããŸãã
ãããŠããããŠãkmmbvnr @ ljãã¹ã¯ãªãŒã³ãã£ã¹ãããªãªãŒã¹ãããžã§ã³ãã³ã¹ïŒä»¥åã®ãããœã³ïŒãé¡æã«ãããžã£ã³ãŽãããžã§ã¯ãã®ãã¹ãçµ±åãå®èšŒããŸããã ç§ã¯ããããã¹ãŠã®çŸãããã°ã©ããã¬ããŒããèŠãŠããã¹ãŠãæããæŒå¥ããããšãæãã§ããŸããã ãããã圌ã®django-jenkinsã¯ããã®ååã瀺ãããã«ãjungaã«åã蟌ãŸããããªãããŒãªã·ã¹ãã ã䜿çšããŠã¬ããŒããçæããŸãã ç§ã®ãããžã§ã¯ãã¯dzhangaã«æé·ããŠããããããããæé·ããŸãã-ããã¯ãããªãäºçŽ°ãªWSGIã¢ããªã±ãŒã·ã§ã³ã§ãããçå®ã¯æ¥éã«æé·ããŠããŸãã ãã¹ãŠããŒãããæã¡äžããªããã°ãªããŸããã§ããã
æ¥ææ¥ã«ç§ã¯ããã殺ããããäžè¬çã«ã¯ãã¹ãŠãéåžžã«ç°¡åã§ãããä»ã§ã¯ããã¬ããŒãããããŸãïŒ
äžèº«ã¯ïŒ
0ïŒã«ãããææ°ããŒãžã§ã³ãèªåçã«ååŸããŸãã ãã®ã·ã¹ãã ã¯æ°Žéãšéåžžã«ç·å¯ã«çµ±åãããŠããããããã¹ãŠã®ç·šéãšã³ãããã衚瀺ãããã¢ã¯ã»ã¹å¯èœã§ãã
1ïŒãããžã§ã¯ããæŠéãµãŒããŒã«å±éãããã®ããã«ããŒãããçµã¿ç«ãŠãŸãã ç°å¢ãäœæãããã¢ãžã¥ãŒã«ããã³ãã§éãããŠã€ã³ã¹ããŒã«ãããŸãã ã·ã¹ãã èªäœã¯ãæŠéã«è¿ãæ¡ä»¶ã®éçºè ã®ãµãŒããŒäžã«ãããŸãïŒæãç©ãPythonãããžã§ã¯ãã®åé¢ãã€ã³ã¹ããŒã«ã®ããããã
2ïŒãã¹ããå®è¡ãããŸãã ããããšå ±ã«ãã³ãŒããã¹ãã®ãã¹ãã«ãã¬ããžãããã«çºçããŸãã ãã®çµæã倱æãããã¹ããšã«ãã¬ããžã«é¢ããã¬ããŒããã¡ã€ã«ãäœæãããŸãã äžéšã®ç·ã®ã°ã©ã-倱æãããã¹ãã®æ°ãèµ€ã§è¡šç€ºãããŸãã äžçªäžã®ã°ã©ãã¯ã«ãã¬ããžã瀺ããŠããŸãã ã«ãã¬ããžã¯ãæªæ€èšŒã®è¡ã匷調衚瀺ããŠãã¡ã€ã«ã§çŽæ¥è¡šç€ºã§ããŸãã
3ïŒå質ãã§ãã¯ãå®è¡ãããŸããpep8ãšpylintã¯ãéçºè ã®é è³ãæ éã«æŒããŠãã³ãŒããå€æ°åãªã©ã®é åºãæŽããŸãã ãã§ã«äœããã®åœ¢ã§ãã¿ãåãåºãæéã§ããããšãåžžã«ç€ºåããèµ€ãç Žç·ã
4ïŒå£ããã³ãŒããã³ãããããéçºè ã¯ãã·ã¹ãã ã«ãã£ãŠé»åã¡ãŒã«ãšãžã£ããŒïŒå人ããã³MUCïŒã§èªåçã«oldããã次ã«ãªãŒãããã°ã©ããŒãåæ§ã®èŠæ ãåãåããŸãã 誰ãã¹ãã€ã³ã®ç°ç«¯å¯©åãæåŸ ããŠããªãããã§ãïŒ
ãã®çµæãäžåºŠã«æ°äººã®ã«ãŒãã³ã®å€§éšåãå ããã·ã¹ãã ãã§ããŸããã
ã¡ããã ãïŒ
ã·ã¹ãã èªäœã¯ã java / warããã±ãŒãžãšããŠæäŸãããŸã ã äœãã€ã³ã¹ããŒã«ããå¿ èŠã¯ãããŸããããJREãå¿ èŠã«ãªããŸãïŒç¡æã§Diablo-1.6ãã€ã³ã¹ããŒã«ããŸããïŒã ãã®ãµã€ãã§ã¯ããªã³ã¯ãçªããŠããã«ãµã€ãã§èµ·åã§ããŸãã åçŽã«å§ãŸããŸãïŒjava -jar jenkins.warã ããŒããªã©ãæå®ããããã®ãªãã·ã§ã³ããŸã ãããŸãã ããŒã«ã«ãã¹ãã«ãã€ã³ãããnginxã§ã©ããããããšããå§ãããŸãã ããªãã¯äœãç¥ã£ãŠããããšã¯ãããŸããã ã«ãŒãããå®è¡ããããšã¯åŒ·ããå§ãããŸãã
ã²ããã«ãããã¯æªéåãããããšãæåŠããã®ã§ãç§ã¯ç£ç£è ãå ¥ããŸããã ããããããã¯éå®ããŸããã åçŽã«ã€ã³ã¹ããŒã«-pip install Supervisordã
ãã¹ãŠã®èšå®ã¯ãJenkinsã®ç®¡çã¡ãã¥ãŒãéå§ããåŸããã©ãŠã¶ãŒããè¡ãããŸãã
æåã«è¡ãããšã¯ããã©ã°ã€ã³ããã©ã°ã€ã³ããããšã§ãã 圌ãã¯ã¹ã€ã³ã°ããŠèªåèªèº«ãèšå®ããŸããããã¯ã¹ããã§ãã¯ããã ãã§ãã
- Jenkins Coberturaãã©ã°ã€ã³-ãã¹ãã«ãã¬ããžã¬ããŒã
- Hudsonã€ã³ã¹ã¿ã³ãã¡ãã»ãŒãžã³ã°ãã©ã°ã€ã³-éç¥ã ãžã£ããŒã«å¿ èŠã§ãã ãŸãããŸãã¯ããªãããããå ¥ããŠããªãå Žåã¯å¿ èŠãããŸããã
- Hudson Jabber notifierãã©ã°ã€ã³-å®éã®ããã
- Hudson Mercurialãã©ã°ã€ã³-ãªããžããªçµ±åã
- Hudson Violationsãã©ã°ã€ã³-Pylintãã³ãã©ãŒ
nefigãªã®ã§ãæ¢ã«ã€ã³ã¹ããŒã«ãããŠããæ®ãã®éšåã¯ãªãã«ããŸããã
åèµ·åã®ãªãäžéšã®ãã©ã°ã€ã³ã¯èšå®ã«è¡šç€ºãããŸããã
èšå®
ã»ãã¥ãªãã£ãããã«æå¹ã«ããé©åãªèªèšŒæ¹æ³ãéžæããå¿ èŠããããŸãã ãããžã§ã¯ãããŒã¹ã®ãããªãã¯ã¹æ¿èªæŠç¥ãæ¡çšããŸããã ãŠãŒã¶ãŒãäœæããå¿ èŠã¯ãããŸããããåèµ·åããå¿ èŠããããŸãã åå ¥åãããšãããã«ç®¡çè ãäœæããããã«æ±ããããŸãã ããã管çè ãšåŒã¶æ¹ãè¯ãã§ãã ããããªããšããããžã§ã¯ãã®åå è ã®ãªã¹ãã«ã³ãããã§ææãããåå è ã®ãªã¹ããä¿æãããããã誰ã誰ã§ãããã«ã€ããŠæ··ä¹±ããå¯èœæ§ããããŸãã
ãã¯ãã¹ãµã€ããªã¯ãšã¹ããã©ãŒãžã§ãªã®ãšã¯ã¹ããã€ããé²æ¢ãããããšã¯è¯ãããšã§ãããããã¯ç§ãšäžç·ã«ã¯æ©èœããŸããã§ãããå«ããå¿ èŠã¯ãããŸããã§ããã
JDKããã³ãã®ä»ã®ãã€ã³ã¹ããŒã«ããæ§æããå¿ èŠã¯ãããŸããããã¹ãŠããã®ããã«æ©èœããŸãã
ã·ã§ã«å®è¡å¯èœãã¡ã€ã«ã¯ã/ usr / local / bashãŸãã¯/ usr / bin / bashã«èšå®ããå¿ èŠããããŸãã èŠããã«ãã·ã§ã«ãžã®å®å šãªãã¹ããããŠããããã©ã®ããã«èµ·åããã®ã決ããŠããããŸãã...æããªããPythonãå²ãåœãŠãããšãã§ããŸãããããã¯äžäŸ¿ã§ãã
Jabberããã³Emailã»ã¯ã·ã§ã³ã¯ãCapããã³Advancedãã¿ã³ã®èšå®ã«åœ¹ç«ã¡ãŸãã
ãããžã§ã¯ãã®ã»ããã¢ãã
ããã§ã¯ãžã§ããšåŒã°ããŸãã ãžã§ãåãæå®ãããããªãŒã¹ã¿ã€ã«ããããŒã¯ããŸãã ããããç§ã¯é±æ«ã®ååã殺ããæãããããã
ç§ã¯å€ãã®ãã«ããæã£ãŠããŸãããé »ç¹ã«ãããè¡ãã®ã§ã10å/ 30æ¥éã®ã¹ãã¬ãŒãžå¶éãèšå®ããããšã¯è«ççã«æããŸããã ãã®å Žå-ãã€ã§ã[ä»ãããã«ã]ãã¯ãªãã¯ã§ããŸãã
ããããã±ãã®ãã©ã€ããŒãã«ãã«ã³ãŒãã眮ããã®ã¯ãããããç¡æã§éåžžã«æ©èœããŠããããã§ãã å«ããªGit é å šäœã®pythonistãšgithubã«ã¯ç¡æã®ãã©ã€ããŒãã©ããã¯ãããŸããã
ãªããžããªã®URLã¯æ¬¡ã®ããã«ãªããŸãïŒã¯ããèªèšŒã転éããå¿ èŠããããŸãããã®ããããžã§ã³ãã³ã¹ã®ã€ã³ã¹ããŒã«ãããã«ãã¹ã¯ãŒãã§ä¿è·ããå¿ èŠããããŸãïŒïŒ[code] httpsïŒ// usernameïŒpassword@bitbucket.org/username/uniproxy [/ code]
ãªããžããªãã©ãŠã¶-bitbucketã
ããªã¬ãŒã®äœæ-SCMãããŒãªã³ã°ããŸãã Cron圢åŒã®ã¹ã±ãžã¥ãŒã«ïŒ[ã³ãŒã] * / 5 * * * * [/ã³ãŒã]
ãããããªã¢ãŒãã§ããªã¬ãŒãå®è¡ããããšãã§ããŸãããç§ã¯é¢åã§ãã ãŸããããã¯ãã¹ãŠã®éçºè ã®ããã§ãªããã°ãªããããã®ããªã¬ãŒã§èšå®ããã©ãã°ããŸã...ãããŠãã¹ã±ããã¯åžžã«1ãæã«ãããã©ãããã§ãã¢ã¯ã»ã¹ã§ããŸãã
å·è¡ã®
ãããžã§ã¯ããã¡ã€ã«ã¯æ¬¡ã®ããã«æ§æãããŠããŸãã
.
buildenv.sh
pip-reqs.txt
pylint.rc
project/*.py
reports/*
venv/*
æåŸã®2ã€ã¯ã¹ã¯ãªããã«ãã£ãŠäœæãããŸãã äž»ãªãã®ãgithubã«ã¬ã€ã¢ãŠãããŸããã
ã¹ã¯ãªãŒã³ãã£ã¹ãã§ã¯ããã¹ãŠã1ã€ã®ã¹ãããã«ããããšãããããŸãããã3ã€ã®è«ççãªãã®ãã€ãŸããã«ãããã§ãã¯ããã¹ãã«åå²ããããšã«ããŸããã
1ã€ç®ã¯éåžžã«ç°¡åã§ããã./ buildenv.shãã¯ãããžã§ã¯ãå ã«ãããvirtualenvãæºåããŸãã ããã«ã³ããŒããããšã¯å¯èœã§ãããããã¯åŽå也ç¥ã§ã¯ãããŸããã åããã®ã®è€è£œãä¿æããå¿ èŠããããŸãã
2çªç®ã¯ããå°é£ã§ãã
#!/usr/local/bin/bash
venv/bin/pep8 --repeat --ignore=E501,W391 project | perl -ple 's/: ([WE]\d+)/: [$1]/' > reports/pylint.report
venv/bin/pylint --rcfile pylint.rc project/*.py >> reports/pylint.report
echo "pylint complete"
æåãšæåŸã®è¡ã¯ãpylintãæå¥ãèšãäœããèŠã€ããå Žåãã¹ãããå šäœãæ£ããã£ããšèŠãªããããšããäºå®ã«é¢é£ããŠããŸãã ãããŠãããªã³ãã¯æãéªæªãªæåž«ãããæªãã§ããåžžã«æå¥ãèšãäœããèŠã€ããŸãã æ§æã§ã¯ã圌ã¯ããã€ãã®ãšã©ãŒãç§ã«ãšã£ãŠé¢çœããªãããšãç»é²ããŸããã pep8ã¯pylintãè£å®ããŸãããèšèšã«ãã泚æãæã£ãŠããŸãã äžéšã®èŠåã¯ç¡å¹ã«ãªã£ãŠããŸãïŒpylintã¯è¡ã®é·ãããã§ãã¯ããæ§æã§èšå®ãããŸãïŒã
ãã¹ãŠã®ã¹ã¯ãªããã¯åã®ã¹ãããã§ã€ã³ã¹ããŒã«ãããvenvããå®è¡ãããããšã«æ³šæããŠãã ããã äœãããã©ãã©ã«ãªã£ãå Žåãä»ã®ãã¹ãŠã厩å£ãã倧ããªèµ€ãããŒã«ãæ¥ã®ããŒãã«ã¶ãäžãã£ãŠããŸãã
3çªç®ã¯ãã¹ããå®è¡ããã«ãã¬ããžãåéããŸãã
venv/bin/coverage run --include 'project/*.py' project/tests.py --with-xunit --xunit-file=reports/tests.xml --where=project
venv/bin/coverage xml -o reports/coverage.xml
ããã§ã¯ããã¹ã«éåžžã«æ³šæããå¿ èŠããããŸãã ãªããžããªã®ã«ãŒãããã§ã¯ãªãããããžã§ã¯ãããã®ãã®ã§ããå Žåãè¡ããšã®ã«ãã¬ããžã®è¡šç€ºã¯æ©èœããŸããã ãœãŒã¹ãèŠã€ããããšãã§ããªããªããŸãã ææ ®æ·±ããªãã·ã§ã³ã®å«ç ãã°ãŒã°ã«ãã³ã¡ã³ãã®åŸãç§ã¯ãŸã æå¹ãªãªãã·ã§ã³ãéžã³ãŸããã
å ±åæž
ã¡ããªãã¯ãåéãããã®ã§ãããŠã³ããŒãããŠè¡šç€ºããå¿ èŠããããŸãã ããã«ã¯ãŸã å€ãã®äŸ¿å©ãªæ©èœããããŸãããä»ã®ãšããã¯åçŽã«çŸããã°ã©ãã®ããã«ãããæªçšããŠããŸãã æåã®ã¢ã»ã³ããªã®åã«ããã®ãããªã¬ããŒããã¡ã€ã«ã¯ååšããªããšèšãããŸãããããã¯æãããšã§ã¯ãããŸããã
ãPublish JUnit test result reportããå«ããŸããJUnitã§ã¯ãããŸããããnosetests ** / reports / tests.xmlã瀺ããŸããããã¯ããreportsãã£ã¬ã¯ããªã®ã«ã/ãžã§ãã®ã«ãŒãããããšããæå³ã§ãã
次ã®é ç®ã¯ãéåã®å ±åãã§ãããããã«ã¯ãã€ãªã³ãããããŸãã ãã£ãŒã«ãã®ååããXMLãã¡ã€ã«åãã¿ãŒã³ãã§ãããpylintãéxmlãçæããªããšããäºå®ã«ãããããããç§ãã¡ã¯ãŸããå人ã¬ã³ãŒãã§ããããªéçºè ã®ã³ââãŒããæ¹å€ããããããæ¹æ³ã§pep8ãšãã¢ãªã³ã°ãããã¡ã€ã«** / reports / pylint.reportã瀺ããŸãã æšæ¥æžãããã®ãèŠããŠãããšããŠããæã«ãªã£ãŠä»äºã«åãæããã®ã«å€§ãã«åœ¹ç«ã¡ãŸããç§ã¯æ¥ãŠãéåã®ã¹ã±ãžã¥ãŒã«ãèŠãŠãä¿®æ£ããŸããã
ããŠãæåŸã ã** / reports / coverage.xmlãã®ãCobertura Coverage Reportã®å ¬éãã Coberturaãäœã§ãããã¯ããããŸããããPythonã«ãã¬ããžã®åœ¢åŒãæ£ããç解ããŠããŸãã
ãã€ãªã³ããšã«ãã¬ããžã䜿çšãããšãã倩æ°ãã®å¢çãèšå®ã§ããŸããããã¯ãããžã§ã¯ãã®å šäœçãªç¶æ ã«åœ±é¿ããŸãã ããã©ã«ãå€ãé©åããããã§ãã
ã³ãŒããŒã¯èªãé«ãé³¥ã§ã-蹎ããªãã§ãé£ã³ãŸãã
æåŸã«ãé»åã¡ãŒã«ãšãžã£ããŒã«ããéç¥ãããã奜ã¿ã«åãããŠã«ã¹ã¿ãã€ãºã§ããŸãã çµ±åãµãŒããŒã®ã¡ã€ã³æ§æãµãŒããŒã§æåã«æ§æããå¿ èŠãããã®ã¯ããã以å€ã®å Žåã¯æ©èœããŸããã
è¡ããŸããã
èšå®ãèšé²ãããã¢ã»ã³ããªã«éä¿¡ã§ããŸãã [ä»ãããã«ã]ãã¿ã³ã䜿çšããŠæåã§å®è¡ããããã³ãããããŠã«ãã«äœããããã·ã¥ããŸãã ãã«ãå±¥æŽã®ãµã€ãããŒã®äžéšã«ãæ°ããã¿ã¹ã¯ãšé²è¡ç¶æ³ã¹ã©ã€ããŒã衚瀺ãããŸããã¯ãªãã¯ãããšãçŸåšã®ãã«ãã®ãã³ã³ãœãŒã«åºåãã»ã¯ã·ã§ã³ã«ç§»åããã©ã€ããèŠãããšãã§ããŸãã ãã¹ãŠãçµäºãããšãã¹ããŒã¿ã¹ã«ããããçš®é¡ã®ãã®ã衚瀺ãããŸãã
ããŒãã¹ïŒ
venvãåäœæãããã³ã«ãpypiã䜿çšããŠãã¹ãŠã®ã¢ãžã¥ãŒã«ãããŠã³ããŒããããéåžžã«é·æéå®è¡ãããŸãã ãŸãã亀éã§ãã å°ãæ€çŽ¢ããåŸãpypi Collective.eggproxyã§ãpypi.python.org / simpleãæš¡å£ãããã£ãã·ã¥ãããã·ãªããžããªãèŠã€ããŸããã `eggproxy_run`ã®ããã«å§ãŸããŸãã å©ãããªããããã©ã«ãã§ã¯ããã¹ãŠã/ var / wwwã«å ¥ããŸãããããã¯è¯ããããŸããã ãµã€ãã®ããã¯ãèªãã åŸãèšå®ãã¡ã€ã«ãäœæããŠãã¹ãšããŒããèšå®ããæ¹æ³ãåŠç¿ã§ããŸãã ãŸããæªéã«ãããããªãã£ãã®ã§ããžã§ã³ãã³ã¹ãç£ç£è ã®è ã«éãããåŸã
buildenv.shã¯ããã®ãããã·ã®ååš/äžåšã«é©å¿ããããã«ãã§ã«ãã¬ãŒãã³ã°ãããŠããŸããããã§ã¯ãã¹ãŠãç°¡åã§ãã
ã¯ã¬ãžãã
kmmbvnr @ ljïŒãã¹ããéå§ããŠæ¥œããæ¹æ³ ã Jenkinsãšã®çµ±åã«å ããŠã django-anyã説æãããŠããŸãã ãã¹ãŠã®dzhangistsãèªãã§äœ¿çšããããšã匷ããå§ãããŸãã
Hudsonã䜿çšããŠpython CIãµãŒããŒãã»ããã¢ããããããšã¯ãæ£ãã解éãããŒã¹ã«ããææ°ã®æçš¿ã§ããããã®è§£éã«åºã¥ããŠããŸãã
ãããžã§ã¯ãã®ãã¹ãã§ãã WSGIã¢ããªã±ãŒã·ã§ã³ã®åçŽãªã©ãããŒã䜿çšãããŸãã ãããã«ããã WSGIã³ã³ãããŒãªãã§ãã¹ããšãããã°ãå¯èœã«ãªããäžå¿ èŠãªhemoã®ãªããã©ãŠã¶ãŒã§ã®æåäœæ¥ãå¯èœã«ãªããŸããã