使用Jenkins創(chuàng)建Java應(yīng)用的持續(xù)集成
應(yīng)用在迭代升級(jí)過程中,需要持續(xù)集成與持續(xù)部署。使用Jenkins為SAE應(yīng)用的構(gòu)建持續(xù)集成(CI)環(huán)境。
前提條件
使用GitLab托管您的代碼。
方式一:自行搭建GitLab。本文以自行搭建的GitLab進(jìn)行演示。
方式二:使用云效代碼管理Codeup。
背景信息
您可以使用Jenkins構(gòu)建SAE應(yīng)用的持續(xù)集成方案。本文適用于對(duì)以下語言或工具有一定了解的開發(fā)人員。
工具 | 說明 |
Maven | Maven是一個(gè)項(xiàng)目管理和構(gòu)建的自動(dòng)化工具。 |
Jenkins | Jenkins是一個(gè)可擴(kuò)展的持續(xù)集成引擎。 |
GitLab | GitLab是一個(gè)利用Ruby on Rails開發(fā)的開源應(yīng)用程序,實(shí)現(xiàn)一個(gè)自托管的Git項(xiàng)目倉庫,可通過Web界面進(jìn)行訪問公開的或者私人項(xiàng)目。 它擁有與GitHub類似的功能,能夠?yàn)g覽源代碼,管理缺陷和注釋。 |
步驟一:配置項(xiàng)目
修改Maven項(xiàng)目配置,添加toolkit-maven-plugin及應(yīng)用部署信息。具體操作,請(qǐng)參見通過Maven插件自動(dòng)部署應(yīng)用。
修改項(xiàng)目配置后,建議您在本地使用Maven構(gòu)建驗(yàn)證配置是否正確。
步驟二:配置Jenkins
在Jenkins控制臺(tái)的菜單欄中選擇 ,安裝Git和GitLab插件。
說明GIT Client Plugin和GIT Plugin插件可以幫助Jenkins拉取Git倉庫中的代碼。
GitLab Hook Plugin插件可以幫助Jenkins在收到GitLab發(fā)來的Hook后觸發(fā)一次構(gòu)建任務(wù)。
在Jenkins控制臺(tái)的菜單欄中選擇 ,設(shè)置Maven版本名稱并配置路徑,單擊保存。
在Jenkins服務(wù)器上生成SSH RSA密鑰對(duì),并將公鑰導(dǎo)入GitLab,實(shí)現(xiàn)Jenkins拉取GitLab代碼時(shí)的自動(dòng)認(rèn)證。
在Jenkins服務(wù)器生成SSH RSA密鑰對(duì)。
進(jìn)入GitLab首頁,在菜單欄選擇 ,并單擊New Deploy Key ,導(dǎo)入在Jenkins服務(wù)器上創(chuàng)建的SSH RSA公鑰。
步驟三:創(chuàng)建Jenkins任務(wù)
在Jenkins首頁左側(cè)導(dǎo)航欄中單擊新建Item,在創(chuàng)建任務(wù)界面輸入任務(wù)名稱,并選擇Freestyle project,單擊確定,配置任務(wù)信息。
單擊源碼管理,在源碼管理頁簽中選擇Git,并設(shè)置相關(guān)參數(shù)。
Repository URL:您的項(xiàng)目的Git協(xié)議地址。
Credentials:安全憑證,選擇無即可。
重要請(qǐng)確保您的SSH RSA公匙已添加到該Git項(xiàng)目所在的GitLab中,否則將會(huì)報(bào)錯(cuò)。
單擊構(gòu)建觸發(fā)器,在構(gòu)建觸發(fā)器頁簽選中GitHub hook trigger for GITScm polling。
單擊構(gòu)建環(huán)境,在構(gòu)建環(huán)境頁簽選中Add timestamps to the Console Output,為控制臺(tái)輸出的信息添加時(shí)間戳。
單擊構(gòu)建,在構(gòu)建頁簽單擊增加構(gòu)建步驟,在下拉列表中選擇Invoke top-level Maven targets。
在Invoke top-level Maven targets區(qū)域設(shè)置Maven Version和Goals。如果您想部署多模塊工程,請(qǐng)參見(可選)創(chuàng)建多模塊工程的Jenkins任務(wù)。
Maven Version:?jiǎn)螕粼撨x項(xiàng)后面的下拉框,選擇在全局工具配置里配置的Maven版本名稱。
Goals:輸入mvn clean package toolkit:deploy -Dtoolkit_profile=toolkit_profile.yaml -Dtoolkit_package=toolkit_package.yaml -Dtoolkit_deploy=toolkit_deploy.yaml (如有其他參數(shù),請(qǐng)根據(jù)實(shí)際情況輸入)。
說明Maven配置完成后,在步驟五:提交變更到GitLab步驟中便可通過POP API方式觸發(fā)應(yīng)用部署。
步驟四:配置GitLab的Web Hook
在GitLab首頁右鍵單擊GitLab工程,然后選擇Setting > Web Hooks。
在Web Hooks頁面的URL區(qū)域中輸入
http://jenkins服務(wù)器地址:jenkins服務(wù)器監(jiān)聽端口/git/notifyCommit?url=本項(xiàng)目的git協(xié)議地址
。圖中表示的Jenkins服務(wù)器地址為您的Jenkins服務(wù)器的Web訪問地址如
192.168.XX.XX:8080
。配置完成后,單擊Test Hook,測(cè)試配置結(jié)果。
步驟五:提交變更到GitLab
如果上述步驟配置正確,提交后將會(huì)觸發(fā)一次GitLab Hook。Jenkins在接收到該Hook后會(huì)構(gòu)建您的Maven項(xiàng)目,并在構(gòu)建結(jié)束時(shí)調(diào)用SAE POP API腳本觸發(fā)部署。
構(gòu)建的Maven項(xiàng)目中配置了通過SAE POP API方式部署應(yīng)用的腳本。
提交部署成功輸出的日志信息(
)。15:58:51 [INFO] Deploy application successfully!
15:58:51 [INFO] ------------------------------------------------------------------------
15:58:51 [INFO] BUILD SUCCESS
15:58:51 [INFO] ------------------------------------------------------------------------
15:58:51 [INFO] Total time: 24.330 s
15:58:51 [INFO] Finished at: 2018-12-25T15:58:51+08:00
15:58:51 [INFO] Final Memory: 23M/443M
15:58:51 [INFO] ------------------------------------------------------------------------
15:58:51 Finished: SUCCESS
如果部署失敗,您可以登錄SAE控制臺(tái),查看此次部署任務(wù)的執(zhí)行過程。具體步驟,請(qǐng)參見查看變更記錄。
(可選)創(chuàng)建多模塊工程的Jenkins任務(wù)
如果您需要?jiǎng)?chuàng)建多模塊工程的Jenkins任務(wù),您可以參考以下內(nèi)容設(shè)置。
創(chuàng)建多模塊工程的Jenkins任務(wù)和步驟三:創(chuàng)建Jenkins任務(wù)的第5步基本相同,只需要修改調(diào)用頂層Maven目標(biāo)。如果工程為多模塊工程,想在Jenkins中部署子模塊的話,那么需要在父模塊中調(diào)用mvn clean install
命令,然后在子模塊中調(diào)用mvn clean package toolkit:deploy -Dtoolkit_profile=toolkit_profile.yaml -Dtoolkit_package=toolkit_package.yaml -Dtoolkit_deploy=toolkit_deploy.yaml
命令。參數(shù)的具體說明,請(qǐng)參見通過Maven插件自動(dòng)部署應(yīng)用。
以Demo工程為例的工程結(jié)構(gòu)如下。
sh-3.2# tree -L 1 carshop
carshop
├── detail
├── itemcenter
├── itemcenter-api
└── pom.xml
其中,detail、itemcenter、itemcenter-api為子模塊,如果您想部署itemcenter模塊的話,需要在父工程中設(shè)置一個(gè)clean install構(gòu)建目標(biāo),然后在itemcenter模塊中設(shè)置clean package toolkit:deploy -Dtoolkit_profile=toolkit_profile.yaml -Dtoolkit_package=toolkit_package.yaml -Dtoolkit_deploy=toolkit_deploy.yaml
構(gòu)建目標(biāo)。