jar包部署,jenkins整合java

不太聪明的大鹅發表於2024-07-19

java專案的部署方式

目前市場上,部署java web的方式,主要有倆方案

1. 開發交付給運維的是一個(*.war) zip型別的壓縮包,這個壓縮包裡包含了網站的thml,配置檔案,以及java程式碼,運維只需要提供應用容器(tomcat)即可釋出這個java網站。(集團型的中大型公司,用該方案)

2. 目前網際網路公司以devops開發模式,快速迭代模型,並且java後端誕生spring Boot框架,最終開發交付的產物是(*.jar)也是zip型別的壓縮包,且springboot該框架內建了應用容器(tomcat),最終運維只需要(jar -jar *.jar)即可執行java網站

war和jar部署區別

1. 運維拿到了war包,需要安裝tomcat,將war包放入tomcat的webapps目錄,該壓縮包自動解壓縮,然後即可訪問

2.運維拿到了jar包,無須自己部署tomcat,直接jar -jar *.jar執行專案程序即可

3. 運維需要自己打包java原始碼,生成jar包
- 進入專案根目錄,執行maven打包命令,maven命令是java專案的編譯打包工具
- maven命令自動讀取pom.xml配置檔案,安裝依賴關係
- 在專案根目錄下執行命令:mvn clean install,會在專案根目錄的target目錄下生成一個jar檔案
- 接著輸入命令:java -jar target\springboot-0.0.1-SNAPSHOT.jar

jar包的玩法一,沒有jar包,只有原始碼目錄,用maven對原始碼進行打包-----------------------------------

# 1.安裝maven工具
yum install maven -y

[root@db-51 /opt/springboot-test]#mvn -version
Apache Maven 3.0.5 (Red Hat 3.0.5-17)
Maven home: /usr/share/maven
Java version: 1.8.0_332, vendor: Red Hat, Inc.
Java home: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.332.b09-1.el7_9.x86_64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-862.el7.x86_64", arch: "amd64", family: "unix"
[root@db-51 /opt/springboot-test]#



# 2. 下載java原始碼
git clone https://gitee.com/yuco/springboot-test.git

#3. 進入原始碼目錄,

[root@db-51 /opt/springboot-test]#ll
total 28
-rw-r--r-- 1 root root 9114 Feb 25 09:33 mvnw
-rw-r--r-- 1 root root 5811 Feb 25 09:33 mvnw.cmd
-rw-r--r-- 1 root root 2134 Feb 25 09:33 pom.xml
drwxr-xr-x 4 root root   30 Feb 25 09:33 src
-rw-r--r-- 1 root root  643 Feb 25 09:33 專案說明.text

# 找到maven的配置檔案目錄,yum安裝的,預設都在etc目錄下,換成阿里雲的倉庫
/etc/maven/settings.xml 
修改如下
   <mirror>
           <id>alimaven</id>
           <mirrorOf>central</mirrorOf>
           <name>aliyun maven</name>
           <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
       </mirror>

# 4.先打包,生成jar包,maven自動下載專案的依賴
[root@db-51 /opt/springboot-test]#mvn clean package
期望結果如下
[INFO] Replacing main artifact with repackaged archive
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1:14.183s
[INFO] Finished at: Fri Feb 25 09:47:31 CST 2022
[INFO] Final Memory: 32M/203M
[INFO] ------------------------------------------------------------------------

# 5.進入 target目錄, 啟動,執行打包的jar包,檢視程序
java -jar springboot-helloword-1.jar

# 客戶端訪問,具體的url,要開發給你寫好文件,否則你不一定知道訪問啥

# 檢視如果修改了原始碼,如何更新的邏輯?
# 運維要理解,原始碼編譯為jar包,後續的原始碼更新,要再次打包

jar包的玩法二,直接發給你了一個 *.jar包,運維需安裝java,執行jar包就完事

1.安裝jdk

1. 可以oracle官網下載
http://www.oracle.com/technetwork/java/javase/downloads/index.html

2. 用準備好的包,解壓
jdk-8u221-linux-x64.tar.gz


3. 配置jdk的環境變數,java會要求生成2特殊變數

