環境準備 java
要能作好持續整合,首先就要先準備好 CI 服務器。這個服務器的環境,要儘量接近上線系統的環境;這樣咱們在作完建置和測試併發布程序後,才能確保它在正式上線時不會出問題。 python
CI 服務器也須要可以執行 Java ,由於接下來提到的 CI 平臺軟件須要透過 Java 來執行,因此也請你們先在 CI 服務器上安裝好 JDK 。 git
JDK安裝
先下載JDK1.6
我選擇安裝在/opt目錄裏
裝好以後,添加環境變量:
vi /etc/profile
在 export PATH USER ..... 這句代碼以前添加如下代碼 web
#================= JAVA_HOME=/opt/jdk1.6.0_27 PATH=$JAVA_HOME/bin:$PATH CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export JAVA_HOME PATH CLASSPATH #=============
而後 source /etc/profile shell
還有咱們也須要GIT。 flask
CI 平臺 瀏覽器
CI 服務器最重要的角色就是 CI 平臺了,兩個較爲有名的 CI 平臺: CruiseControl 及 Hudson 。而在多方比較及網絡上前輩的推薦之下,我選擇了 Hudson 這個建置容易並且設定也容易的 CI 平臺。 bash
由於 Oracle 申請了 Hudson 的商標,讓 Hudson 開發者決定把名稱改成 Jenkins ; 服務器
這裏提供兩種安裝及執行的方式: 網絡
1、透過支持 Servlet 的 Web Container 執行:
2、 不使用容器,直接執行
在OPT下創建 jenkins目錄,chown將目錄擁有者改成當前桌面用戶,將jenkins.war 放進去,而後創建一個啓動腳本start.sh
vi start.sh: 寫入: nohup java -jar jenkins.war --httpPort=8080 &
另其可執行: chmod 755 start.sh
而後就能夠啓動了: ./start.sh
關閉時:ps aux|grep java 找到當前進程 kill掉
注意:若是當前有任務正在構建中,而你不肯意等到構建結束就想kill,請先進入 系統管理->準備關機,而後再kill
啓動jenkins以前請肯定啓動jenkins的帳號可以訪問遠程git
初始化設置: 1.進入 「系統管理」->「系統設置」
找到 「JDK 安裝」 -> 新增 ->去掉 自動安裝的勾 -> 別名隨便(如 jdk1.6) -> java_home填你本身的
加入 Plugin 安裝好 Jenkins 後,其實它並不能立刻爲咱們工做,由於咱們必須先安裝一些必要的 Plugin 才行。
在「 Manage Hudson (管理 Jenkins ) 」的畫面上選擇「Manage Plugins (管理插件) 」,並點選「 Available (有效的) 」頁籤 ;接着找到如下 plugin ,勾選後按下最下方的「 Install (安裝) 」。
GIT plugin
Violations
Cobertura Plugin
envinject Plugin
安裝最後一個插件時,勾選 「當安裝成功而且沒有運行中的任務時重啓Jenkins」來使插件生效
若是鏈接插件庫失敗則插件列表就是一篇空白,就只好手工下載插件而後在「高級」裏面傳上去安裝
插件鏡像地址: http://mirrors.jenkins-ci.org/plugins/ 咱們上面的幾個插件: 1.http://mirrors.jenkins-ci.org/plugins/git/latest/git.hpi 2.http://mirrors.jenkins-ci.org/plugins/violations/latest/violations.hpi 3.http://mirrors.jenkins-ci.org/plugins/cobertura/latest/cobertura.hpi 4.http://mirrors.jenkins-ci.org/plugins/envinject/latest/envinject.hpi
裝完以後還須要裝一些命令行的支持程序,注意,須要裝在你的runtime的env裏:
pip install coverage //測試覆蓋率檢查 pip install unittest-xml-reporting //xml測試報告 pip install nose //測試相關 pip install pylint //代碼風格檢查 pip install clonedigger //重複代碼檢測
編寫測試用例模板
在setup.py所在目錄新建 tests 目錄(此處演示項目爲paster建立的一個python模塊,setup.py所在目錄即爲項目根路徑)
而後參考xclubs.pubsrv項目的tests,把裏面的兩個py文件複製過來修改(我把代碼貼在下面好了。。),把相應的模塊名替換爲你本身的
# -*- coding: utf-8 -*- #文件路徑tests/run.py """ xclubs.pubsrv unit test suite. Usage: python run.py """ import sys, os os.chdir(os.path.dirname(__file__)) _EXIT_FAILED = 1 _MODULE_NAME = 'xclubs.pubsrv' #xclubs.pubsrv這裏要改 try: import nose except ImportError: print ('nose is required to run the test suite') sys.exit(_EXIT_FAILED) try: sys.path.insert(0, '..') except ImportError: print ('can not find %s to test: %s' % (_MODULE_NAME, sys.exc_info()[1])) sys.exit(_EXIT_FAILED) else: print ('%s test suite running (python %s)...' % (_MODULE_NAME, sys.version.split()[0])) nose.main()
# -*- coding: utf-8 -*- #文件路徑tests/test_smssrv.py import unittest #from xclubs.pubsrv import sms #這裏要改,引用你須要測試的功能,如今已經註釋掉了,由於目前沒有任何可加載的包 class SmsTest(unittest.TestCase): def setUp(self): #初始化 self._phone = 15000000000 self._msg = 'test msg' #測試某一個具體的功能 def test_send(self): #測試發送短信的功能,目前沒有模塊,直接註釋掉 pass #there is no sms and send() ,so disable related line #self.assertEquals(sms.send(self._phone, self._msg),1) # 測試另外一個函數 # def test_another_method(self): # pass #
其中run.py用來運行全部測試腳本的,test_smssrv.py是具體測試某一組功能的,之後新建的測試用例均以test_開頭
而後把tests目錄的更改push到git
新建項目
點擊 「新job」 ->填寫項目名稱->選擇 「自由風格...」
「源碼管理」欄目:選「git」-> Repositories填入地址,如:
git@xcgti.com:xclubs.pubsrv.git
Branches to build填入你的feature分支,如:
origin/xclubs.pubsrv_20120607_sendsms
「構建環境」 欄目: 勾選 「Inject environment variables to the build process」 -> Properties Content 里加入:
PATH=/opt/pyenv/xclubs/bin:$PATH #/opt/pyenv/xclubs/bin即爲裝了flask等項目依賴包和剛剛裝了coverage等插件的env #若是你沒有使用virtualenv那就跳過此步驟
如下就是插件須要作的檢測,由shell實現 「構建」 欄目: 增長構建步驟 ->execute shell
第一個:運行測試用例,並生成報告
#!/bin/bash coverage run tests/run.py --with-xunit coverage xml echo "run unit test complete"
再添加一個:檢測代碼風格
其中xclubs.pubsrv 是某一個具體的包名,改成你本身的
#!/bin/bash pylint --rcfile scripts/pylintrc -f parseable --max-line-length=120 xclubs.pubsrv > pylint.txt echo "run pylint complete"
第三個:檢測重複代碼
xclubs是總的包名,改成你本身的
#!/bin/bash clonedigger --cpd-output -o clonedigger.xml xclubs echo "run clonedigger complete"
構建後操做
即構建以後,將檢測結果導出給jenkins使用
點擊 「add post-build action」->「Publish JUnit tests result report」->填入: **/tests/nosetests.xml ->勾選 「保留長的標準輸出/錯誤」
再點擊 「add post-build action」 -> 「Publish Cobertura Coverage Report」 ->
Cobertura xml report patter 填寫:**/coverage.xml
Source Encoding選擇 「UTF-8」
再點擊 「add post-build action」 -> 「Report Violations」 ->
cpd欄填寫:**/clonedigger.xml
pylint欄填寫:**/pylint.txt
Source encoding選擇:UTF-8
點擊保存
點擊你剛剛建的項目, 左側點 「當即構建」
左側的Build History裏出現以下的一次構建歷史
#1 2012-6-6 19:54:53 若構建結果爲藍色表示全經過,不然就有問題,具體可點進去查看「控制檯輸出」