1. 程式人生 > >搭建hudson/jenkins+cppcheck+cpplint+cccc持續整合環境

搭建hudson/jenkins+cppcheck+cpplint+cccc持續整合環境

1 Jenkins介紹

Jenkins是基於Java開發的一種持續整合工具,Hudson是它的前身。Jenkins用於監控程式重複的工作,包括:

1、持續的軟體版本釋出/測試專案。

2、監控外部呼叫執行的工作。

l  Jenkins的特性

1、易於安裝-只要把jenkins.war部署到servlet容器,不需要資料庫支援。

2、易於配置-所有配置都是通過其提供的web介面實現。

3、整合RSS/E-mail/IM-通過RSS釋出構建結果或當構建失敗時通過e-mail實時通知。

4、生成JUnit/TestNG測試報告。

5、分散式構建支援-Jenkins能夠讓多臺計算機一起構建/測試。

6、檔案識別- Jenkins能夠跟蹤哪次構建生成哪些

jar,哪次構建使用哪個版本的jar等。

7、外掛支援-Jenkins可以通過外掛擴充套件,你可以開發適合自己團隊使用的工具。

2準備

²  JDK安裝包((jdk-8u11-windows-i586_14459_BDdl.exe)

²  tomcat安裝包(apache-tomcat-8.0.15.exe)

²  jenkins war包或hudson war包(jenkins.war)

²  VC或者visual studio(VS2013_RTM_ULT_CHS.iso)

²  cppcheck安裝包(cppcheck-1.68-x86-Setup.msi)

²  cccc安裝包(CCCC_3.1.4_setup.exe)

²  python2.7安裝包(python-2.7.msi)

²  cpplint.py

注:cpplint 必須在python2.7下執行

3安裝

3.1安裝JDK

1.安裝:雙擊執行exe,按照提示安裝即可。

2.配置環境變數

3.驗證是否安裝成功:點選“開始”->“執行”,輸入“cmd”進入命令列介面,打入“java -version”,如果安裝成功將會顯示所安裝的版本。

3.2安裝Apache

1.安裝:一路預設安裝即可。

2配置:修改配置為開機自啟動:找到 Configure Tomcat,修改啟動型別為“自動”,並確定。

3.驗證是否安裝成功:在瀏覽器中輸入http://localhost:8080,顯示介面如下


 

3.3安裝Jenkins

將war包放在tomcan安裝路徑下的webapps目錄下。在瀏覽器中輸入http://localhost:8080/jenkins(或http://localhost:8080/hudson),顯示介面如下:

建議使用Jenkins,Hudson-3.2.1 warning外掛不能很好的整合cpplint結果。

3.4安裝VC或visual studio

建議通過DAEMON Tools Lite安裝visual studio。

3.5安裝cppcheck

建議直接安裝在C盤下或c:\cppcheck目錄下。

3.6安裝cccc

建議直接安裝在C盤下或c:\cccc目錄下。

3.7安裝python2.7

預設安裝即可。

4外掛安裝

jenkins的好用基本體現在其眾多而強大的外掛上,在“系統管理”中可以找到“外掛管理”,為了更好的使用jenkins,還需要安裝一些外掛,在“可選外掛”中進行選擇,本文中建議安裝以下外掛:

² :從控制檯或本地檔案中讀取警告資訊並生成報告

² Email Extension Plugin:如果希望部署完成後能將結果以郵件的形式進行

通知,可以安裝該外掛

 jenkins支援兩種方式的外掛安裝,一種是線上自動安裝。另一種是本地手動安裝。安裝完外掛需要重新啟動jenkins。即關閉tomcat服務,再啟動。

4.1.線上自動安裝

點選【系統管理】,再點選【管理外掛】。在【Available】選項卡里選擇想要安裝的外掛。

點選下面的install 然後等一段時間

顯示打勾的狀態就是這個外掛已經安好了

如果外掛太多,可以通過Search找到想要安裝的外掛。

4.2本地手動安裝

手動將外掛下載到本地,然後點選【系統管理】,再點選【管理外掛】。在【高階】選項卡里上傳外掛,然後點選Upload

如果是jenkins,也可將hpi檔案拷貝至jenkins home目錄下的WEB-INF/plugins目錄下。

5全域性配置

jenkins的總體配置,都是在“系統管理”中進行配置的,hudson“系統管理”提供瞭如下功能:

l系統設定

全域性設定&路徑,這是jenkins最核心的功能,jdkantmavenscp,郵件等等,都是在這裡設定的。

l讀取設定

放棄當前記憶體中所有的設定資訊並從配置檔案中重新讀取,僅用於當您手動修改配置文件時重新讀取設定。

l管理外掛

新增、刪除、禁用或啟用Hudson功能擴充套件外掛。

l系統資訊

顯示系統環境資訊以幫助解決問題。該功能會列出系統屬性,環境變數以Plugins資訊。

l系統日誌

系統日誌從java.util.logging 捕獲Hudson相關的日誌資訊。

l負載統計

檢查您的資源利用情況,看看是否需要更多的計算機來幫助您構建。

lHudson CLI 

從您命令列或指令碼訪問或管理您的Hudson

感興趣的話可以通過命令列嘗試一下

l指令碼命令列

執行用於管理或故障探測或診斷的任意指令碼命令。這就是Groovy scripts

l管理節點

新增、刪除、控制和監視系統執行任務的節點。

l管理使用者

建立/刪除/修改Hudson使用者,系統的登入使用者都是在這裡建立的。

l準備關機

停止執行新的構建任務以安全關閉計算機

全域性設定中很多是我們用不到的,這裡只介紹安全設定和郵件設定。

5.1郵件通知

1. 點選系統管理,選系統設定

 

2. 最後一項——郵件通知,填入以下資訊,注,系統管理員郵件地址是事先申請的一個郵箱,相當於郵件中轉站的作用,每次專案build後都會從這個中轉站發郵件到專案相關人員的郵箱中。Hudson URL可以使http://127.0.0.1:8080,也可以是http:localhost:8080,貌似也可以用自己的ip地址,但是如果用自己的ip的話別人就進不來了,不曉得我的這個理解有誤沒。

點選advanced,勾選使用SMTP認證,將中轉站郵箱賬號及密碼填入,且smtp埠為25,charset值按系統預設不變。點選用系統管理員測試郵件設定,若設定成功,該郵箱會收到一封系統確認郵件。


3. 系統郵件設定弄好後就可以去設定單個專案的郵件設定,因為每個專案的人員是非固定的,所以需要對該專案人員設定郵箱,只有該專案人員才能收到該專案的相關郵件。

選中要設定的專案,點選設定,勾選EditableEmail Notification,將專案相關人的郵箱錄入,用逗號分開。點save。

 


4. 可能還需要下載郵件的外掛才能正常執行,因此,需要在系統管理中選中管理外掛,找到


點選安裝

5. 回到專案設定中,在Editable Email Notification,下面勾選無論build失敗還是成功都要傳送郵件給專案相關人員,去掉send tocommitters的選項,且add a trigger全選:select。

點save儲存。

 6. 至此,jenkins郵件設定完成,

回到專案,點選立即構建,無論成功或失敗都會有郵件傳送到專案組成員的郵箱中,說明郵件設定成功。

5.2安全設定

1.在系統管理中的系統設定有一項:啟用安全,選中它,並在hudson專有使用者資料庫中勾選允許使用者註冊這一選項,表明系統允許新增使用者,若去掉這個勾選,則說明系統不允許使用者註冊。

 2. 緊接其後的是授權策略,選中安全矩陣,在新增使用者/組後面填入要註冊的使用者的名字,如Leanna,點選新增,則該使用者就在使用者/組的列表中了,但此時並沒有註冊成功。可根據實際需要勾選該使用者的使用許可權,是最高許可權還是隻讀只寫,可勾選。最後點save。

 


3. 可先退出之前的登陸使用者,右上角

4. 點選新建賬戶create anaccount

5. 填入相關資訊

6. 因為之前已經有註冊過這個賬號,所以這個名字不能用了,可換其他的比如Amy,註冊成功後會有郵件傳送至該人員的電子郵箱。

 

3. 專案相關人員都註冊好了之後就可取消允許使用者註冊這一選項,以避免其他非專案相關人員進來。

 

6新建job

6.1建立一個Jenkins作業。

1.點選新建任務連結。建立一個自由風格的軟體專案,輸入任務名稱

 

6.2 Jenkins任務的基本配置

Discard OldBuilds選項配置如何拋棄舊的構建。如果每次構建相關的檔案都儲存下來,磁碟空間將被漸漸消耗光。Hudson為此提供了兩種方式讓使用者選擇保留哪些構建任務的相關檔案:

1) Days to keep builds:如果其值為非空的N,就僅保留N天之內的構建檔案。