JAVA_HOME jdk的家目錄
CLASSPATH  java程式的類庫目錄路徑,相對於JAVA_HOME而言的


[root@tomcat-10 /opt]#ll
total 199440
-rw-r--r-- 1 root root   9128610 Jul 16 15:21 apache-tomcat-8.0.27.tar.gz
drwxr-xr-x 7   10  143       245 Jul  4  2019 jdk1.8.0_221
-rw-r--r-- 1 root root 195094741 Jul 16 15:21 jdk-8u221-linux-x64.tar.gz


配置軟連線
[root@tomcat-10 /opt]#ln -s  /opt/jdk1.8.0_221/  /opt/jdk8 
[root@tomcat-10 /opt]#
[root@tomcat-10 /opt]#
[root@tomcat-10 /opt]#ll
total 199440
-rw-r--r-- 1 root root   9128610 Jul 16 15:21 apache-tomcat-8.0.27.tar.gz
drwxr-xr-x 7   10  143       245 Jul  4  2019 jdk1.8.0_221
lrwxrwxrwx 1 root root        18 Jul 26 10:49 jdk8 -> /opt/jdk1.8.0_221/
-rw-r--r-- 1 root root 195094741 Jul 16 15:21 jdk-8u221-linux-x64.tar.gz


# 加入如下PATH設定

sed -i.ori '$a export JAVA_HOME=/opt/jdk8\nexport PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH\nexport CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar' /etc/profile



4. 檢查java環境
[root@tomcat-10 /opt]#java -version
java version "1.8.0_221"
Java(TM) SE Runtime Environment (build 1.8.0_221-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)

二執行jar包,訪問url

java -jar halo-1.1.0.jar 

jenkins部署Java專案,jar包---------------------------------------------------

專案架構

構建流水線

# 運維,透過搭建java專案的構建流水線
#  1.  gitlab 拉去java專案原始碼
# 2. jenkens環節,進行原始碼編譯,打包生成 jar包
# 3. jenkins把這些jar包發到目標伺服器上(web7,web8兩臺機器)
# 4. 分別再2機器,執行jar包就完事

構建伺服器環境檢查

1 java環境

[root@jenkins-100 ~]#java -version
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)

2 maven環境

[root@jenkins-100 ~]#mvn -version
-bash: mvn: command not found

準備好的maven rpm包安裝

#準備好安裝包,解壓縮,配置PATH變數
[root@jenkins-100 /opt/maven339/apache-maven-3.3.9/bin]#ll /opt/maven339/apache-maven-3.3.9-bin.tar.gz 
-rw-r--r-- 1 root root 8491533 Jul 14 12:01 /opt/maven339/apache-maven-3.3.9-bin.tar.gz

[root@jenkins-100 /opt/maven339/apache-maven-3.3.9/bin]#tail -2 /etc/profile
export PATH=$PATH:/opt/mysql5.7.28/bin/:/opt/sonarqube-all/sonar-scanner-4.0.0.1744-linux/bin:/opt/maven339/apache-maven-3.3.9/bin:/opt/node/bin

# 檢視mvn命令的環境
[root@jenkins-100 ~]#mvn -version
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T00:41:47+08:00)
Maven home: /opt/maven339/apache-maven-3.3.9
Java version: 1.8.0_181, vendor: Oracle Corporation
Java home: /usr/java/jdk1.8.0_181-amd64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-862.el7.x86_64", arch: "amd64", family: "unix"

3 部署maven

修改maven打包工具的 依賴源地址,改為阿里雲的
# 注意如何找maven的家目錄

[root@jenkins-100 ~]#mvn -version
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T00:41:47+08:00)
Maven home: /opt/maven339/apache-maven-3.3.9
Java version: 1.8.0_181, vendor: Oracle Corporation
Java home: /usr/java/jdk1.8.0_181-amd64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-862.el7.x86_64", arch: "amd64", family: "unix"


# 找到maven工具的家目錄,配置檔案
ls  /opt/maven339/apache-maven-3.3.9
 
