在已有項(xiàng)目上構(gòu)建持續(xù)集成平臺(tái)

  • 背景

    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

show

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的路徑做一些配置

system-config

如果你下載了Email Extension Plugin插件,在系統(tǒng)配置中可以設(shè)置你想要的郵件通知屬性

email-config

系統(tǒng)配置之后,回到主界面,選擇新建,填寫Item名稱,選擇構(gòu)建一個(gè)maven項(xiàng)目

create-job

下一步,源碼管理中填入你拉取代碼的git地址,可以是HTTP協(xié)議,也可以是SSH。當(dāng)然,如果是HTTP,要有
對(duì)應(yīng)的用戶名和密碼;如果是SSH,用戶名和密碼是git版本管理所在的服務(wù)器主機(jī)的用戶名和密碼,
并且需要在git版本管理器所在服務(wù)器上添加ssh登錄的auto文件中添加公鑰
private key是jenkins所在主機(jī)的用戶私鑰。

config-git

構(gòu)建觸發(fā)器中勾選Build whenever a SNAPSHOT dependency is builtPoll SCM
這樣構(gòu)建的觸發(fā)器,會(huì)每三分鐘(H/3 * * * *)輪詢一遍你的代碼庫(kù),只要你往git的develop
分支中commit代碼,Jenkins就會(huì)構(gòu)建一次

config-trigger

編譯使用的是maven,所以要確定到maven的pom文件和執(zhí)行命令,如圖

config-build

添加構(gòu)建后的動(dòng)作,比如你希望執(zhí)行什么shell、郵件通知到developer
或者管理員等

config-email

這里打包好的文件在你的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)建的情況

show-jobs

除了自動(dòng)觸發(fā)構(gòu)建任務(wù),你也可以手動(dòng)計(jì)劃一次構(gòu)建

build-list

下圖為每次測(cè)試結(jié)果的一個(gè)統(tǒng)計(jì)圖:

show-test

在變更記錄中,能看到每次構(gòu)建中,提交了哪些代碼,commit的comments,誰(shuí)提交的等等

show-summary

更具體的構(gòu)建信息可以查看Console Output ,如下圖:

show-console

讓我很舒服的是,當(dāng)Jenkins自動(dòng)構(gòu)建完成之后,我會(huì)收到一個(gè)郵件提醒

show-email

最后,別讓你的系統(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的配置文件中配置就好了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,837評(píng)論 18 139
  • 前言 眾所周知,現(xiàn)在App的競(jìng)爭(zhēng)已經(jīng)到了用戶體驗(yàn)為王,質(zhì)量為上的白熱化階段。用戶們都是很挑剔的。如果一個(gè)公司的推廣...
    偏偏就是禰閱讀 9,038評(píng)論 34 59
  • 前言 眾所周知,現(xiàn)在App的競(jìng)爭(zhēng)已經(jīng)到了用戶體驗(yàn)為王,質(zhì)量為上的白熱化階段。用戶們都是很挑剔的。如果一個(gè)公司的推廣...
    閑云清煙閱讀 2,531評(píng)論 1 4
  • 0推薦文章和網(wǎng)站 參考文章使用Jenkins配置Git+Maven的自動(dòng)化構(gòu)建jenkins git插件安裝Jen...
    zlcook閱讀 12,526評(píng)論 7 46
  • 準(zhǔn)備工作 Jenkins的安裝 Jenkins依賴于Java環(huán)境,首先需安裝和配置Java環(huán)境(PS:在下載的時(shí)候...
    _Artillery閱讀 4,494評(píng)論 6 22