【EasyCi】持續集成交付,一鍵式自動化部署系統,開箱即用

  • 2019 年 10 月 21 日
  • 筆記

前言

  本人是一家互聯網公司的java開發,由於公司初期公司未招運維人員,恰好我對linux比較熟悉,便在公司伺服器搭建了一套Jenkins、Gitlab、Maven私服、Docker私服、Sonarqube、ELK、FastDFS等一套持續集成的運維環境。

  後來發現,運維這塊以後也歸我管了……平時做系統開發,還要兼職運維,一些前端或者後端的發布都要找我來創建Jenkins 項目、添加gitlab hook、添加dockerfile文件等等。

  所以就想自己寫一套簡單的持續化集成發布的系統。便有了接下來的EasyCi。

  EasyCi系統開發的目的是免去遠程發布的免密登陸、拉取gitlab程式碼的認證、手動添加gitlab hook、查看gitlab中該項目的git地址等等多餘的操作。這些操作均有後台自動完成,系統提供運行環境一鍵安裝腳本、自動化安裝部署本系統、開箱即用,只需要幾個參數即可實現項目的遠程構建,暫時只支援vue和java項目的構建。

  Easyci系統採用B/S架構,後端採用springboot框架、前端採用Vue的element ui、資料庫採用mysql、運行工具為shell腳本、採用websocket進行實時日誌傳輸。

  由於系統由本人獨立開發,對前端開發不是很擅長,頁面比較簡單,只為實現基本功能,後續會對功能和頁面進行優化。

系統架構

Jenkins系統架構

工具鏈

Jenkins:集成各種工具,持續集成、持續交付

Gitlab:程式碼託管庫,通過gitlab hook觸發Jenkins持續集成交付

Maven私服:私有jar包倉庫

Docker私服:私有docker鏡像倉庫,用於遠程構建

Sonarqube:程式碼審查工具

ELK:日誌手機系統、分析系統

流程

1.Jenkins集成gitlab、maven、docker、sonarqube,安裝各種插件

2.開發人員提交程式碼到gitlab,觸發gitlab hook中添加的jenkins項目url進行jenkins構建

3.jenkins自動拉取該項目的gitlab程式碼,進行打包、再打包成docker鏡像,docker鏡像提交到docker私服

4.連接需要發布的伺服器,拉去docker私服中該項目的鏡像,docker run運行容器 

5.Jenkins構建項目運行完成後添加gitlab tag並提交gitlab作為以後回滾的依據

6.Jenkins構建失敗則自動拉取最新的gitlab tag重新構建,執行回滾,回滾再次構建失敗便停止

7.構建成功或者回滾成功或者回滾失敗都會通過linux的sendmail發送郵件提醒,並附加構建日誌

8.構建的程式碼會通過sonarqube插件上傳sonarqube進行程式碼審查

系統圖

 

 

EasyCi系統架構

工具鏈

EasyCI:easyci系統後台,調用shell腳本、通過介面將結果返回前端

EasyCI-UI:easyci系統前台,vue。調用後台介面展示數據

Gitlab:程式碼託管工具,通過gitlab hook觸發easyci持續集成交付

shell腳本:linux腳本

Docker私服:私有docker鏡像倉庫,用於遠程構建

MySQL:easyci系統資料庫

流程

1.根據安裝文檔安裝系統,啟動系統

2.訪問系統首先需要驗證gitlab:gitlab的url、用戶名和密碼。用於選擇項目構建、伺服器拉取程式碼驗證、自動添加hook,免去手動操作。

3.添加遠程發布伺服器:伺服器ip、埠、用戶名、密碼。後台自動完成伺服器間的免密登錄,用於項目遠程發布、查看伺服器容器以及容器的各種操作。

4.部署:選擇項目url、輸入docker容器埠映射關係、選擇項目類型、輸入收件人郵箱、選擇部署伺服器,只需要輸入兩項內容即可完成部署。

5.點擊部署,會彈出窗口顯示系統部署日誌。

6.部署會自動添加easyci的hook介面url到該部署項目的hook中,用於自動觸發構建。

7.部署完成自動發送郵件給收件人郵箱,顯示構建結果、構建時間、構建項目、構建日誌。

8.後續開發人員提交程式碼到該項目的gitlab,會觸發gitlab的hook調用easyci介面,查詢之前部署的資訊進行自動部署,實現持續集成。

9.頁面展示easyci本機正在運行的容器和添加的遠程伺服器正在運行的容器,支援數據自動刷新與關閉

10.可以選擇添加的遠程伺服器,查看該伺服器的容器列表

11.容器操作:可點擊啟動  、停止、重啟、銷毀在頁面對伺服器中運行的容器進行操作,即docker  start|stop|restart|rm 容器名稱

