使用Hudson打造你專屬軟體建構機器人嵌藝創研軟體科技簡茂仰http://www.esast.com
11年8月1日星期⼀一
我是誰??
• MaoYang/茂仰
• 曾任某職於機械自動化公司• 專長: 專案管理/軟體開發
• 軟體開發團隊心得分享粉絲專頁板主
• 嵌藝創研軟體科技Co-Founder, 主要業務CodeBeamer代理與應用 http://cb.esast.com
11年8月1日星期⼀一
Agenda
• Why Hudson??
• 故事起點:工程師10大藉口第⼀一名
• eXtreme Programming
• 什麼是CI??
• 開始使用Hudson
• 開始使用Hudson/⼀一個簡單的Java建構與自動單元測試範例
• Hudson實務與技巧
11年8月1日星期⼀一
為什麼要使用Hudson來建構軟體??
我會用Eclipse/NetBean編譯軟體
11年8月1日星期⼀一
在我的機器明明就可以動啊!
程式設計師常見藉口第⼀一名
來源
11年8月1日星期⼀一
實際案例
• A工程師可以編譯成功, B工程師卻失敗
• 專案快結案了, 所有的code⼀一起編譯後, Bug解不完-->專案Delay元兇之⼀一
11年8月1日星期⼀一
Yes, We can Change
11年8月1日星期⼀一
解決方案?
11年8月1日星期⼀一
你的團隊需要⼀一個標準的自動持續整合伺服器
解決方案?
11年8月1日星期⼀一
兩個極端的案例XD
11年8月1日星期⼀一
兩個極端的案例XD
11年8月1日星期⼀一
兩個極端的案例XD
11年8月1日星期⼀一
兩個極端的案例XD
林董內心OS:請款還是自己簽名11年8月1日星期⼀一
為什麼選Hudson??
• 使用Java開發
• 海(Hudson)能納百川(Plugins), 故能成其大
• 視覺化報表• 跨OS Build Farm支援
11年8月1日星期⼀一
什麼是持續整合(CI)?
11年8月1日星期⼀一
什麼是持續整合(CI)?
需求/變更
11年8月1日星期⼀一
什麼是持續整合(CI)?
需求/變更
11年8月1日星期⼀一
什麼是持續整合(CI)?
寫程式
需求/變更
11年8月1日星期⼀一
什麼是持續整合(CI)?
寫程式
需求/變更
11年8月1日星期⼀一
什麼是持續整合(CI)?
寫程式
編譯與單元測試
需求/變更
11年8月1日星期⼀一
什麼是持續整合(CI)?
寫程式
編譯與單元測試
需求/變更
11年8月1日星期⼀一
什麼是持續整合(CI)?
寫程式
編譯與單元測試 測試
需求/變更
11年8月1日星期⼀一
什麼是持續整合(CI)?
寫程式
編譯與單元測試 測試
需求/變更
11年8月1日星期⼀一
什麼是持續整合(CI)?
寫程式
編譯與單元測試 測試
問題回饋
需求/變更
11年8月1日星期⼀一
什麼是持續整合(CI)?
寫程式
編譯與單元測試 測試
問題回饋
需求/變更
11年8月1日星期⼀一
什麼是持續整合(CI)?
寫程式
編譯與單元測試
重構/解Bug
測試
問題回饋
需求/變更
11年8月1日星期⼀一
什麼是持續整合(CI)?
寫程式
編譯與單元測試
重構/解Bug
測試
問題回饋
需求/變更
11年8月1日星期⼀一
什麼是持續整合(CI)?
寫程式
編譯與單元測試
重構/解Bug
測試
問題回饋
需求/變更
11年8月1日星期⼀一
什麼是持續整合(CI)?
寫程式
編譯與單元測試
重構/解Bug
測試
問題回饋
發佈
需求/變更
11年8月1日星期⼀一
什麼是持續整合(CI)?
寫程式
編譯與單元測試
重構/解Bug
測試
問題回饋
發佈
需求/變更
11年8月1日星期⼀一
什麼是持續整合(CI)?
寫程式
編譯與單元測試
重構/解Bug
測試
問題回饋
發佈
需求/變更
11年8月1日星期⼀一
eXtreme Programming
1. 規劃遊戲2. 小量發行
3. 簡單的設計4. 測試
5. 持續性的整合-Continuous Integration
6. 重整
7.雙人組程式設計
8.程式碼共有
9.每週工作40小時10.客戶隨時在旁
11.隱喻 12.程式碼標準
11年8月1日星期⼀一
導入CI的等級
11年8月1日星期⼀一
導入CI的等級沒有CI伺服器
LEVEL 1
11年8月1日星期⼀一
導入CI的等級沒有CI伺服器
LEVEL 1
每天排程BuildLEVEL 2
11年8月1日星期⼀一
導入CI的等級沒有CI伺服器
LEVEL 1
每天排程BuildLEVEL 2
Build & 單元測試LEVEL 3
11年8月1日星期⼀一
導入CI的等級沒有CI伺服器
LEVEL 1
每天排程BuildLEVEL 2
Build & 單元測試LEVEL 3
源碼靜態解析與度量LEVEL 4
11年8月1日星期⼀一
導入CI的等級沒有CI伺服器
LEVEL 1
每天排程BuildLEVEL 2
Build & 單元測試LEVEL 3
源碼靜態解析與度量LEVEL 4
建構參數化與Matrix建構LEVEL 5
11年8月1日星期⼀一
導入CI的等級沒有CI伺服器
LEVEL 1
每天排程BuildLEVEL 2
Build & 單元測試LEVEL 3
源碼靜態解析與度量LEVEL 4
建構參數化與Matrix建構LEVEL 5
可接受測試與GUI自動測試LEVEL 6
11年8月1日星期⼀一
導入CI的等級沒有CI伺服器
LEVEL 1
每天排程BuildLEVEL 2
Build & 單元測試LEVEL 3
源碼靜態解析與度量LEVEL 4
建構參數化與Matrix建構LEVEL 5
可接受測試與GUI自動測試LEVEL 6
持續佈署LEVEL 7
11年8月1日星期⼀一
開始使用Hudson
• java -jar hudson.jar --httpPort=9090
11年8月1日星期⼀一
Demo網路架構
11年8月1日星期⼀一
Hudson 使用流程• 設定Hudson編譯環境
• 撰寫Build Script
• 新增Build Jobs
• 設定SCM連接->SVN/Git/Mercurial
• 設定Build Target
• 手動測試• 檢視Build報告
11年8月1日星期⼀一
設定Hudson編譯環境
• JDK
• ANT or Maven
11年8月1日星期⼀一
JDK
11年8月1日星期⼀一
ANT
11年8月1日星期⼀一
開發者端的準備
• 為專案寫Build Script , 例如Ant
• 將專案與Build Script push到SCM Server
Junit原理與範例可參考http://caterpillar.onlyfun.net/Gossip/JUnit/index.html
11年8月1日星期⼀一
Demo ANT Target 說明
• ant test 編譯與單元測試
• ant reports 編譯,單元測試,與產生單元測試xml報表檔案
11年8月1日星期⼀一
設定SCM Plugin
• Hudson已經內建CVS/SVN/Git等Plugin
11年8月1日星期⼀一
安裝報表Plugins
• JUnit-已內建
11年8月1日星期⼀一
新增Job
11年8月1日星期⼀一
新增Job選用Free-Style
software project
11年8月1日星期⼀一
設定SCM
11年8月1日星期⼀一
執行Build Job
11年8月1日星期⼀一
設定JUnit報表
11年8月1日星期⼀一
手動測試
11年8月1日星期⼀一
排程例如, 如果要設定每天凌晨⼀一點零分開始執行Build Job, 可以設定如下0 1 * * *
11年8月1日星期⼀一
什麼時候Build會啟動??
• 排程• 外部程式驅動-> scm hook
• ⼀一個Build Job完成後驅動另⼀一個Build Job
• 手動
11年8月1日星期⼀一
Build報表檢視
11年8月1日星期⼀一
實機操作Demo
11年8月1日星期⼀一
恭喜你的CI等級已經達到Level 3
11年8月1日星期⼀一
測試覆蓋率??
11年8月1日星期⼀一
Ant +JUnit+Cobertura
• 使用Ant在Hudson端必須設定Cobertura的Ant Task 與 Junit Ant Task 請參考http://cobertura.sourceforge.net/ &http://caterpillar.onlyfun.net/Gossip/JUnit/index.html
11年8月1日星期⼀一
Cobertura Plugin
• 安裝Cobertura Plugin
11年8月1日星期⼀一
Cobertura Plugin
• 安裝Cobertura Plugin安裝Plugin後
Hudson必須重新啟動
11年8月1日星期⼀一
設定Cobertura報表
11年8月1日星期⼀一
完整的範例與安裝http://cb.esast.com/cb/wiki/34766
11年8月1日星期⼀一
Hudson實務與技巧
11年8月1日星期⼀一
選擇版本控制伺服器
• CVS : 不建議使用
• Subversion
• Git
• Mercurial
11年8月1日星期⼀一
選擇版本控制伺服器
• CVS : 不建議使用
• Subversion
• Git
• Mercurial支援Change Set更新較快
11年8月1日星期⼀一
Polling or Trigger
• Polling: 使用排程, 當要快速回饋時, Build間隔時間必須縮短-對Server or 網路負擔大
• Trigger: 當code commit, 使用Hook來驅動遠端Hudson的Build Job
11年8月1日星期⼀一
Polling or Trigger
• Polling: 使用排程, 當要快速回饋時, Build間隔時間必須縮短-對Server or 網路負擔大
• Trigger: 當code commit, 使用Hook來驅動遠端Hudson的Build Job
http://SERVER/hudson/job/PROJECTNAME/build
11年8月1日星期⼀一
Build Script選擇
• Ant: 簡單易入門
• Maven: 對於套件的相依性管理佳
• Groovy : 要使用較複雜的Build邏輯, 撰寫較簡單
11年8月1日星期⼀一
版本資訊同步
• 每次的Build要將Version的資訊寫入產出的Build
• 在軟體的介面可以看出Build的版本資訊
11年8月1日星期⼀一
版本不⼀一致的案例
11年8月1日星期⼀一
Build版本顯示
<target name="version"> <typedef resource="com/googlecode/svntask/svntask.xml"> <classpath> <fileset dir="/usr/share/ant/lib"> <include name="svnkit.jar"/> <include name="svntask.jar"/> </fileset> </classpath> </typedef> <svn><info path="." revisionProperty="revisionVersion" /></svn> <property name="version" value="${revisionVersion}" /> <echo>Version:${version}</echo> <propertyfile file="${plugin.install.dir}/data/resources/buildrevision.inc"> <entry key="BuildRevision" value="${version}" /> </propertyfile> </target>
11年8月1日星期⼀一
Build失敗通知
• MSN
圖片來源 :https://wiki.jenkins-ci.org/display/JENKINS/Hudson+Build+Status+Lava+Lamps
11年8月1日星期⼀一
源碼品質與Code Review
• FindBugs
• PMD
• CPD
• CheckStyle
11年8月1日星期⼀一
PMD
11年8月1日星期⼀一
FindBugs
11年8月1日星期⼀一
Build產出發佈
• Build好的檔案可以自動發佈到FTP Server
• Build的檔案最好與Release report放在⼀一起
• 自動Deploy到測試環境, 例如JBoss有專屬的佈署Plugin
11年8月1日星期⼀一
Build Job切割
• Hudson有支援Build Job關連
• 較費時的Build(源碼分析)建議切割參考 http://wiki.hudson-ci.org/display/HUDSON/Splitting+a+big+job+into+smaller+jobs
11年8月1日星期⼀一
Master/Slave架構
• 專案要支援⼀一種以上OS, 可使用Master/Slave架構
11年8月1日星期⼀一
參數化建構
• 指定要Build那⼀一個Tag(SVN tag or Git tag)
11年8月1日星期⼀一
Matrix Build
• 同⼀一份程式碼要在不同的JDK版本測試
• 同⼀一份程式碼要在不同的OS測試
• 同⼀一份程式碼要在不同的DB測試
1.6 1.5
Win Pass Fail
Linux Pass Pass
11年8月1日星期⼀一
Hudson整合經驗分享
11年8月1日星期⼀一
網路架構
11年8月1日星期⼀一
使用Groovy+Ant
11年8月1日星期⼀一
建構版本資訊
11年8月1日星期⼀一
電子看板
11年8月1日星期⼀一
電子看板
11年8月1日星期⼀一
CI 要如何導才能成功??
11年8月1日星期⼀一
配合開發流程
• Scrum的Daily Stand Up meeting
• 每天要修復失敗的Build
11年8月1日星期⼀一
記得CC主管
11年8月1日星期⼀一
記得CC主管
老闆支持很重要!
11年8月1日星期⼀一
持續整合的精神是不斷的進步與改進, 今天只是開始
11年8月1日星期⼀一
Thank You for your Joining
11年8月1日星期⼀一