記錄 Jenkins + gitlab + maven
自動打包部署後端項目詳細過程!html
不會偷懶的程序員不是好碼農,傳統的項目部署,有時候採用本地手動打包,再經過ssh
傳到服務器部署運行,這種方式對於單應用部署還算能夠,不會耗費太大時間,但假如分佈式項目,拆分爲多個微服務部署,那麼每一個服務都打包部署一遍,發佈上線可能會耗時很是久,Jenkins + gitlab + maven
能夠實現自動打包,部署到遠程服務器~java
什麼是gitlab
?git
程序員確定都懂的,跟gayhub
同樣的東西,能夠在內網本身搭建一套來管理項目代碼。程序員
什麼是Jenkins
?web
能夠簡單地理解爲能夠代替你實現自動從gitlab
拉取代碼,打包,部署到遠程服務器的工具。docker
docker
安裝gitlab
gitlab
的安裝這裏不作過多記錄,能夠參考如下內容:shell
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
複製代碼
參數解析:api
--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
便可解決。
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,用戶名/密碼,還有遠程根目錄從/開始:
至此,全部配置完成,能夠建立構建任務了。
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
能夠作的事情還有不少,配置太多啦,一篇文章也只能作個引導做用,更多配置仍是須要多看記錄一個自動部署的操做,後續會不按期更新原創文章,歡迎關注公衆號 「張少林同窗」!