146   <mirrors>
147     <!-- mirror
148      | Specifies a repository mirror site to use instead of a given repository. The repository that
149      | this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used
150      | for inheritance and direct lookup purposes, and must be unique across the set of mirrors.
151      |
152     <mirror>
153       <id>mirrorId</id>
154       <mirrorOf>repositoryId</mirrorOf>
155       <name>Human Readable Name for this Mirror.</name>
156       <url>http://my.repository.com/repo/path</url>
157     </mirror>
158      -->
159    <!-- 阿里雲倉庫 -->
160        <mirror>
161            <id>alimaven</id>
162            <mirrorOf>central</mirrorOf>
163            <name>aliyun maven</name>
164            <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
165        </mirror>
166   </mirrors>
167 

jenkins檢查

有很多外掛預設就已經安裝了,需要我們安裝的並不多。

需要安裝外掛如下:

Git plugin
Maven Integration plugin
Publish Over SSH
DingTalk Plugin
從系統管理>外掛管理>可選外掛>搜尋外掛>勾選安裝,點選直接安裝即可

https://mirrors.tuna.tsinghua.edu.cn/jenkins/plugins/publish-over-ssh/1.19/publish-over-ssh.hpi

這個ssh外掛,版本問題直接下載不了,下載低版本然後匯入即可


配置jenkins支援maven

配置jdk

配置maven

配置ssh,遠端連線機器

需要jenkins額外安裝 publish over ssh
遠端ssh免密登入的外掛

systemctl restart jenkins
重啟後,配置ssh的免密登入

jenkins機器,釋出jar包到web7 web8機器


先免密登入

[root@jenkins-100 ~]#ssh-copy-id root@10.0.0.7
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed


/usr/bin/ssh-copy-id: WARNING: All keys were skipped because they already exist on the remote system.
		(if you think this is a mistake, you may want to use -f option)

[root@jenkins-100 ~]#
[root@jenkins-100 ~]#ssh-copy-id root@10.0.0.8
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed

/usr/bin/ssh-copy-id: WARNING: All keys were skipped because they already exist on the remote system.
		(if you think this is a mistake, you may want to use -f option)


[root@jenkins-100 ~]#ssh root@10.0.0.7 "hostname"
web-7
[root@jenkins-100 ~]#ssh root@10.0.0.8 "hostname"
web-8



# 拿著jenkisn的私鑰做驗證

# 設定檔案發到目標機器的,/opt/jenkins-sh/目錄,得先建立

#先jenkins機器,進行遠端檢查

給jenkins配置 ssh外掛的私鑰即可

配置解釋
公共配置:
Passphrase:不用設定
Path to key:key檔案(私鑰)的路徑
Key:將私鑰複製到這個框中
Hostname:需要連線ssh的主機名或ip地址(建議ip)
Username:使用者名稱
Remote Directory: ssh服務,連線到目標機器的哪個目錄
Name:隨意起名代表這個服務,待會要根據它來選擇

Author : www.xxx.cn

高階配置:
Disable exec:禁止執行命令,這個不要勾選,否則沒法執行命令
Use password authentication, or use a different key:可以替換公共配置(選中展開的就是公共配置的東西,這樣做擴充套件性很好)
Port:埠(預設22)
Timeout (ms):超時時間(毫秒)預設即可

配置完成後Test Configuration下,提示success的話就沒問題。

至此,可以實現jenkins發檔案目標機器 web7 web8的/opt/jenkins-sh/資料夾了

建立Jenkins任務


勾選丟棄舊的構建

git原始碼管理

這裡直接用的匯入原始碼

新建gitlab倉庫
匯入該碼雲的倉庫即可
https://gitee.com/yuco/springboot-test.git


jenkins設定

構建觸發器webhook設定




找到gitlab的程式碼倉庫,整合jenkins的push事件

構建環境設定

最後一步動作,給jenkins的job,新增mvn的構建引數
實現java原始碼拉去
執行mvn命令
具體對原始碼的編譯引數,還未設定

填入mvn的構建引數
clean install -Dmaven.test.skip=true

都是在當前job工作去下的 target目錄中,得到jar包

將jar包傳送給目標機器

這裡的配置是jenkins 遠端執行,遠端機器上的一個指令碼

