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”,如果安裝成功将會顯示所安裝的版本。
參考配置JDK環境變量.doc
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,還需要安裝一些插件,在“可選插件”中進行選擇,本文中建議安裝以下插件:
² Subversion Plug-in:支援Subversion作為配置伺服器
² Cppcheck Plug-in:使用其生成cppcheck報告
² CCCC Plugin:使用其生成cccc報告
² Warnings Plug-in:從控制台或本地檔案中讀取警告資訊并生成報告
² Violations plugin:生成靜态代碼檢查報告,
² 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最核心的功能,jdk,ant,maven,scp,郵件等等,都 是在這裡設定的。
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、定時檢測,建構
Build Triggers
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 &#039;APSTUDIO_INVOKED&#039; wasnot checked because its code equals another one." verbose="Theconfiguration &#039;APSTUDIO_INVOKED&#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')