【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端口的宿主映射會提示“端口已被佔用”
換其他端口,開始部署,顯示部署日誌
容器部署成功會有郵件提醒。
部署日誌