前言
記錄 Jenkins + gitlab + maven
自動打包部署後端專案詳細過程!
需求背景
不會偷懶的程式設計師不是好碼農,傳統的專案部署,有時候採用本地手動打包,再通過ssh
傳到伺服器部署執行,這種方式對於單應用部署還算可以,不會耗費太大時間,但假如分散式專案,拆分為多個微服務部署,那麼每個服務都打包部署一遍,釋出上線可能會耗時非常久,Jenkins + gitlab + maven
可以實現自動打包,部署到遠端伺服器~
什麼是gitlab
?
程式設計師肯定都懂的,跟gayhub
一樣的東西,可以在內網自己搭建一套來管理專案程式碼。
什麼是Jenkins
?
可以簡單地理解為可以代替你實現自動從gitlab
拉取程式碼,打包,部署到遠端伺服器的工具。
環境準備
- Centos7 64位,核心版本不低於 3.10
- 安裝 docker ,具體參考 這是一次 docker 入門實踐
使用docker
安裝gitlab
gitlab
的安裝這裡不做過多記錄,可以參考以下內容:
使用docker
安裝Jenkins
docker run -d --name jenkins --privileged=true -v /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime -v /etc/timezone:/etc/timezone -v /home/docker/data/jenkins_home:/var/jenkins_home -p 8090:8080 -p 50000:50000 --env JAVA_OPTS=-Dhudson.util.ProcessTree.disable=true jenkins/jenkins:lts
複製程式碼
引數解析:
--name jenkins
:指定Jenkins
容器名稱--privileged=true
:防止docker
容器沒有許可權-d
:容器在後臺啟動-v /home/docker/data/jenkins_home:/var/jenkins_home
:將容器的/var/jenkins_home
對映到本機的/home/docker/data/jenkins_home
目錄,為了便於管理Jenkins
容器的資料,需要注意的是,掛載出來的目錄允許我們往容器裡面新增檔案或者目錄,也就是在/home/docker/data/jenkins_home:/var/jenkins_home
中新增的檔案或者目錄都會被對映到容器目錄/var/jenkins_home
,那麼我們最終在Jenkins
中配置軟體環境時應當使用容器目錄路徑,因為Jenkins
實際上是在容器中跑的,比如JDK
家目錄,你放在/home/docker/data/jenkins_home/jdk_home
,那麼最終配置應當寫成/var/jenkins_home/jdk_home
-p 8090:8080 -p 50000:50000
:將容器的8080
埠對映到本機的8090
埠,5000
埠對映為5000
埠JAVA_OPTS=-Dhudson.util.ProcessTree.disable=true
:指定引數,取消Jenkins
自動部署後,殺死應用程式的坑-v /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime -v /etc/timezone:/etc/timezone
:解決時區問題jenkins/jenkins:lts
:指定映象名稱跟 tag
可能會踩的坑:
chmod 777 /home/docker/data/jenkins_home
chown -R 1000 /home/docker/data/jenkins_home
複製程式碼
至此,Jenkins
已經部署好了,然而....折騰才剛剛開始...
Jenkins
基礎配置
- 訪問
http://192.168.2.219:8090
開啟Jenkins
首頁如下圖:
按照介面提示,為了管理員安全地設定Jenkins
,已將密碼寫入日誌檔案:/var/jenkins_home/secrets/initialAdminPassword
,提示寫的是Jenkins
容器中的檔案,對映到本機檔案則是/home/docker/data/jenkins_home/secrets/initialAdminPassword
,複製檔案中的文字,輸入,點選繼續...滴滴滴~掉坑裡了。
- 如果不出意外的話,這裡有個坑,上一步之後會一直卡在如下圖所示的載入介面:
這是怎麼肥事? 原來Jenkins
在啟動的時候,請求Google
,檢查當前機器是否可以聯網,在請求/home/docker/data/jenkins_home/updates/default.json
中存在如下資料:
而由於天朝的網路原因,請求Google
失敗,則一直卡住,解決辦法是修改為www.baidu.com
即可解決。
- 選擇下載推薦的外掛,還是自選外掛,這裡我選擇下載推薦的外掛,然後進入下載loading
- 建立管理員賬號
- 配置
Jenkins
資源url
,使用預設即可
至此,Jenkins
基礎配置完成,開始使用。隨後登入Jenkins
後發現頁面空白,沒找到具體原因,重啟下Jenkins
容器後再登入就好了。
Jenkins
外掛安裝
Jenkins
外掛安裝的步驟為:系統管理-->外掛管理.. 相信聰明的你一定知道怎麼安裝了。我們需要安裝的外掛如下:
Maven
專案外掛:Maven Integration plugin
,這個外掛可以讓我們建立一個maven
構建任務ssh
傳輸工具外掛:Publish Over SSH
專案打包完成後,使用這個外掛,通過ssh
的方式傳輸到遠端伺服器Gitlab
外掛:允許Jenkins
訪問gitlab
伺服器,拉取程式碼
全域性工具配置
系統管理-->全域性工具配置,安裝一些打包必須的配置環境,如 jdk
,maven
,git
,maven
安裝git客戶端:
-
下載
#下載 git yum update yum install git # 配置用於拉取gitlab程式碼的使用者名稱和郵箱 git config --global user.name "yourname" git config --global user.email "youremail" 複製程式碼
-
配置公鑰
生成ssh
祕鑰, 首先檢視是否已經有ssh祕鑰:
cd ~/.ssh`
複製程式碼
如果沒有則提示沒有此資料夾, 此時手動生成祕鑰:
ssh-keygen -t rsa -C “youremail”
複製程式碼
連續按三次回車,生成id_rsa
和id_rsa.pub
資料夾,檢視公鑰檔案內容:cat id_rsa.pub
,複製公鑰到gitlab
配置ssh key
.
- 測試
ssh -T git@192.168.2.219
複製程式碼
如下結果表示配置成功:
The authenticity of host '192.168.2.210 (192.168.2.210)' can't be established.
RSA key fingerprint is SHA256:7oKBkxcwp5naXUzohvjPwEJsow6Y/pF1fSpWFZPVscA.
RSA key fingerprint is MD5:9c:a1:39:7c:2c:6c:d0:a2:4b:e8:8d:3a:73:6e:c9:c1.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.2.210' (RSA) to the list of known hosts.
Welcome to GitLab, jenkins_easywits!
複製程式碼
最終配置如下圖:
安裝 jdk:
如圖:
安裝maven:
如圖:
新增憑據
憑據是為了訪問Gitlab
拉取程式碼使用的,分別建立三個憑據:賬號密碼型別,api token
訪問型別,git
私鑰訪問型別,總體配置如下圖:
解析:
- 賬號密碼型別憑據,只需要上
gitlab
建立一個賬戶,同時這個賬戶擁有訪問專案倉庫的許可權即可。 api token
型別則是使用上述步驟建立的賬戶登入GitLab
,去生成一個訪問令牌,如下圖:
git
私鑰訪問型別,拷貝git
客戶端私鑰配置即可,如下圖:
全域性系統配置
系統管理-->系統配置。。主要是配置訪問GitLab
伺服器拉取程式碼,還有配置`ssh`遠端伺服器地址,目的是為了打包後上傳檔案到遠端伺服器。
GitLab
配置如下圖,使用git api token
依據訪問:
ssh
遠端伺服器配置如下圖,主要配置遠端主機名,主機ip,使用者名稱/密碼,還有遠端根目錄從/開始:
至此,所有配置完成,可以建立構建任務了。
實戰場景,自動部署web專案
- 建立一個
maven
構建任務
- 專案資訊描述,指定遠端連線
gitlab
- 配置構建的快取數量
- 拉取遠端程式碼配置
- 構建觸發器配置
- 打包配置
- 打包後操作,配置
ssh
傳輸到遠端伺服器,執行遠端shell
指令碼
最後儲存,點選構建按鈕,即可自動打包,並且部署到遠端tomcat
伺服器。遠端shell
指令碼如下:
#!/bin/bash
# 配置java環境變數
export JAVA_HOME=/usr/java/jdk/jdk1.8.0_161 # jdk 根目錄
export JRE_HOME=/usr/java/jdk/jdk1.8.0_161/jre # jre 目錄
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$JAVA_HOME:$PATH
# 配置tomcat環境變數
export CATALINA_BASE=/home/wwwroot/easywits-operation/tomcat-easywits-operation
export CATALINA_HOME=/home/wwwroot/easywits-operation/tomcat-easywits-operation
export TOMCAT_HOME=/home/wwwroot/easywits-operation/tomcat-easywits-operation
echo "stopping tomcat_easywits_operation......"
#關閉tomcat
port=xxxx
#根據埠號查詢對應的pid
pid=$(netstat -nlp | grep :$port | awk '{print $7}' | awk -F"/" '{ print $1 }');
#殺掉對應的程式,如果pid不存在,則不執行
if [ -n "$pid" ]; then
kill -9 $pid;
fi
#刪除tomcat舊war包
rm -rf /home/wwwroot/easywits-operation/tomcat-easywits-operation/webapps/easywits
rm -rf /home/wwwroot/easywits-operation/tomcat-easywits-operation/webapps/easywits.war
#複製war包到tomcat/webapps目錄,並重新命名
cp /home/wwwroot/easywits-operation/deploy_history/easywits.war /home/wwwroot/easywits-operation/tomcat-easywits-operation/webapps/easywits.war
# 檔名 + 當前日期時間錯,備份釋出檔案包
#DEPLOY_DATE=`date +%Y%m%d%H%M%S`
#DEPLOY_FILE_NAME=easywits-op-server_$DEPLOY_DATE.war
#mv /home/wwwroot/easywits-operation/deploy_history/easywits.war /home/wwwroot/easywits-operation/deploy_history/$DEPLOY_FILE_NAME
rm -rf /home/wwwroot/easywits-operation/deploy_history/*
echo "restarting tomcat_easywits_operation......"
sleep 5
/home/wwwroot/easywits-operation/tomcat-easywits-operation/bin/startup.sh
複製程式碼
整個shell
指令碼很常規,就是將檔案複製到tomcat
的webapp
目錄下,並重啟。
- 部署結果,看看日誌資訊如下,表示成功:
提交程式碼,自動打包部署
當gitlab
程式碼倉庫發生事件:提交程式碼等操作時,觸發打包部署動作
Jenkins
配置
GitLab
程式碼倉庫配置
這樣,當推送程式碼到指定程式碼倉庫時候就會觸發自動打包部署啦!
總結
Jenkins
自動打包部署操作,理論上跟本地打包部署是一個道理,該安裝的環境一個不能少,只不過可以自動化罷了Jenkins
可以做的事情還有很多,配置太多啦,一篇文章也只能做個引導作用,更多配置還是需要多看
最後
記錄一個自動部署的操作,後續會不定期更新原創文章,歡迎關注公眾號 「張少林同學」!