2) Max # of builds to keep:如果#非空,就僅保留最多#個最近構建的相關檔案。

如:保留10個最近的構建,在Max # of buildsto keep一欄中輸入“10”即可。


6.3設定工作目錄

點選 “Advanced Job Options”下的“Advanced...”按鈕,選中“Use custom workspace”,設定Directory為我們的工作目錄(例如我設定為E:\Hudson\mytest)。


6.4 Jenkins任務的原始碼倉庫配置

在專案配置頁面Source CodeManagerment部分,選擇Subversion,然後在Repository URL文字框中輸入專案的Subversion倉庫地址(如:svn://127.0.0.1/account/trunk)

然後單擊entercredential填寫配置倉庫的認證資訊。


在上圖紅色警告部分,點選【enter credential】輸入使用者名稱密碼。

 

6.5 Jenkins任務的構建觸發配置

Hudson 支援三種方式觸發構建:

1) Build after otherprojects are built:在其他專案構建完成後構建本專案。

2) Buildperiodically:週期性的構建本專案。

3) Poll SCM:週期性的輪詢原始碼倉庫,發現有更新時構建本專案。

一般使用第三種。

 Hudson使用著名的 UNIX任務除錯工具Cron(http://en.wikipedia.org/wiki/Cron)所使用的配置方式來配置輪詢程式碼倉庫的頻率:用 5 個欄位表示不同的時間單位,欄位之間用空格分隔:分(0-59) 時(0-23) 日(1-31) 月(1-12)星期幾(0-7,0、7都表示週日)。

幾種特殊匹配符:

  1) * :匹配範圍內任何值

  2) M-N :匹配 M-N 範圍內任何值

  3) A , B , … , Z :逗號匹配多個值

  4) */X 或 M-N/X :範圍內能被 X 整除的

