構建持續集成平臺
-
背景
scrum的敏捷開發當中有很多促進項目推進的辦法和方案, 可以最大限度的利用開發人員有限的時間,但是只停留在管理 方式、交流溝通方式等組織實踐上面。一方面要快速迭代、快速容錯, 另一方面又要因為持續需要有產品構建,開發人員不得不每天 多次重復的構建代碼、測試代碼、部署代碼。
這一方面我們借鑒XP(什么是XP)中 的編程實踐手段,利用持續集成技術(什么是持續集成),測試驅動開發(TDD),結對編程 來支撐敏捷開發的項目推進。
-
索引
-
java篇
-
ios篇
-
android篇
-
選擇構建工具
我簡單總結了一下幾個開源持續集成工具(詳細的比較可以移步點我):
- Jenkins 使用java語言編寫 良好的插件環境,支持擴展
- Buildbot python語言開發的項目 已經為Mozilla、Webkit、Chromium所支持
- Travis 適合新手 提供Saas 接入github賬戶
- Strider 由node.js+javascript編寫 需要安裝mongodb和node.js 需要編寫腳本 上手困難
- Drone 開源的,支持各種語言的CI工具 但是你的項目必須是開源的 https://drone.io
綜上,公司項目中涉及到ios、android、java三種環境,并且代碼并不開 源,所以在持續構建工具中使用Jenkins再合適不過。此外Jenkins 有很好地擴展能力,有很健全的插件支持各種環境的代碼構建。 Jenkins本身是java實現,在tomcat中就能很好地運行, 這一點比較適合java出身的開發同仁。
-
java項目的自動化構建
在linux環境下安裝Jenkins有兩種方式:
1.
sudo java -jar jenkins.war –httpPort=18080 –ajp13Port=18009
2.
yum install jenkins
第一種方式下,如果你是SSH連接到linux主機,當你關閉連接的時候,這個命令也會被中斷;
第二種方式,是在CentOS系統中使用yum命令安裝(熟悉CentOS系統的人應該不陌生),安裝完成之后, Jenkins會成為系統中的一個service,只要在命令行執行
service jenkins start|stop|restart
就可以完成服務的啟動停止和重啟。配置文件路徑為:
/etc/sysconfig/jenkins
,可能需要root權限。配置文件中主要需要修改的是啟動 端口JENKINS_PORT
(默認是8080),使用jenkins的用戶JENKINS_USER
(默認生成一個jenkins)。 我這里的用戶是cms,端口是8818,JENKINS_USER=“cms”
JENKINS_AJP_PORT=“8819”sudo chown -R cms /usr/lib/jenkins
sudo chgrp -R cms /usr/lib/jenkins
sudo chown -R cms /var/log/jenkins
sudo chgrp -R cms /var/log/jenkins
sudo chown -R cms /var/lib/jenkins
sudo chgrp -R cms /var/lib/jenkins
sudo chown -R cms /var/cache/jenkins
sudo chgrp -R cms /var/cache/jenkins之后就可以啟動Jenkins了,執行命令
sudo service jenkins start
jenkins安裝好之后,首先需要確認你本地是否有:
Maven 負責編譯java代碼
Git 負責從代碼管理服務器中拉取最新提交的代碼
JDK 這個就不用說了,你沒有jenkins你也安裝不了好了,這里就不贅述以上工具的環境變量的配置了,一定要有。
打開Jenkins主界面,首先下載構建所需的插件,依次進入
系統管理
-管理插件
,下載:GIT plugin
Maven Integration plugin
Email Extension Plugin (對jenkins自帶郵件通知的擴展,可以自定義郵件模板)配置Jenkins
系統管理
-系統設置
這里主要是對maven、Git、JDK的路徑做一些配置
如果你下載了Email Extension Plugin插件,在系統配置中可以設置你想要的郵件通知屬性
系統配置之后,回到主界面,選擇
新建
,填寫Item名稱,選擇構建一個maven項目下一步,源碼管理中填入你拉取代碼的git地址,可以是HTTP協議,也可以是SSH。當然,如果是HTTP,要有 對應的用戶名和密碼;如果是SSH,用戶名和密碼是git版本管理所在的服務器主機的用戶名和密碼, 并且需要在git版本管理器所在服務器上添加ssh登錄的auto文件中添加公鑰 private key是jenkins所在主機的用戶私鑰。
構建觸發器中勾選
Build whenever a SNAPSHOT dependency is built
和Poll SCM
這樣構建的觸發器,會每三分鐘(H/3 * * * *)輪詢一遍你的代碼庫,只要你往git的develop 分支中commit代碼,Jenkins就會構建一次編譯使用的是maven,所以要確定到maven的pom文件和執行命令,如圖
添加構建后的動作,比如你希望執行什么shell、郵件通知到developer 或者管理員等
這里打包好的文件在你的Jenkins主目錄
/var/lib/jenkins
下地workspace里面,并且會保留 你每一次的構建代碼包,有關構建結束的部署工作,你可以自己寫shell腳本執行,也可以在pom文件中 寫有關tomcat的插件屬性,利用maven直接將代碼部署到tomcat的部署目錄下(其中也涉及到訪問權限 的問題,這里就不展開描述了)。回到主目錄,你的構建job會在job list中顯示,其中
S
的顏色用來區分你構建失敗還是成功, 藍色是成功,紅色是失敗;W
表示你最近幾次構建的情況除了自動觸發構建任務,你也可以手動計劃一次構建
下圖為每次測試結果的一個統計圖:
在變更記錄中,能看到每次構建中,提交了哪些代碼,commit的comments,誰提交的等等
更具體的構建信息可以查看Console Output ,如下圖:
讓我很舒服的是,當Jenkins自動構建完成之后,我會收到一個郵件提醒
最后,別讓你的系統誰都可以訪問,用戶權限在
首頁
->系統管理
->Configure Global Security
里配置。 -
ios項目的自動化構建
在Mac上安裝Jenkins比較方便,只要從官網上下載dmg安裝包就可以。
注意:如果你Mac上得JDK不是1.7+,安裝會失敗。
卸載Jenkins執行:
/Library/Application Support/Jenkins/Uninstall.command
安裝之后,Mac上會多出一個用戶:Jenkins,如果你想更改成為你的用戶來執行Jenkins,先停掉jenkins, 更改配置文件,再重啟jenkins服務(launchctl有點像linux的Service),如下執行:
sudo launchctl unload /Library/LaunchDaemons/org.jenkins-ci.plist
sudo vim +1 +/daemon +'s/daemon/staff/' +/daemon +'s/daemon/bixiaopeng' +wq org.jenkins-ci.plist
sudo launchctl load /Library/LaunchDaemons/org.jenkins-ci.plist
別忘了修改日志目錄的用戶權限和主目錄的用戶權限。
ios的app構建需要有xcode環境,所以你的部署一定是臺mac電腦,但我們做的也是自動構建,所以必然不能使用 xcode可視化工具進行構建,所以我嘗試了xcodebuild,大概步驟是:build->archive->IPA
xcodebuild -alltargets clean
xcodebuild -target HelloJenkins PROVISIONING_PROFILE="00000000-0000-0000-0000-000000000000" CONFIGURATION_BUILD_DIR=JenkinsBuild
xcodebuild -scheme HelloJenkins archive PROVISIONING_PROFILE="00000000-0000-0000-0000-000000000000" CODE_SIGN_IDENTITY="iPhone Developer: Justin Hyland (XXXXXXXXXX)" -archivePath ./JenkinsArchive/HelloJenkins.xcarchive
xcodebuild -exportArchive -exportFormat IPA -exportProvisioningProfile iOS\ Team\ Provisioning\ Profile:\ com.yourAPP.HelloJenkins -archivePath ./JenkinsArchive/HelloJenkins.xcarchive -exportPath ./JenkinsIPAExport/HelloJenkins.ipa
詳見:http://www.cnblogs.com/rosepotato/p/3884851.html
但是構建并沒有想象當中的順利,如果你使用了第三方的jar包,總是會報錯:
no provisioning profile matches ‘xxx’
通過調研,發現xcodebuild可以通過workspace文件構建,可以避開這些問題, 前提是你有scheme文件,跟ios的同時溝通完之后,他每次提交代碼都會share scheme 文件上來。構建偶爾成功,但是還是頻頻報錯。
xcodebuild -workspace MyProject.xcworkspace -scheme MyScheme SYMROOT=$(PWD)/build
最后的構建成功是借鑒了劉先寧在InfoQ上的一篇文章(構建iOS持續集成平臺(一)——自動化構建和依賴管理)
實際上是使用到了非死book給出的替代xcodebuild的解決方案xctool 頓時感覺,我之前就好像一直在用javac編譯java代碼,而不知道還有maven這個東西。 通過xctool和cocoapod,代碼構建成功。
xctool -workspace SDJG.xcworkspace -scheme SDJG clean
xctool -workspace SDJG.xcworkspace -scheme SDJG build SYMROOT=$(PWD)/JenkinsBuild
xcrun -sdk iphoneos PackageApplication -v bbbuild/Debug-iphoneos/SDJG.app -o /Users/fangrichird/git/shangde1216/JenkinsIPAExport/SDJG.ipa
ios項目也就只停留在IPA這里了,因為TestFlight自從被蘋果收購之后, 再不能通過jenkins的插件完成上傳。解決辦法停留在手動將IPA發向各種云 服務平臺,或者直接用iTunes安裝到測試機當中。
至于jenkins用到的插件和其他環境部署,請參考 java篇
-
Android項目的自動化構建
Android的集成部署相對來說比較簡單,跟我們的android工程師溝通,他們習慣使用 Android studio這種集成的ide,如果部署,有集成在IDE中的Gradle。
所以想要在linux上構建Android代碼,只需要兩件事情:
1.安裝Android SDK;
2.配置Gradle環境;(JDK環境就不用說了吧)other和java篇的配置相同,只是再需要安裝一個Gradle插件,如果 你需要向不同的應用市場打包,在Gradle的配置文件中配置就好了。
來自: http://mojito515.github.io/blog/2015/12/21/yong-jenkinsshi-xian-chi-xu-ji-cheng-de-da-jian/