解放雙手 | Jenkins + gitlab + maven 自動打包部署專案

張少林同學發表於2019-01-16

解放雙手 | Jenkins + gitlab + maven 自動打包部署專案

前言

記錄 Jenkins + gitlab + maven 自動打包部署後端專案詳細過程!

需求背景

不會偷懶的程式設計師不是好碼農,傳統的專案部署,有時候採用本地手動打包,再通過ssh傳到伺服器部署執行,這種方式對於單應用部署還算可以,不會耗費太大時間,但假如分散式專案,拆分為多個微服務部署,那麼每個服務都打包部署一遍,釋出上線可能會耗時非常久,Jenkins + gitlab + maven 可以實現自動打包,部署到遠端伺服器~

什麼是gitlab

程式設計師肯定都懂的,跟gayhub一樣的東西,可以在內網自己搭建一套來管理專案程式碼。

什麼是Jenkins

可以簡單地理解為可以代替你實現自動從gitlab拉取程式碼,打包,部署到遠端伺服器的工具。

環境準備

使用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基礎配置

  1. 訪問http://192.168.2.219:8090開啟Jenkins首頁如下圖:

解放雙手 | Jenkins + gitlab + maven 自動打包部署專案

按照介面提示,為了管理員安全地設定Jenkins,已將密碼寫入日誌檔案:/var/jenkins_home/secrets/initialAdminPassword,提示寫的是Jenkins容器中的檔案,對映到本機檔案則是/home/docker/data/jenkins_home/secrets/initialAdminPassword,複製檔案中的文字,輸入,點選繼續...滴滴滴~掉坑裡了。

  1. 如果不出意外的話,這裡有個,上一步之後會一直卡在如下圖所示的載入介面:

解放雙手 | Jenkins + gitlab + maven 自動打包部署專案

這是怎麼肥事? 原來Jenkins在啟動的時候,請求Google,檢查當前機器是否可以聯網,在請求/home/docker/data/jenkins_home/updates/default.json 中存在如下資料:

解放雙手 | Jenkins + gitlab + maven 自動打包部署專案

而由於天朝的網路原因,請求Google失敗,則一直卡住,解決辦法是修改為www.baidu.com即可解決。

  1. 選擇下載推薦的外掛,還是自選外掛,這裡我選擇下載推薦的外掛,然後進入下載loading

解放雙手 | Jenkins + gitlab + maven 自動打包部署專案

  1. 建立管理員賬號

解放雙手 | Jenkins + gitlab + maven 自動打包部署專案

  1. 配置Jenkins 資源 url,使用預設即可

解放雙手 | Jenkins + gitlab + maven 自動打包部署專案

至此,Jenkins 基礎配置完成,開始使用。隨後登入Jenkins後發現頁面空白,沒找到具體原因,重啟下Jenkins 容器後再登入就好了。

Jenkins外掛安裝

Jenkins外掛安裝的步驟為:系統管理-->外掛管理.. 相信聰明的你一定知道怎麼安裝了。我們需要安裝的外掛如下:

  • Maven專案外掛:Maven Integration plugin,這個外掛可以讓我們建立一個maven構建任務
  • ssh傳輸工具外掛:Publish Over SSH 專案打包完成後,使用這個外掛,通過ssh的方式傳輸到遠端伺服器
  • Gitlab外掛:允許Jenkins訪問gitlab伺服器,拉取程式碼

全域性工具配置

系統管理-->全域性工具配置,安裝一些打包必須的配置環境,如 jdkmavengitmaven

安裝git客戶端:

  1. 下載

    #下載 git
    yum update
    yum install git
    
    # 配置用於拉取gitlab程式碼的使用者名稱和郵箱
    git config --global user.name "yourname"
    git config --global user.email "youremail"
    複製程式碼
  2. 配置公鑰

生成ssh祕鑰, 首先檢視是否已經有ssh祕鑰:

cd ~/.ssh`
複製程式碼

如果沒有則提示沒有此資料夾, 此時手動生成祕鑰:

ssh-keygen -t rsa -C “youremail”
複製程式碼

連續按三次回車,生成id_rsaid_rsa.pub資料夾,檢視公鑰檔案內容:cat id_rsa.pub,複製公鑰到gitlab配置ssh key.

  1. 測試
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!
複製程式碼

最終配置如下圖:

解放雙手 | Jenkins + gitlab + maven 自動打包部署專案

安裝 jdk:

如圖:

解放雙手 | Jenkins + gitlab + maven 自動打包部署專案

安裝maven:

如圖:

解放雙手 | Jenkins + gitlab + maven 自動打包部署專案

新增憑據

憑據是為了訪問Gitlab拉取程式碼使用的,分別建立三個憑據:賬號密碼型別,api token訪問型別,git私鑰訪問型別,總體配置如下圖:

解放雙手 | Jenkins + gitlab + maven 自動打包部署專案

解析:

  • 賬號密碼型別憑據,只需要上gitlab建立一個賬戶,同時這個賬戶擁有訪問專案倉庫的許可權即可。
  • api token型別則是使用上述步驟建立的賬戶登入GitLab,去生成一個訪問令牌,如下圖:

解放雙手 | Jenkins + gitlab + maven 自動打包部署專案

  • git私鑰訪問型別,拷貝git客戶端私鑰配置即可,如下圖:

解放雙手 | Jenkins + gitlab + maven 自動打包部署專案

全域性系統配置

系統管理-->系統配置。。主要是配置訪問GitLab伺服器拉取程式碼,還有配置`ssh`遠端伺服器地址,目的是為了打包後上傳檔案到遠端伺服器。

GitLab配置如下圖,使用git api token依據訪問:

解放雙手 | Jenkins + gitlab + maven 自動打包部署專案

ssh遠端伺服器配置如下圖,主要配置遠端主機名,主機ip,使用者名稱/密碼,還有遠端根目錄從/開始:

解放雙手 | Jenkins + gitlab + maven 自動打包部署專案

至此,所有配置完成,可以建立構建任務了。

實戰場景,自動部署web專案

  1. 建立一個 maven 構建任務

解放雙手 | Jenkins + gitlab + maven 自動打包部署專案

  1. 專案資訊描述,指定遠端連線gitlab

解放雙手 | Jenkins + gitlab + maven 自動打包部署專案

  1. 配置構建的快取數量

解放雙手 | Jenkins + gitlab + maven 自動打包部署專案

  1. 拉取遠端程式碼配置

解放雙手 | Jenkins + gitlab + maven 自動打包部署專案

  1. 構建觸發器配置

解放雙手 | Jenkins + gitlab + maven 自動打包部署專案

  1. 打包配置

解放雙手 | Jenkins + gitlab + maven 自動打包部署專案

  1. 打包後操作,配置ssh傳輸到遠端伺服器,執行遠端shell指令碼

解放雙手 | Jenkins + gitlab + maven 自動打包部署專案

最後儲存,點選構建按鈕,即可自動打包,並且部署到遠端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指令碼很常規,就是將檔案複製到tomcatwebapp目錄下,並重啟。

  1. 部署結果,看看日誌資訊如下,表示成功:

解放雙手 | Jenkins + gitlab + maven 自動打包部署專案

提交程式碼,自動打包部署

gitlab程式碼倉庫發生事件:提交程式碼等操作時,觸發打包部署動作

  1. Jenkins配置

解放雙手 | Jenkins + gitlab + maven 自動打包部署專案

解放雙手 | Jenkins + gitlab + maven 自動打包部署專案

  1. GitLab程式碼倉庫配置

解放雙手 | Jenkins + gitlab + maven 自動打包部署專案

這樣,當推送程式碼到指定程式碼倉庫時候就會觸發自動打包部署啦!

總結

  • Jenkins 自動打包部署操作,理論上跟本地打包部署是一個道理,該安裝的環境一個不能少,只不過可以自動化罷了
  • Jenkins可以做的事情還有很多,配置太多啦,一篇文章也只能做個引導作用,更多配置還是需要多看

最後

記錄一個自動部署的操作,後續會不定期更新原創文章,歡迎關注公眾號 「張少林同學」!

解放雙手 | Jenkins + gitlab + maven 自動打包部署專案

相關文章