前言
記錄 Jenkins + gitlab + maven 自動打包部署后端項目詳細過程!
需求背景
不會偷懶的程序員不是好碼農,傳統的項目部署,有時候采用本地手動打包,再通過ssh傳到服務器部署運行,這種方式對於單應用部署還算可以,不會耗費太大時間,但假如分布式項目,拆分為多個微服務部署,那么每個服務都打包部署一遍,發布上線可能會耗時非常久,Jenkins + gitlab + maven 可以實現自動打包,部署到遠程服務器~
什么是gitlab?
程序員肯定都懂的,跟gayhub一樣的東西,可以在內網自己搭建一套來管理項目代碼。
什么是Jenkins?
可以簡單地理解為可以代替你實現自動從gitlab拉取代碼,打包,部署到遠程服務器的工具。
環境准備
- Centos7 64位,內核版本不低於 3.10
- 安裝 docker ,具體參考 這是一次 docker 入門實踐
使用`docker`安裝`gitlab`
gitlab的安裝這里不做過多記錄,可以參考以下內容:
-
https://www.cnblogs.com/zuxing/articles/9329152.html
-
https://hub.docker.com/r/beginor/gitlab-ce/
使用`docker`安裝`Jenkins`
1docker run --name jenkins --privileged=true -d -v /home/docker/data/jenkins_home:/var/jenkins_home -p 8090:8080 -p 50000:50000 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端口jenkins/jenkins:lts:指定鏡像名稱跟 tag
可能會踩的坑:
1chmod 777 /home/docker/data/jenkins_home
2chown -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客戶端:
-
下載
1#下載 git
2yum update
3yum install git
4
5# 配置用於拉取gitlab代碼的用戶名和郵箱
6git config --global user.name "yourname"
7git config --global user.email "youremail" -
配置公鑰
生成ssh秘鑰, 首先查看是否已經有ssh秘鑰:
1cd ~/.ssh`
如果沒有則提示沒有此文件夾, 此時手動生成秘鑰:
1ssh-keygen -t rsa -C “youremail”
連續按三次回車,生成id_rsa和id_rsa.pub文件夾,查看公鑰文件內容:cat id_rsa.pub,復制公鑰到gitlab配置ssh key.
- 測試
1ssh -T git@192.168.2.219
如下結果表示配置成功:
1The authenticity of host '192.168.2.210 (192.168.2.210)' can't be established.
2RSA key fingerprint is SHA256:7oKBkxcwp5naXUzohvjPwEJsow6Y/pF1fSpWFZPVscA.
3RSA key fingerprint is MD5:9c:a1:39:7c:2c:6c:d0:a2:4b:e8:8d:3a:73:6e:c9:c1.
4Are you sure you want to continue connecting (yes/no)? yes
5Warning: Permanently added '192.168.2.210' (RSA) to the list of known hosts.
6Welcome to GitLab, jenkins_easywits!
7
最終配置如下圖:

安裝 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腳本如下:
1#!/bin/bash
2# 配置java環境變量
3export JAVA_HOME=/usr/java/jdk/jdk1.8.0_161 # jdk 根目錄
4export JRE_HOME=/usr/java/jdk/jdk1.8.0_161/jre # jre 目錄
5export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
6export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$JAVA_HOME:$PATH
7
8# 配置tomcat環境變量
9export CATALINA_BASE=/home/wwwroot/easywits-operation/tomcat-easywits-operation
10export CATALINA_HOME=/home/wwwroot/easywits-operation/tomcat-easywits-operation
11export TOMCAT_HOME=/home/wwwroot/easywits-operation/tomcat-easywits-operation
12
13echo "stopping tomcat_easywits_operation......"
14#關閉tomcat
15port=xxxx
16#根據端口號查詢對應的pid
17pid=$(netstat -nlp | grep :$port | awk '{print $7}' | awk -F"/" '{ print $1 }');
18#殺掉對應的進程,如果pid不存在,則不執行
19if [ -n "$pid" ]; then
20 kill -9 $pid;
21fi
22#刪除tomcat舊war包
23rm -rf /home/wwwroot/easywits-operation/tomcat-easywits-operation/webapps/easywits
24rm -rf /home/wwwroot/easywits-operation/tomcat-easywits-operation/webapps/easywits.war
25#復制war包到tomcat/webapps目錄,並重命名
26cp /home/wwwroot/easywits-operation/deploy_history/easywits.war /home/wwwroot/easywits-operation/tomcat-easywits-operation/webapps/easywits.war
27# 文件名 + 當前日期時間錯,備份發布文件包
28#DEPLOY_DATE=`date +%Y%m%d%H%M%S`
29#DEPLOY_FILE_NAME=easywits-op-server_$DEPLOY_DATE.war
30#mv /home/wwwroot/easywits-operation/deploy_history/easywits.war /home/wwwroot/easywits-operation/deploy_history/$DEPLOY_FILE_NAME
31rm -rf /home/wwwroot/easywits-operation/deploy_history/*
32echo "restarting tomcat_easywits_operation......"
33sleep 5
34/home/wwwroot/easywits-operation/tomcat-easywits-operation/bin/startup.sh
35
整個shell腳本很常規,就是將文件復制到tomcat的webapp目錄下,並重啟。
- 部署結果,看看日志信息如下,表示成功:

提交代碼,自動打包部署
當gitlab代碼倉庫發生事件:提交代碼等操作時,觸發打包部署動作
Jenkins配置

GitLab代碼倉庫配置

這樣,當推送代碼到指定代碼倉庫時候就會觸發自動打包部署啦!
總結
Jenkins自動打包部署操作,理論上跟本地打包部署是一個道理,該安裝的環境一個不能少,只不過可以自動化罷了Jenkins可以做的事情還有很多,配置太多啦,一篇文章也只能做個引導作用,更多配置還是需要多看
最后
記錄一個自動部署的操作,后續會不定期更新原創文章,歡迎關注公眾號 「張少林同學」!

