Java自動化佈署
透過Gradle + Jekins + Gitlab
Why?
手動部屬的問題
- 人會犯錯 , 手動佈署容易發生問題 , 尤其在 站台 及 區域 越來越多的時候。
- 手動部屬花時間 , 尤其是站台越來越多的時候
- UnitTest要手動測試
- 人越多 , 更新越頻繁 => 更多的佈署次數
- 新人學習要話一段時間才能了解整個手動部屬的流程
上手慢
Developer的希望
- 程式上傳後 , 自動有人代勞佈署
- 有人幫忙跑測試.
架構
![](https://s3.amazonaws.com/media-p.slid.es/uploads/343265/images/2606931/Continuous_integration.png)
Why Gradle
- Gradle是專案對外的包裝工具 , 非常重要
- 透過Maven or Gradle , 可以作到包裝行為的一致性
- Library的下載及管理交由工具處理 , 不用再自己處理
- Gradle的設定檔比Maven來的簡潔
- Gradle新增自訂的包裝工作比Maven來的容易
- Jenkins 針對常見的包裝工具支援度佳
- http://gradle.org/whygradle-build-automation/
![](https://s3.amazonaws.com/media-p.slid.es/uploads/343265/images/2602104/gradle.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/343265/images/2602146/gradle-logo-vertical-retina.jpg)
Why Jenkins
- Open Source,free
- 被大量測試過
- 社群大 , 社群能量大 , 更新快
- Plugin超級多
- 容易上手
- 其他的CI Server大部分都要收費
![](https://s3.amazonaws.com/media-p.slid.es/uploads/343265/images/2602145/logo-jenkins2.png)
Why GitLab?
- 社群版不收費 , 也有商業版.
- Gitlab-CE功能接近Gitlab-EE , 功能豐富
- 安全控管細 , 可針對個別專案作控制
- 提供Code Review界面
- 提供簡單的wiki or issue tracking
- Gitlab是目前最受歡迎的private Git repository
有被100,000人數的大型企業採用 - 專案有接口可以主動跟其他服務作串接
整合方式
- 分為主動或被動
- 主動
- Developer 上傳Code到Gitlab
- Gitlab觸發Jenkins 拉專案
- Jenkins拉回專案 , 進行建置
- Jenkins部屬到設定的目標站台(Tomcat)
- 被動(沒測試)
- Developer 上傳Code到Gitlab
- 由Developer or Issue 系統發出merge request 給Gitlab
- Jenkins 設定排程 , 定期檢查是否有merge request
- 如果有 , Jenkins拉回專案 , 進行建置
- Jenkins部屬到設定的目標站台(Tomcat)
下面介紹主動的方式
環境說明
- 測試環境的架設使用Docker , 以便快速架設各服務
- 主機為ubuntu server
![](https://s3.amazonaws.com/media-p.slid.es/uploads/343265/images/2602161/docker_small_v.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/343265/images/2602165/ubuntu-logo.png)
Gradle Project
![](https://s3.amazonaws.com/media-p.slid.es/uploads/343265/images/2602174/gradle-project.png)
包裝工具導入的差異
- 專案目錄會有固定的預設路徑 , 跟MyEclipse 或 Eclipse預設路徑不同
- 會有Test的目錄方便存放UnitTest
- 大部分OpenSource的Library , 只要Maven Repository有的話 , 不用自行掛載. 後續可整合private Library repository.
- 會有預設的包裝任務 , 沒有依賴IDE=> 包裝可跨IDE支援
Gradle
![](https://s3.amazonaws.com/media-p.slid.es/uploads/343265/images/2602184/gradle-2.png)
Gitlab
![](https://s3.amazonaws.com/media-p.slid.es/uploads/343265/images/2602190/gitlab-1.png)
Gitlab
![](https://s3.amazonaws.com/media-p.slid.es/uploads/343265/images/2602198/gitlab-2.png)
Jenkins
![](https://s3.amazonaws.com/media-p.slid.es/uploads/343265/images/2602458/jenkins-0.png)
Jenkins-plugin
![](https://s3.amazonaws.com/media-p.slid.es/uploads/343265/images/2602472/jenkins-setting-1.png)
Jenkins-plugin
![](https://s3.amazonaws.com/media-p.slid.es/uploads/343265/images/2602481/jenkins-setting-2.png)
Jenkins
![](https://s3.amazonaws.com/media-p.slid.es/uploads/343265/images/2602459/jenkins-1.png)
Jenkins
![](https://s3.amazonaws.com/media-p.slid.es/uploads/343265/images/2602461/jenkins-2.png)
Jenkins
![](https://s3.amazonaws.com/media-p.slid.es/uploads/343265/images/2602463/jenkins-3.png)
Jenkins
![](https://s3.amazonaws.com/media-p.slid.es/uploads/343265/images/2602464/jenkins-4.png)
Run
![](https://s3.amazonaws.com/media-p.slid.es/uploads/343265/images/2602506/jenkins-run-0.png)
Run
![](https://s3.amazonaws.com/media-p.slid.es/uploads/343265/images/2602509/jenkins-run-1.png)
基本上差不多等於外面說的Continuous integration
但 Continuous integration 通常要求
- 整個流程要非常順
- integration的週期要短.
可以再做的優化
- 根據不同的Git分支 , 自動發布到不同的Zone
- 整合merge request plugin
- 訊息提示整合
- library發布及自動版號整合nexus
- 動態根據feature branch作自動發布及建置Ap Server
參考
- http://www.slideshare.net/fatmuemoo/juc-boston2014pptx
- http://www.vogella.com/tutorials/Jenkins/article.html
End
Continuous integration
By Mars Yang
Continuous integration
- 698