本文整理自 Jenkins 北京線下沙龍,沙龍完整 PPT 請在文末下載
Rock 講師介紹:專一服務於某企業互聯網公司的SCM工程師,標籤:新技術、輕量級、弱流程、大宅、沒追求、胖
CD,主要指持續部署。git
在公司,我主要負責的持續集成和發佈部署這塊,目前如今有N百萬用戶,開發最多的時候有200人,每日上線部署次數應該是50~60次。github
部分團隊最近開始使用 spring cloud 。web
在作工具實施以前,確定會構想一下全部部署的業務是什麼樣的模式,讓它變得很靈活,能夠支持開發、測試等環境的構建和部署。spring
先按產品切分,每一個產品下面有不少工程,每一個工程的部署流水線通常會分二方包,單獨拿出來發佈到私服。另外是應用程序包,會把代碼生成部署包,這中間咱們會加單測和 findbugs 檢查。docker
再按環境切分:環境有開發測試、測試環境、集成測試環境、模擬和生產。
從代碼到開發測試環境和測試環境、基準測試環境、集成測試環境、模擬環境和線上環境,每一個環境能夠支持多套,環境部署成功後會自動調用集成測試。ide
每一個產品有不一樣的發佈流程。還有的是配置沒作到抽取,因此會有發佈到每一個環境時,都須要從源代碼構建。微服務
原則上: 代碼和配置要作分離的。
系統調用,代碼管理使用 GitLab ,中間是 Jenkins,經過 Jenkins 打包,部署工具使用 Rundeck ,當部署完成時自動調測試。工具
Jenkins 實際使用咱們分爲如下五點:gitlab
JOB-DSL測試
Nested View
Pipeline
Slaves
JOB-DSL ,單項目構建好模型後,從代碼到某個環境或者從環境到某個環境,會用 JOB-DSL 批量作生成;
Nested View ,切成兩級或者三級,如今有1000+的job,能夠按照1級或者2級產品線去作歸類;
Pipeline 目前主要用在是批量構建,一個產品有可能拆成50個微服務,在開發階段常常須要批量執行全部服務的構建部署。
Slaves 目前運行在 Docker容器中 ,理想狀態是Master 上不作構建(目前咱們在master上還有少許工程)。這樣master上作升級和遷移會容易不少。另一個緣由是:用docker作構建環境的管理:有的團隊用 Python ,有的團隊用 JAVA 等等,使用docker能夠把環境描述成文件。
下面的圖都是在上面的DSL上面定義完成後自動生成的。
Build 腳本里,把工程名稱記下來,他的產品名稱、工程名,從哪到哪。
下面的圖則是咱們構建的輸出日誌。
上圖是一個CD例子,產品A的工程 Login-Server 的發佈流程,代碼構建-》發佈測試環境-》集成測試環境-》生產環境。
下圖是 Nested View 我作的一個 Demo。
簡單說一下 Pipeline ,在 Pipeline 裏面,它的 list 集成裏有兩個項目,一個cd,一個ci,最後生成的樣子以下圖的。
以上說的全部的單工程或者 Pipeline 的工程都是能夠經過 JOB-DSL 所有把它生成出來的。
Slave這塊,使用 slave Docker 鏡像,構建環境隔離,添加 slave 到 Jenkins 。
根據環境須要,作一個鏡像 。
這是前幾天作的一個 Demo ,咱們會把M2和WS這兩個目錄掛出來,這兩個目錄常常會讀寫。
正常來講,作得好的話是無狀態的,把WS和M2丟掉,從新再構建一次,跟這個結果應該是同樣的。
BUILD_DATA 是構建中臨時產生的文件,都放到 var/data 下面。
若是要用好 Jenkins ,你可能須要瞭解 Groovy 。
在前面介紹的在 JOB-DSL 裏給JOB配置權限,下面是個專門寫個 Groovy 腳本給JOB配置權限。
如上圖把這三我的加一個執行權限,到產品AA的Dev階段的JOB配置權限。
其實,這個例子不太好,也能夠經過 JOB-DSL配置JOB權限,腳本的量會更少。
經過Gitlab pushed webhook 觸發Jenkins 執行構建:取代碼、編譯、單測、靜態分析、集成測試(部分項目)、sonar-scan 。經過度量系統對數據進行進一步的加工發佈給相關人,好比按部門/產品彙總,能夠給每一個產品或者每一個部門提供相應的代碼重複率、註釋率、類複雜度、阻斷性問題單測覆蓋率、集測覆蓋率的數據。
在CI,咱們用到的jenkins插件主要有 4種:
Gitlab
Dashboard
Ext mail
Jenkins 裝插件裝多了容易引發各類各樣的問題,像 Maven 那種咱們是不裝的,雖然是官方維護的,也以爲它不是一個特別好的插件。
咱們選了 GitLab-plugin用來和gitlab集成;Dashboard 能生成一些圖表,靜態分析的報告;郵件的選了 ext mail ,作自定義的郵件的推送,(構建失敗,或者有新增的 findbugs 警告的時發郵件給相關人) 。
這是 Jenkins-GitLab 集成:
如今說 Dashboard ,好比pmd的警告可能會放在上面,下面會顯示一些總共有多少個,高級別的什麼樣的,中級別的什麼樣的,低級別的什麼樣的。
前年去作 findbugs 清理的時候,發現 findbugs 是很是管用的東西。
ext-mail是發郵件,若是失敗的時候發給誰,以下圖:
另外還有 Script,寫一些腳本去定義它,若是有新增,把郵件發給誰。下圖是 Script 的腳本:
下面這個截圖配置JOB郵件發送的Groovy腳本。
Sonar,這是咱們如今的一個界面,它會給你提供不少的信息。
下圖早期版本的界面。
最後,咱們會在度量系統裏把這些數據收集起來,好比哪一個部門哪一個產品的,上個月和這個月的數據。
聊天機器人是比較好玩的:
咱們用的hubot 版本是2.19.0,bearychat是0.7.2。
效果是:不用打開網頁點點點;在聊天室,全部觸發的動做其餘人能夠看到; 還有一個比較方便的點,手機端裝一個 bearychat 客戶端,好比你正在坐班車或者正在下班路上,手機能夠觸發一些事,也能夠查某個機器的狀態。 hubot 和其餘工具也能夠作集成,如 Jira 、 GitLab ,提供更加快捷的方式。
上圖是 bearychat 本身的插件通知消息截圖。
hubot Jenkins ,跟它說把全部的job列表打出來,它就說這些是列表。
若是想看編譯結果,就說show output for demo-a。
demo code地址:https://github.com/rhinoceros/cicd-jenkins-practice
Jenkins 北京線下沙龍所有 PPT 連接: https://pan.baidu.com/s/1gffBFQr 密碼: w5qm
END