星期幾與日期是或的關係。

對於一個健康的專案,常見的做法是:每隔10分鐘輪詢程式碼倉庫,Schedule對應的配置為:*/10 * * * *。

可以用“#”在Schedule配置文字框中進行註釋。

6.6 Jenkins任務的構建配置

6.6.1構建編譯

1)單擊Build部分的Add build step,選擇Execute Windowsbatch command

2)然後輸入構建編譯命令,例如:

call "C:\ProgramFiles (x86)\Microsoft Visual Studio\VC98\Bin\VCVARS32.BAT"

msdev E:\Hudson\mytest\FtpClient.dsp /MAKE "FtpClient - DEBUG"

其中dsp是工程檔案,也可使用工作區檔案dsw,"FtpClient - DEBUG"中的FtpClient表示FtpClient編譯FtpClient工程。

注:也可將上述命令存成一個bat檔案,例如E:\Hudson\hudson.bat。其中hudson.bat內容為上述命令。構建命令就是檔案地址,即E:\Hudson\hudson.bat。

6.6.2 Cppcheck檢查

1)單擊Build部分的Add build step,選擇Execute Windowsbatch command

2)然後輸入靜態程式碼檢查命令,例如:

C:\Cppcheck\cppcheck.exe--enable=all --xml-version=2 e:\Hudson\mytest 2>E:\Hudson\mytest\cppcheck-result.xml 1>E:\Hudson\cppcheck.log

注:其中cppcheck-result.xml儲存的是cppcheck程式碼檢查結果。

6.6.3 CCCC檢查

1)單擊Build部分的Add build step,選擇Execute Windows batchcommand

 2)然後輸入靜態程式碼檢查命令,例如:

C:\CCCC\cccc.exeE:\Hudson\mytest\*.cpp --outdir=E:\Hudson\cccc--xml_outfile=E:\Hudson\mytest\cccc-result.xml 2>E:\Hudson\cccc.log注:其中cccc-result.xml儲存的是cppcheck程式碼檢查結果。

6.6.4 Cpplint檢查