12..容器實時日誌:點擊日誌,可以查看該容器的實時日誌,即docker logs -f 容器名稱

安裝教程

1.系統準備

  • 本系統僅支援Centos7系統
  • 配置2H4G
  • 固定好ip

1.在公司伺服器中分出一個虛擬機作為easyci的運行環境,要求如上圖所示。

注意:該虛擬機最好不要運行其他服務,因為easyci會先在本地運行容器測試部署結果,再發送到遠程伺服器運行容器,要注意埠佔用。

2.將easyici.zip通過winscp或者xftp等。

這裡我放到/root目錄下。

 3.通過xshell或者其他工具連接伺服器。

 4.進入/root目錄,將easyci.zip解壓

 如果解壓unzip沒有命令,可以執行 yum install -y unzip 安裝

再次解壓。解壓後生成easyci文件夾。

 5.進入easyci文件夾

 6.編輯install.sh,修改第35行中的localhost修改為本機ip

  • vi install

按住“ℹ️”進入編輯,修改localhost為本機ip

 修改完成後,按“Esc”退出編輯狀態,按“:”輸入wq回車,保存。

 該install腳本為easyci系統部署所需要所有工具的安裝,可按需調整。

7.運行install腳本,進行系統安裝

  • bash install.sh

系統安裝會持續20分鐘左右,具體看網速。

出現下圖,表示系統所需工具初步安裝完成。

 

 8.重載/etc/profile配置文件。

  • source /etc/profile

測試java、maven、node等命令是否正常安裝。

  • java -version
  • mvn -v
  • node -v
  • npm -v

 ok,工具按住完成。

9.永久關閉selinux

  • vi /etc/selinux/config

將SELINUX=enforcing改為SELINUX=disabled
設置後需要重啟才能生效。

10.開放mysql的root用戶遠程訪問。

  • mysql -hlocalhost -uroot -p123456
  • grant all privileges on *.* to root@”%” identified by “.”;
  • flush privileges;
  • exit

 11.啟動系統

 進入easyci系統家目錄/home/easyici

執行./startEasyCi.sh啟動系統

  •  netstat -tunlp | grep -E “9875|81”

查看前端81埠和後端9875埠是否開啟成功。

使用教程

1.訪問系統  瀏覽器打開 ip:81

 系統啟動首先需要驗證gitlab。

gitlaburl:輸入gitlab的地址,不要加http:

用戶名密碼:建議用戶名和密碼輸入管理員root的用戶名和密碼。

註:這裡的密碼不要包含@ / 等特殊符號,否則免認證拉取git程式碼會失敗

此處輸入點擊登錄,後台會調用gitlab api拿到access-token,用於在伺服器中拉取免密拉取程式碼、部署時選擇構建的項目。

2.添加遠程部署伺服器

 輸入資訊點擊添加,系統會系統生成本伺服器的公鑰,添加到該伺服器的認證文件中實現免密登陸。

添加完成之後會展示該伺服器的docker容器列表,可以進行啟動、停止、重啟、銷毀、查看實時日誌操作。

 添加伺服器完成,會顯示本機的容器列表和添加伺服器的容器列表。

如果有多個遠程伺服器,可以選擇某個伺服器,查看該伺服器的容器列表,也可以開啟自動刷新,實時刷新容器數據。

 “啟動|停止|重啟|銷毀”等操作同步docker start|stop|restart|rm 容器名稱。

“日誌”可以查看該伺服器的實時日誌,即docker logs -f -tail 200 容器名稱。查看該容器近200行日誌,並實時刷新。

 3.項目構建

點擊選擇需要部署的gitlab醒目

 埠輸入埠映射對。

由於是採用docker容器運行。需要設置映射埠

例如6000:5000

前面的6000為宿主機對外訪問開放的埠,後面的5000為構建項目的埠,注意“:”為英文狀態下

項目語言選擇vue或者java。

收件人郵箱:如果有多個以“,”分割

部署方式:選擇要部署的伺服器。

注意:本系統是在本地先運行測試容器是否正常運行。運行正常則本地會刪除容器釋放埠,再發布到遠程伺服器運行。

所以注意本地埠佔用。系統初始埠如下:

22、25、81、5000、3306、9875、68、323

即埠映射前面的埠不能為上述埠。

 如果本地或者遠程埠被佔用,會停止構建,彈窗提醒。

這裡easyci本地運行的docker私服佔用了5000埠,再發布5000埠的宿主映射會提示“埠已被佔用”

 換其他埠,開始部署,顯示部署日誌

 容器部署成功會有郵件提醒。

 部署日誌