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