GitLab+Jenkins持續集成+自動化部署
什么是持續集成?
(1)Continuous integration (CI)
持續集成是一種軟件開發實踐,即團隊開發成員經常集成他們的工作,通常每個成員至少集成一次,也就意味着每天可能會發生多次集成。每次集成都通過自動化的構建(包括編譯、發布、自動化測試)來驗證,從而盡快地發現集成錯誤。許多團隊發現這個過程可以大大減少集成的問題,讓團隊能夠更快的開發內聚的軟件。
(2)沒有持續集成
項目做模塊集成的時候,發現很多接口都不通==>浪費大量時間
需要手動去編譯打包最新的代碼==>構建過程不透明
發布代碼,上線,基本靠手工==>腳本亂飛
(3)持續集成最佳實踐:
維護一個單一的代碼庫
使構建自動化
執行測試是構建的一部分
集成日志及歷史記錄
使用統一的依賴包管理庫
每天至少集成一次
熟悉Jenkins
如何安裝Jenkins此文省略,可參考 安裝文檔
(1)登錄Jenkins webUI界面創建第一個項目
(2)輸入項目名稱(My-freestyle-job)並選擇構建一個自由風格的軟件項目
(3)上面創建完成后跳轉進來后進行配置,選擇丟棄舊的構建(下面保持天數一般在5~7天即可)
(4)接着上面選擇構建,然后選擇Execute Shell 來執行shell命令
(5)既然能執行shell命令,那么我們執行一個pwd,看下默認的工作目錄在哪里
(6)上面保存后點擊立即構建,就會在下面生成一個build history,(出現藍色即表示正常,若紅色即表示有問題)
(7)構建完成,我們可以點擊build ID下拉框選擇Console Output 來查看詳細信息
(8)通過輸出信息我們可以看到Jenkins默認的工作目錄在 /var/lib/jenkins/workspace/(項目名稱)
(9)既然能執行shell命令,那么我們創建一個文件試試;返回工作台,點擊配置
(10)創建一個test.txt文件並保存
(11)同上面一樣,我們點擊立即構建
(12)同樣查看構建后的控制台輸出,可以看到構建成功
(13)既然構建成功,那么我們進入服務器進行驗證是否創建成功
[root@jenkins ~]# cd /var/lib/jenkins/workspace/My-freestyle-job/ #進入到項目目錄 [root@jenkins My-freestyle-job]# [root@jenkins My-freestyle-job]# ls #查看確實創建了文件 test.txt [root@jenkins My-freestyle-job]# rm -rf test.txt #因為沒有什么用,測試完了,我們將其刪除 [root@jenkins My-freestyle-job]#
GitLab+Jenkins實現自動更新代碼
流程圖示例:
說明:
通過gitlab+Jenkins實現代碼的自動更新同步代碼到web服務器站點目錄。此處示例后端web服務器使用nginx。本次項目示例使用碼雲上面的一個html項目(https://gitee.com/kangjie1209/monitor.git)
環境說明:
192.168.1.21 | GitLab服務器 |
192.168.1.22 | Jenkins服務器 |
192.168.1.26 | Nginx服務器 |
https://gitee.com/kangjie1209/monitor.git 項目訪問示意圖:
GitLab配置
說明:
首先我們在gitlab上面創建一個群組,並創建一個dev開發用戶(用於提交代碼等),同時在Jenkins服務器上面生成ssh秘鑰並將key添加到新建用戶dev的ssh認證下面,並創建一個代碼倉庫,並將代碼copy進去。
具體操作步驟:
(1)登錄gitlab點擊項目,然后點擊創建一個群組
(2)點擊新建群組
(3)輸入新建群組的相關信息並點擊創建
(4)點擊設置選擇新建用戶
(5)輸入賬號相關信息並點擊創建用戶
(6)點擊編輯,為上面新創建的用戶設置密碼
(7)給這個賬號設置密碼並保存
(8)將上面創建的用戶添加到devops組中並給與開發者權限
(9)找到剛剛創建的dev用戶並給予開發人員權限,然后增加用戶到群組
(10)回到Jenkins上面生成ssh秘鑰
[root@jenkins ~]# ssh-keygen [root@jenkins ~]# cat .ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCt9+3rxKFGTEeT4F4q4AEc+So3A4jMBMpW6Ojoy5h1VQhNVV6meuOGp7ltJXtmY0Bm7tw8S/KDVXPSCvDi3QQgzWe2ZQmG+Y62SKcXpDxOJue98OHDNoxcm2kJl/xeFZddQZd6eohbBA9Au4SPMINLsGR6MEYXH4JHM6rXzf9QN4Q5GYYEFTTZvu/PxoDq46+A/mkO5aklBjaih6YSH3q7nr2rEhQJ64b6wEkfBjptfzKm54TZBJAPzycHrXe5P68tPZ2CNgJN+40XGrkg/MVjf9D9EwjyvsNcdLzTHDsClc3Jh8/8tfSFFzVFonyKyjal9amCvzdVbnUEqQSgRTWT root@jenkins
(11)回到gitlab服務器上面使用dev用戶登錄,然后點擊頭像選擇設置
(12)上面的設置點進來后,選擇SSH 秘鑰, 然后復制Jenkins服務器上生成的秘鑰然后點擊增加秘鑰
(13)切回root用戶,新建一個項目
(14)選擇導入項目並輸入相關信息,然后點擊創建項目
(15)導入成功后可以看見代碼和導入成功提示,至此gitlab暫時部署到此
Jenkins配置
說明:
還是使用前面示例創建的My-freestyle-job項目,配置導入上面gitlab創建的項目
具體操作步驟:
(1)點擊項目名稱開始配置
(2)上面點擊進去后點擊配置
(3)選擇源碼管理,選Git,輸入倉庫URL地址(如果下方出現紅色及表示出錯了),然后選擇保存
(4)立即構建
(5)查看構建詳細信息
(6)進入到服務器中查看項目目錄是否將代碼拉取成功
[root@jenkins ~]# cd /var/lib/jenkins/workspace/My-freestyle-job/ [root@jenkins My-freestyle-job]# ls 404.html efficiencyAnalysis.html js other-components.html alerts.html energy_consumption.html keyInfo.html profile-page.html assets file-manager.html labels.html QHME.iml buttons.html fonts LICENSE readme.md calendar.html form-components.html list-view.html real-time.html charts.html form-elements.html login.html sa.html components.html form-examples.html media tables.html content-widgets.html form-validation.html media.html test.txt css images-icons.html messages.html typography.html deviceManager.html img mstp_105_SuperAdmin.iml userMng.html dianfei.html index.html mstp_map.html
可以看到Jenkins已經成功從gitlab上面拉取代碼,接下來我們先將Web站點配置好再看如何自動同步到Web服務器上面。
Web Server站點配置
說明:
此處我們直接yum安裝nginx,站點目錄就用默認的 /usr/share/nginx/html 目錄。
詳細操作步驟:
(1)安裝nginx並修改測試頁面
[root@web-nginx ~]# yum install nginx -y [root@web-nginx ~]# ll /usr/share/nginx/ 總用量 0 drwxr-xr-x. 2 root root 24 3月 29 00:13 html [root@web-nginx ~]# echo "<h1>Web Server</h1>" > /usr/share/nginx/html/index.html [root@web-nginx ~]# systemctl start nginx [root@web-nginx ~]# curl -I localhost HTTP/1.1 200 OK Server: nginx/1.12.2 Date: Wed, 27 Mar 2019 14:37:45 GMT Content-Type: text/html Content-Length: 3700 Last-Modified: Tue, 06 Mar 2018 09:26:21 GMT Connection: keep-alive ETag: "5a9e5ebd-e74" Accept-Ranges: bytes
(2)訪問nginx服務器
nginx站點部署ok,接下來就是實現如何構建夠自動同步到nginx服務器
自動化同步代碼
說明:
上面已經完成了Jenkins從gitlab上面拉取代碼,及nginx web服務器站點的布置,現在需要實現的是如何Jenkins上面構建后自動同步到web服務器。想一下,在上面我們可以執行shell命令,那么一定也就可以執行shell腳本。so 我們編輯一個同步腳本,然后構建觸發腳本同步到web服務器上面。
具體操作步驟:
(1)在Jenkins服務器上面編寫同步腳本,由於是通過腳本拷貝到web服務器的站點目錄,所以需要先做一個ssh秘鑰認證
[root@jenkins ~]# ssh-copy-id -i 192.168.1.26 [root@jenkins ~]# mkdir /server/scripts -p [root@jenkins ~]# cd /server/scripts/ [root@jenkins scripts]# vim deploy.sh #!/bin/bash CODE_DIR="/var/lib/jenkins/workspace/My-freestyle-job/" #項目目錄 DATE_TIME=`date +%Y-%m-%d-%H-%M-%S` #時間格式 TAR_NAME=web-${DATE_TIME}.tar.gz #打包后的名字 WEB_ADDR=192.168.1.26 #web服務器地址 WEB_DIR="/usr/share/nginx/" #web服務器站點目錄的上一級 "/usr/share/nginx/html" WEB_NEWDIR_NAME=web-${DATE_TIME} #web服務器新建的站點目錄名字 #進入到項目目錄並進行打包代碼 tarcf_code(){ cd $CODE_DIR && tar czf /opt/$TAR_NAME ./* } #拷貝到web服務器的站點目錄的上一級 scp_code(){ scp /opt/$TAR_NAME $WEB_ADDR:$WEB_DIR } #連接web服務器進行解壓壓縮包到新的一個已時間命名的站點目錄 tarxf_code(){ ssh $WEB_ADDR "cd $WEB_DIR && mkdir $WEB_NEWDIR_NAME && tar xf $TAR_NAME -C $WEB_NEWDIR_NAME" } #將新建的站點目錄與html站點目錄做一個軟鏈接 ln_code(){ ssh $WEB_ADDR "cd $WEB_DIR && rm -rf html && ln -s $WEB_NEWDIR_NAME html" } del_code(){ ssh $WEB_ADDR "cd $WEB_DIR && rm -rf $TAR_NAME" } main(){ tarcf_code; scp_code; tarxf_code; ln_code; del_code; } main
(2)配置Jenkins,使用Jenkins調用部署腳本(此處寫腳本全路徑腳本名稱)
(3)配置自動觸發構建、需要設置安全令牌Secret token,進入項目選擇配置,設置相關信息,然后生成token,復制token(需要填寫到gitlab上面)和Build when a chang上面提示的URL地址(http://192.168.1.22:8080/project/My-freestyle-job)
(4)配置gitlab,添加token
(5)測試Web鈎子
(6)上面已經配置完成,接下來就是測試,我們知道目前web服務站點訪問得到的一個“Web Server”, 在另外一台機器上面克隆代碼並進行修改(此處我就使用Jenkins順便來做測試了),然后推送gitlab倉庫
[root@jenkins ~]# git clone git@192.168.1.21:devops/monitor.git [root@jenkins ~]# [root@jenkins ~]# cd monitor/ [root@jenkins monitor]# [root@jenkins monitor]# vim index.html //將里面的”移動能效管理平台“ 全部改成”GitLab+Jenkins自動化“ [root@jenkins monitor]# [root@jenkins monitor]# git add . [root@jenkins monitor]# [root@jenkins monitor]# git commit -m "update index.html" [root@jenkins monitor]# [root@jenkins monitor]# git push origin master
(7)訪問web站點,刷新頁面
(8)從上面頁面可以看見已經自動更新了代碼,接下來我們查看web服務器上面的web站點目錄
[root@web-nginx ~]# ll /usr/share/nginx 總用量 4 lrwxrwxrwx. 1 root root 23 3月 29 12:21 html -> web-2019-03-29-12-20-51 drwxr-xr-x. 2 root root 170 3月 27 22:03 modules drwxr-xr-x. 8 root root 4096 3月 29 12:20 web-2019-03-29-12-20-51 [root@web-nginx ~]# ls /usr/share/nginx/html/ 404.html efficiencyAnalysis.html js other-components.html alerts.html energy_consumption.html keyInfo.html profile-page.html assets file-manager.html labels.html QHME.iml buttons.html fonts LICENSE readme.md calendar.html form-components.html list-view.html real-time.html charts.html form-elements.html login.html sa.html components.html form-examples.html media tables.html content-widgets.html form-validation.html media.html test.txt css images-icons.html messages.html typography.html deviceManager.html img mstp_105_SuperAdmin.iml userMng.html dianfei.html index.html mstp_map.html
從上面我們可以看到站點目錄多了一個“web-2019-03-29-12-20-51”目錄, 且與html目錄做了一個軟鏈接,這樣每次更新代碼都會新建一個目錄與站點目錄做軟鏈接,(好處,如果開發發現代碼有bug,還可以及時回滾到前面的版本)至此,就完成了自動更新代碼。
配置構建Jenkins返回構建狀態到gitlab
(1)先在gitlab上面生成訪問令牌token,點擊用戶處的設置
(2)訪問令牌——>輸入名稱——>選擇范圍為api——>創建個人訪問令牌,將生成的令牌token復制
(3)登錄Jenkins——>選擇系統管理——>選擇系統設置——>選擇Gitlab——輸入名字——>輸入URL——點擊Add
(4)上面點擊Add進來后,kind處選擇Gitlab API token,粘貼上面復制的token,自定義ID和描述
(5)上面添加后,回到這里選擇剛剛生成的這個token。然后點擊保存
(6)上面保存后,進入到項目里選擇配置,配置構建后操作,選擇Publish ... to ...Gitlab,選擇后直接保存就ok
(7)測試,點擊立即構建
(8)回到gitlab上面查看,那里生成了一個對號
(9)點擊對號,進來后可以看到流水線,下面一些信息,比如狀態,提交等。
(10)點擊上面Status下面的對號,可以看到如下圖一樣的有個jenkins-success
(11)再點擊jenkins就跳轉到jenkins上面去了,也可以查看輸出,還可以查看工作空間,可以查看到所有代碼,返回的話只能選擇后退。
以上就完成了配置構建狀態返回到gitlab