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