git+jenkins/hudson+python構建環境

環境準備 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 執行:

  1. 安裝支持 Servlet 的 Web Container (例如 Apache Tomcat) 。
  1. 下載最新版 jenkins.war 地址:http://mirrors.jenkins-ci.org/war/latest/jenkins.war。
  1. 將 jenkins.war 放在 webapps 目錄中並啓動服務器。
  1. 在瀏覽器上開啓網址 http://127.0.0.1:8080/jenkins 看到 jenkins 的起始畫面時即安裝成功。

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 若構建結果爲藍色表示全經過,不然就有問題,具體可點進去查看「控制檯輸出」

相關文章
相關標籤/搜索