Source files配置:arget/person-0.0.1-SNAPSHOT.jar 專案jar包名
Remove prefix:target/
Remote directory:Jenkins-in/ 應用伺服器的傳送目錄地址
Exec command:Jenkins-in/build.sh 應用伺服器對應的shell指令碼

最後去
web7 web8 ,設定執行java程式的指令碼

/opt/jenkins-sh/deploy-java.sh

釘釘設定

構建結果,寫入到釘釘,發個通知,實際運用的效果


部署指令碼開發

再web7  和 web8機器準備

mkdir -p /opt/jenkins-sh/

cat > /opt/jenkins-sh/deploy-java.sh << 'EOF'
#!/bin/bash

#格式化時間,年月日
DATE=$(date +%Y%m%d)

#設定程式目錄,設定一個java專案的備份目錄,因為會多次構建
# 希望保留之前的舊的版本,而不是直接覆蓋

# 這個 web7 ,web8的用於,儲存jar包的目錄
DIR=/usr/local/app

#設定Jar名稱,也就是jenkins構建maven build後的產物
# 填入你的java程式,打包後的檔名

JARFILE=springboot-helloword-1.jar



#判斷是否存在backp目錄,如果不儲存就建立
# 如果備份目錄不存在,則建立
# 再程式碼目錄下,建立一個backup資料夾
# 舊的jar包,會放入 /usr/local/app/backup目錄

if [ ! -d $DIR/backup ];then
   mkdir -p $DIR/backup
fi

# 進入到web7,或 web8的 jar包,釋出目錄
cd $DIR

#殺掉當前執行的舊程式
# 幹掉舊的java程式
ps -ef | grep $JARFILE | grep -v grep | awk '{print $2}' | xargs -i kill -9 {}

#備份舊程式
# 移動當前的jar檔案 到 backup目錄下,且加上時間

mv $JARFILE $DIR/backup/$JARFILE$DATE


#部署新程式
# 將jenkins發來的jar包,放入 當前的 jar包釋出目錄 /usr/local/app

mv -f /opt/jenkins-sh/target/$JARFILE .


# 至此就實現了,舊的jar包,放入了 /usr/local/app/bakcup/
# 新的jar包,/usr/local/app

# 然後可以啟動新程式了

echo "The service will be starting"

#後臺啟動程式並設定Jvm引數、開啟JMX、列印GC日誌
# java  -jar  springboot-helloword-1.jar

# 到這,等於實現,釋出指令碼,實現了更新程序,備份舊得jar包
# 啟動 新的程序
# 聽懂111111,課下自己手寫,這個程式碼


# 給大家模擬 一個生產環境下,會有很多的最佳化引數

java -server -Xms1024M -Xmx1024M -XX:PermSize=256M \
-XX:MaxPermSize=256M -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDetails \
-Xloggc:./gc.log \
-Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=127.0.0.1 \
-Dcom.sun.management.jmxremote.port=10086 -Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dserver.address=0.0.0.0 -Dserver.port=18888 \
-jar $JARFILE  --spring.profiles.active=dev > /nohup 2>&1>out.log &

# 如果上述java啟動jar包命令,正確的話,等待30秒,檢視執行日誌

if [ $? = 0 ];then
        sleep 30
        tail -n 50 out.log
fi

# 進入備份目錄,刪除舊資料
# 此時再 /usr/local/app/

cd backup/

# 清理舊的jar包,保留有5箇舊版本的備份

# 基於 ls -lt的引數,基於時間對檔案排序
# 備份的jar檔案超過5個了,刪除最舊的那個檔案
# 可以多次構建,檢視指令碼的執行結果

ls -lt|awk 'NR>5{print $NF}'|xargs rm -rf

echo "starting success!!!"
EOF

給指令碼加上執行許可權
chmod +x /opt/jenkins-sh/deploy-java.sh

點選立即構建
測試觸發push鉤子

排bug 拍地雷

地雷1,jenkins的ssh遠端執行指令碼引數錯誤
錯誤在於,jenkins想遠端執行指令碼,發現指令碼路徑找不到,相對路徑

地雷2,遠端機器,執行指令碼,缺少java環境

web7

web8 裝java環境

相關文章