1、檢查單個檔案

1)單擊Build部分的Add build step,選擇Execute Windows batchcommand

 2)然後輸入程式碼規範檢查命令,例如:

C:\Python27\python.exec:\cpplint\cpplint.py E:\Hudson\mytest\FtpClient.cpp  2>E:\Hudson\mytest\cpplint-result.xml

set errorlevel=0

注:因為cpplint的返回值會是1,所以重置下返回值。否則任務總顯示失敗

2、檢查整個目錄

如果要對目錄遍歷,對所有檔案都進行檢查,可以用另一個python來檢索然後調cpplint檢查。程式碼如下:

import os, fnmatch, sys 

def all_files(root, patterns = '*', single_level = False,yield_folders=False): 

        patterns = patterns.split(';') 

        for path, subdirs, files in os.walk(root): 

            if yield_folders: 

               files.extend(subdirs) 

            files.sort() 

            for name in files: 

                for pattern in patterns: 

                    if fnmatch.fnmatch(name, pattern): 

                        yield os.path.join(path,name) 

                        break 

            if single_level: 

                break 

if __name__ == '__main__': 

        if len(sys.argv) <2: 

            print 'Please set theabsolute path as the first parameter for parse.' 

            sys.exit() 

        cmd="c:\cpplint.py"

        for path inall_files(sys.argv[1],'*.cpp;'):

            cmd=''.join([cmd,path])

        os.system(cmd) 

程式碼另存為lintfordir.py,

1)單擊Build部分的Add build step,選擇Execute Windows batchcommand

 2)然後輸入程式碼規範檢查命令,例如:

C:\Python27\python.exec:\lintfordir.py E:\Hudson\mytest\ 2>E:\Hudson\mytest\cpplint-result.txt

seterrorlevel=0

6.7 釋出結果

每次執行完任務以後將檢查結果釋出,生成的報告進行彙總。

6.7.1 CCCC報告

1)選中Post-build Actions下的Publish CCCC report

2)輸入cccc 報告檔名,注意,這裡需要使用相對路徑,basedir是工作目錄,例如這裡的basedir是E:\Hudson\mytest,結果儲存在E:\Hudson\mytest下,所以輸入檔名cccc-result.xml。

6.7.2 Cppcheck報告

1)選中Post-build Actions下的Publish Cppcheck results

2)輸入Cppcheck報告檔名,注意,這裡需要使用相對路徑,basedir是工作目錄,例如這裡的basedir是E:\Hudson\mytest,結果儲存在E:\Hudson\mytest下,所以輸入檔名cppcheck-result.xml

6.7.3 Cpplint報告

1)選中Post-build Actions下的Scan for compiler warnings

2)在Scan workspace files下File pattem中輸入cpplint報告檔名,注意,這裡需要使用相對路徑,basedir是工作目錄,例如這裡的basedir是E:\Hudson\mytest,結果儲存在E:\Hudson\mytest下,所以輸入檔名cpplint-result.xml

3)Parser選擇Cpplint

6.8配置郵件

勾選【Editable Email Notification】,【Global Recipient List】裡填寫郵件的抄送地址。然後點選【Add a Trigger】增加【Unstable】和【Fixed】。那麼就會在構建失敗,不穩定和恢復正常的時候傳送郵件。

展開【expand】,可以定製每次構建以後,狀態分別是失敗,不穩定,恢復的時候傳送郵件的模板。例如:

6.9儲存

點選【save】按存設定。不久就會自動執行構建。也可手動點選【立即構建】。

備註:

1、定時檢測,構建

Buildperiodically:(定期構建)此選項 (也是使用定時作業表示式)僅僅通知Hudson按指定的頻率對專案進行構建,而不管SCM是否有變化。我這個作業就屬於目標測試環境是按某種方式定期修訂的而SCM卻是靜態的情況。如果您想在這個作業中執行一些測試用例的話,它可能就很有幫助。

PollSCM:這是CI 系統中常見的選項。當您選擇此選項,您可以指定一個定時作業表示式來定義Hudson每隔多久檢查一下您原始碼倉庫的變化。如果發現變化,就執行一次構建。例如,表示式中填寫0,15,30,45 * * * *將使Hudson每隔15分鐘就檢查一次您原始碼倉庫的變化。

