Java自動化佈署

透過Gradle + Jekins + Gitlab 

Why?

手動部屬的問題

  • 人會犯錯 , 手動佈署容易發生問題 , 尤其在 站台 及 區域 越來越多的時候。
  • 手動部屬花時間 , 尤其是站台越來越多的時候
  • UnitTest要手動測試
  • 人越多 , 更新越頻繁 => 更多的佈署次數
  • 新人學習要話一段時間才能了解整個手動部屬的流程
    上手慢

Developer的希望

  • 程式上傳後 , 自動有人代勞佈署
  • 有人幫忙跑測試.

架構

Why Gradle

  • Gradle是專案對外的包裝工具 , 非常重要
  • 透過Maven or Gradle , 可以作到包裝行為的一致性
  • Library的下載及管理交由工具處理 , 不用再自己處理
  • Gradle的設定檔比Maven來的簡潔
  • Gradle新增自訂的包裝工作比Maven來的容易
  • Jenkins 針對常見的包裝工具支援度佳
  • http://gradle.org/whygradle-build-automation/

Why Jenkins

  • Open Source,free
  • 被大量測試過
  • 社群大 , 社群能量大 , 更新快
  • Plugin超級多
  • 容易上手
  • 其他的CI Server大部分都要收費

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

Gradle Project

包裝工具導入的差異

  • 專案目錄會有固定的預設路徑 , 跟MyEclipse 或 Eclipse預設路徑不同
  • 會有Test的目錄方便存放UnitTest
  • 大部分OpenSource的Library , 只要Maven Repository有的話 , 不用自行掛載. 後續可整合private Library repository.
  • 會有預設的包裝任務 , 沒有依賴IDE=> 包裝可跨IDE支援

Gradle

Gitlab

Gitlab

Jenkins

Jenkins-plugin

Jenkins-plugin

Jenkins

Jenkins

Jenkins

Jenkins

Run

Run

基本上差不多等於外面說的Continuous integration

但 Continuous integration 通常要求

  1. 整個流程要非常順
  2. 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

Made with Slides.com