【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端口的宿主映射會提示“端口已被佔用”

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

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

 部署日誌