舉例:

Poll SCM:定時檢查原始碼變更(根據SCM軟體的版本號),如果有更新就checkout最新code下來,然後執行構建動作。我的配置如下:

*/5 ** * *  (每5分鐘檢查一次原始碼變化)

Buildperiodically:週期進行專案構建(它不care原始碼是否發生變化),我的配置如下:

0 2 ** *  (每天2:00 必須build一次原始碼)

 2、cppcheck介紹

 cppcheck 是一個靜態程式碼檢查工具,支援c, c++ 程式碼;作為編譯器的一種補充檢查,只檢測那些編譯器通常無法檢測到的bug型別。cppcheck對產品的原始碼執行嚴格的邏輯檢查。執行的檢查包括:
   1.  自動變數檢查
   2.  陣列的邊界檢查
   3.  class類檢查
   4.  過期的函式,廢棄函式呼叫檢查
   5.  異常記憶體使用,釋放檢查
   6.  記憶體洩漏檢查,主要是通過記憶體引用指標
   7.  作業系統資源釋放檢查,中斷,檔案描述符等
   8.  異常STL 函式使用檢查
   9.  程式碼格式錯誤,以及效能因素檢查

示例:

C:\Cppcheck\cppcheck.exe --enable=all--xml-version=2 e:\Hudson\mytest 2>E:\Hudson\mytest\cppcheck-result.xml 1>E:\Hudson\cppcheck.log

1:一般輸出如Checking e:\Hudson\mytest\FtpClient.cpp..

2:檢查的錯誤輸出

<errorid="purgedConfiguration" severity="information"msg="The configuration &amp;#039;APSTUDIO_INVOKED&amp;#039; wasnot checked because its code equals another one." verbose="Theconfiguration &amp;#039;APSTUDIO_INVOKED&amp;#039; was not checkedbecause its code equals another one.">

           <location file="FtpClient.cpp" line="0"/>

3、CCCC介紹

cccc( C and C++ Code Counter),檢查c/c++程式碼複雜度的工具

C:\CCCC\cccc.exe E:\Hudson\mytest\*.cpp --outdir=E:\Hudson\cccc--xml_outfile=E:\Hudson\mytest\cccc-result.xml 2>E:\Hudson\cccc.log

會產生html和xml兩種格式的檢查輸出

4、cpplint介紹

cpplint是一個python指令碼cpplint.py,是google推出的C++編碼規範檢查工具。

常見問題:

1.如果是xp系統,解析cppcheck report時可能出現javax.xml.bind.UnmarshalException的問題。

解決辦法:將cppcheck檢查語句改為:

C:\Cppcheck\cppcheck.exe --enable=all --xml--xml-version=2 --errorlist e:\Hudson\mytest  >E:\Hudson\mytest\cppcheck-result.xml

2.如果涉及工作區dsw,且工作區中包含多個專案,可用編譯命令(舉例):

msdevE:\Hudson\mytest\FtpClient.dsw /MAKE "ALL - DEBUG"

其中FtpClient.dsw為工作區檔案,ALL表示表示所有工程,也可指定編譯單個工作,例如有工程Client,可指定為msdev E:\Hudson\mytest\FtpClient.dsw /MAKE "Client -DEBUG"

3.如果jenkins中要構建cppchek等report,可將報告儲存在workspace中,將svn中的Local module directory設定為check out目錄,就不至於將report與開發程式碼混在一起。

(jenkins中若設定workspace,則workspace為job根目錄)

4.若要使用svn ci將原始碼提交,可下載subversion至本地,然後在windows batch command中輸入命令:

"C:\Program Files (x86)\Subversion\bin\svn.exe" ci tt.txt -m"xpp"

5.若svn命令出現svn:E155036: 請參閱命令 'svn upgrade'的提示。

解決辦法:將本地subversion版本更新至與jenkins中subversion版本相同. jenkins中subversion版本在系統管理->系統設定->Subversion->Subversion Workspace Version中進行設定。

6.若cpplint檢查時出現錯誤:

UnicodeDecodeError: 'ascii' codec can'tdecode byte 0xe0 in position 0

解決辦法:在執行的python檔案中加入(即cpplint.py)

import sys
reload(sys)
sys.setdefaultencoding('gb18030')