1. 程式人生 > 其它 >Jenkins+svn自動化部署完整教程

Jenkins+svn自動化部署完整教程

1、概述

Jenkins 是一個可擴充套件的持續整合引擎。主要用於持續、自動地構建/測試軟體專案、監控一些定時執行的任務。Jenkins用Java語言編寫,可在Tomcat等流行的servlet容器中執行,也可獨立執行。通常與版本管理工具(SCM)、構建工具結合使用。常用的版本控制工具有SVN、GIT,構建工具有Maven、Ant、Gradle。

1.1 軟體環境配置

Centos7.0 64位

Vmware workstation 16.1

2、前期準備

安裝好JDK,Maven,Subversion

2.1 配置JDK環境

1、先檢視本地是否自帶java環境:

#yum list installed | grep java

2、解除安裝自帶的java(輸入su,輸入root超級管理員的密碼,切換到root使用者模式)

#yum -y remove java-1.8.0-openjdk*

#yum -y remove tzdata-java*

3、檢視yum倉庫中的java安裝包

#yum -y list java*

4、安裝java:

yum -y install java-1.8.0-openjdk*

(yum安裝java預設安裝目錄為usr/lib/jvm)

5、查詢Java安裝路徑

#which java

 

6、檢查Java是否安裝成功:java -version

 

7、新增Jenkins repo:

wget -O /etc/yum.repos.d/jenkins.repo

http://pkg.jenkins.io/redhat-stable/jenkins.repo

rpm --import http://pkg.jenkins.io/redhat-stable/jenkins.io.key

 

8、更新Jenkins repo cache:

#yum clean all

#yum makecache

 

9、新增JAVA_HOME環境變數:

#sudo vim /etc/profile

在檔案末尾新增如下程式碼:

export JAVA_HOME=/usr/java/jdk1.8.0_202/bin/java #(yum安裝時需指定Java可執行檔案,可避免報錯)

export JRE_HOME
=$JAVA_HOME/jre export PATH=${PATH}:${JAVA_HOME}/bin CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib

 

儲存檔案,並執行# source /etc/profile命令使環境變數生效:

在控制檯輸入#echo $JAVA_HOME命令,如果能看到相關路徑資訊,則說明JAVA已經配置成功:

 

2.2 配置Maven環境

Mavn 是一個基於 Java 的工具,所以要做的第一件事情就是安裝 JDK。

如果你還未安裝 JDK,請參考前文

2.2.1 系統要求

專案

要求

JDK

Maven 3.3 要求 JDK 1.7 或以上

Maven 3.2 要求 JDK 1.6 或以上

Maven 3.0/3.1 要求 JDK 1.5 或以上

記憶體

沒有最低要求

磁碟

Maven 自身安裝需要大約 10 MB 空間。除此之外,額外的磁碟空間將用於你的本地 Maven 倉庫。你本地倉庫的大小取決於使用情況,但預期至少 500 MB

作業系統

沒有最低要求

2.2.2 檢查 Java 安裝

作業系統

任務

命令

Windows

開啟命令控制檯

c:\> java -version

Linux

開啟命令終端

# java -version

Mac

開啟終端

$ java -version

 

2.2.3 Maven下載解壓、環境變數配置

Maven 下載地址:http://maven.apache.org/download.cgi(可自行下載後解壓)

Maven下載解壓及環境變數配置:

# wget http://mirrors.hust.edu.cn/apache/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz

# tar -xvf apache-maven-3.3.9-bin.tar.gz

# sudo mv -f apache-maven-3.3.9 /usr/local/

編輯 /etc/profile 檔案,:

#sudo vim /etc/profile

在檔案末尾新增如下程式碼:

export MAVEN_HOME=/usr/local/apache-maven-3.3.9

export PATH=${PATH}:${MAVEN_HOME}/bin

儲存檔案,並執行如下命令使環境變數生效:

# source /etc/profile

在控制檯輸入如下命令,如果能看到 Maven 相關版本資訊,則說明 Maven 已經安裝成功:

# mvn -v

 

2.3 配置Subversion

(此步驟非必須)之後鉤子程式的構建也可直接在遠端伺服器的svn副本操作

//安裝

#yum install subversion

//檢視版本

#svnserve --version

//建庫

#mkdir -p /data/svn

#cd /data/svn

#svnadmin create project

//修改啟動預設路徑

#vim /etc/sysconfig/svnserve

OPTIONS="-r /data/svn"

//修改配置

#vim /data/svn/project/conf/svnserve.conf

anon-access=none         //匿名使用者許可權

auth-access=write           //認證使用者許可權  

password-db=passwd          //指定使用者檔案

authz-db=authz        //使用者授權檔案

realm=project       //域,與庫名一致

//新增使用者

#vim /data/svn/project/conf/passwd

[users]

admin = admin_password

//新增授權

#vim /data/svn/project/conf/authz

[project:/]

admin = rw

//關閉selinux

#setenforce 0   或修改selinux配置檔案關閉

//啟動

#systemctl start svnserve

#systemctl enable svnserve

//檢視埠是否開啟,預設3690

#netstat -ntpl

//開啟防火牆

#firewall-cmd --add-port=3690/tcp

#firewall-cmd --add-port=3690/tcp --permanent

//測試

#mkdir /data/project

#cd /data/project

#svn co svn://localhost/project .    //最後有個點

#touch aaa.txt

#svn ci -m ""    //上傳

#svn list svn://localhost/project      //可看到aaa.txt則正常

//一些常用命令

#svn list    //當前版本號所有檔案

#svn log

#svn log filename -v

#svn log -r 1 -v   檢視特定版本號

#svn update -r version_no   更新至特定版本號

 

3、Jenkins配置

3.1 Jenkins安裝

3.1.1 離線安裝

## http://pkg.jenkins-ci.org/redhat/

#wget http://pkg.jenkins-ci.org/redhat/jenkins-2.39-1.1.noarch.rpm ## 下載(也可以Windows下載再用xftp傳過來)

#sudo rpm --import http://pkg.jenkins-ci.org/redhat/jenkins.io.key ## 公鑰

#sudo yum -y install jenkins-*.noarch.rpm

 

3.1.2 線上安裝

## http://pkg.jenkins-ci.org/redhat/

#sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat/jenkins.repo

#sudo rpm --import https://pkg.jenkins.io/redhat/jenkins.io.key

#sudo yum -y install jenkins

3.1.3 基於Tomcat 安裝

安裝並啟動 Tomcat;

從官網下載 jenkins.war 至 $CATALINA_BASE/webapps,Tomcat 會自動部署;

瀏覽器訪問:http://centos:8080/jenkins/

3.1.4 免安裝方式

#wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war

#sudo java -jar jenkens.war ## 啟動服務,直至看到日誌 `Jenkins is fully up and running`

#curl http://localhost:8080/ ## Jenkins 已就緒

 

注:jenkins檔案預設安裝路徑

       /usr/lib/jenkins/jenkins.war    war

       /etc/sysconfig/jenkins       配置檔案

       /var/lib/jenkins/        預設jenkins目錄

       /var/log/jenkins/jenkins.log    Jenkins日誌檔案

 

3.2 Jenkins訪問

3.2.1 啟動Jenkins訪問

    現在Jenkins已經安裝好了,不過啟動之前最好稍微修改一下配置。預設情況是Jenkins是使用Jenkins使用者啟動的,但這個使用者目前系統並沒有賦予許可權,這裡我們將啟動使用者修改為root;另外Jenkins預設埠是8080,這個跟tomcat的預設埠衝突,我們也修改一下預設埠。

## sudo vim /etc/sysconfig/jenkins

#JENKINS_USER="root" ## 原值 "jenkins" 最好修改,否則許可權不足

#JENKINS_PORT="8080" ## 原值 "8080"如埠衝突,可另行修改(這裡不做修改)

## 還有開啟 HTTPS 相關引數,此處不打算開啟,故不作說明

 

1、啟動jenkins,訪問

#systemctl daemon-reload            ## 重新載入配置檔案

#systemctl start jenkins            ## 啟動

 

2、jenkins預設埠8080,瀏覽器訪問 http://: 192.168.0.252:8080 訪問

 

3、輸入命令以找到密碼。

tail /var/lib/jenkins/secrets/initialAdminPassword

 

 

4、輸入密碼後,進入外掛安裝頁面。點選Install suggested plugins,安裝預設外掛。

 

 

 

5、安裝完成後,頁面會自動進入管理員賬戶註冊頁面,建立賬號

 

 

 

 

6、安裝完成後,進入主介面

 

 

3.3 Jenkins基本配置

3.3.1 全域性安全設定

預設情況下,任何使用者都可以使用 Jenkins 進行釋出。可以進入相關設定:系統管理 / 全域性安全設定(Configure Global Security),選擇 Jenkins專有使用者資料庫,不要選中 允許使用者註冊,選擇 登入使用者可以做任何事,選中 Allow anonymous read access

 

 

3.3.2 全域性工具配置

進入:系統管理 / 全域性工具設定(Global Tool Configuration)

JDK 下不勾選“自動安裝”,指定別名=JDK-1.8.0.121, JAVA_HOME=/usr/java/jdk1.8.0_202

Maven 下不勾選“自動安裝”,指定別名=Maven-3.8.1, MAVEN_HOME=/var/lib/apache-maven-3.8.1

點選 Save 按鈕。

 

3.3.3 外掛管理

首頁  >> Manager Jenkins(系統管理)   >> Manage Plugins(外掛管理)

Subversion    # 版本管理 SVN 的外掛

Maven Integration     # 專案構建 Maven 的外掛

Deploy To Container     # 部署tomcat外掛,為熱部署

Publish Over SSH           #部署tomcat外掛

確保這幾個外掛已經安裝,如果已安裝中沒有這幾個外掛,到可選外掛中搜索並安裝,安裝失敗可重試或者下載在“高階”介面通過hpi上傳

 

 

3.3.4 系統配置

首頁  >> Manager Jenkins(系統管理)   >> Configure System(系統管理)

別忘記新增Credentials(你的遠端伺服器的登陸使用者名稱和密碼)

 

 

 

4、自動化部署tomcat

4.1 tomcat專案配置

4.1.1 建立maven專案

首頁  >> New Item(新建任務)   >> Maven(構建一個maven專案)

 

注:如果沒有出現<構建一個maven專案>的選項,是因為沒裝maven外掛

 

4.1.2 General配置

 

4.1.3 Source Code Managment(原始碼管理)配置

 

注:svn原始碼地址需定位到pom.xml檔案的上一級,因為後面的Build構建操作就是要自動定位到pom.xml檔案進行構建

 

4.1.4 填寫svn的登入名和密碼 

 

 

4.1.5 Build Triggers(構建觸發器)配置

選中Build periodically:週期性進行專案構建,這個是到指定的時間必須觸發構建任務

選中Poll SCM:定時檢查原始碼變更,如果有更新就checkout最新code下來,然後執行構建動作

注:定時構建語法如下:(五顆星,中間用空格隔開)

* * * * *

第一顆*表示分鐘,取值0~59

第二顆*表示小時,取值0~23

第三顆*表示一個月的第幾天,取值1~31

第四顆*表示第幾月,取值1~12

第五顆*表示一週中的第幾天,取值0~7,其中0和7代表的都是週日

 

 

4.1.6 Build配置

Root POM:  pom.xml 

Goals and options: 指定 mvn 執行目標或選項,設定為 package -Dmaven.test.skip=true

 

一般配置到這裡可以先構建把war包打包下來,同時根據控制檯輸出找到工作空間位置,以及war包位置,如下圖工作空間為/var/lib/jenkins/jobs/CloudPayment/workspace

 

 

4.2 構建後操作

4.2.1 ssh部署

儲存後構建即可

附上autos.sh 及start.sh指令碼 (根據實際情況自行更改)

autos.sh

  1 #!/bin/bash
  2 #Time
  3 log_time=`date +[%Y-%m-%d]%H:%M:%S`
  4 
  5 ###manual_properties###
  6 
  7 tomcat_basehome=/data/tomcat8081
  8 
  9 tomcat_port=8080
 10 
 11 shell_environment=/bin/bash
 12 
 13 war_Dir=/var/lib/jenkins/workspace/CloudPayment/target
 14 
 15 war_Name=library.war
 16 
 17 war_home=/home/zencj/webapps
 18 
 19 backup_name=/data/backup/tomcat8081
 20 
 21 back_name=library
 22 
 23 ###manual_properties###
 24 
 25 
 26 #update server environment
 27 
 28 echo "**********************************  ${log_time} *************************************"
 29 
 30 echo "updating server  environment start"
 31 
 32 export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.302.b08-0.el8_4.x86_64
 33 
 34 export JRE_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.302.b08-0.el8_4.x86_64/jre
 35 
 36 export PATH = $JAVA_HOME/bin:$PATH
 37 
 38 export CLASSPATH= .:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
 39 
 40 sleep 3
 41 
 42 echo "updating server  environment  end"
 43 
 44 
 45 #transfer  application package
 46 
 47 deploy_Loaction = ${tomcat_basehome}/webapps/
 48 
 49 war_Dir_Data=`ls ${war_Dir}`
 50 
 51 echo "--------------  begin  transfer  war package to tomcat webapps -------------------"
 52 
 53 
 54 if [ -z $war_Dir ];then
 55 
 56      echo "Folder ${war_Dir} is empty.please check war package in this folder!"
 57 
 58      exit 1
 59 
 60 else
 61 
 62      echo "Find ${war_Dir} exist war package ${war_Name}"
 63 
 64     # echo "deleteing old  package ${war_Name} in ${war_Dir}"
 65 
 66     # rm ${war_Dir}/${war_Name}
 67 
 68      echo "deleteing old  package ${war_Name} in ${deploy_Loaction}"
 69 
 70      echo "備份library.war"
 71 
 72      rm -rf ${backup_name}/${back_name}
 73 
 74      cp -r ${deploy_Loaction}/${war_Name} ${backup_name}
 75 
 76      rm ${deploy_Loaction}${war_Name}
 77 
 78      echo "start  transfer ${war_Name} to ${deploy_Loaction}"
 79 
 80      cp -r ${war_home}/${war_Name}  ${deploy_Loaction}
 81 
 82      echo "start chmod war"
 83 
 84      chmod 777 ${deploy_Loaction}/${war_name}
 85 
 86      sleep 3
 87 
 88 fi
 89 
 90 echo "--------------  transfer  war package to tomcat webapps  end -------------------"
 91 
 92 #reboot tomcat
 93 
 94 echo " >>>>>>>  rebooting  tomcat begin <<<<<<<<"
 95 
 96 cd ${deploy_Loaction}
 97 
 98 ./start.sh
 99 
100 echo "************************ deploy war package into container Successlly  **********************************"

start.sh

#!/usr/local/bin/expect -f
#Implementing interaction with the terminal command line

spawn sudo -s
 
expect "zengcj 的密碼:"
 
send "********\r"

expect "*#*"

send "docker restart tomcat8081\r"

expect "*#*"

send "exit\r"

 

4.2.2 tomcat熱部署

將構建後的war包部署到tomcat容器

1、Tomcat使用者配置

修改<tomcat_home>/conf/tomcat-users.xml,新增下列內容,建立對應的角色和使用者

<role rolename="manager-gui"/>

 

<role rolename="admin-gui"/>

 

<role rolename="manager-script"/>

 

<user username="tomcat" password="tomcat" roles="manager-gui,admin-gui,manager-script"/>

 

2、Tomcat訪問許可權配置

修改<tomcat_home>/webapps/manager/META-INF/context.xml 檔案中標籤的allow的值,去除訪問限制

修改前:

 

修改後:

 

 

3、Tomcat配置上傳的war包大小限制

修改<tomcat_home>/webapps/manager/WEB-INF/web.xml檔案,預設是50M

 

配置完成後,啟動tomcat

 

4、Post-build Actionsgoi(構建後操作)配置

選擇“Deploy war/ear to container”

 

 

儲存後即可開始構建

 

4.3 實現自動化

通過webhook鉤子程式實現,在SVN版本庫上提交程式碼後,自動觸發Jenkins上的某個Job。

4.3.1 webhook簡介

每個SVN版本庫都會有一個hooks目錄。裡面儲存了各種鉤子指令碼(shell)。

 


4.3.2 hooks觸發介紹

  

目錄下將有多個指令碼

1、  每一個都對應了一個事件。

2、  如果要使用,需要cp一份,去掉字尾,保持和事件名一樣。 hook可以用Shell,Python或其它語言寫。

3、  另外hook需要加可執行許可權,否則svn commit時會報錯:

#cp post-commit.tmpl post-commit

#chmod +x post-commit

4.3.3 事件說明

 

  以上表格資訊參考(侵刪):https://www.cnblogs.com/harrymore/p/8574134.html  


4.3.4 post-commit指令碼內容參考

post-commit本身就是一個Shell指令碼,我們只需要將期望的操作編寫進該指令碼內。SVN檢測到程式碼有變更後,就會來執行該指令碼。

#!/bin/bash
#SVN版本庫路徑

REPOS="$1"
 
#SVN版本號

REV="$2"

#獲取當前日期

DATE_TIME=`date +%y-%m-%d`
 
echo "$REPOS $DATE_TIME $REV" >> /tmp/text.txt

curl"http://192.168.136.132:8080/job/CloudPayment/build?token=zeng”

#指令碼內容完結
#備註:最後的curl就是去發起GET請求,前提是Jenkins-Job的觸發器配置好這個身份驗證令牌"zeng"

 

 

構建完成後即可實現SVN版本庫上提交程式碼後,自動從svn拉取程式碼,打包成library.war包,通過ssh上傳部署或tomcat熱部署到遠端伺服器上,實現自動化部署

 

5、Jenkins error自查

 下面總結在Jenkins部署過程中遇到的常見問題,並列出對應的解決方案,供讀者自查。

5.1 Exec timed out or was interrupted after 120,001 ms

1、現象

ERROR: Exception when publishing, exception message [Exec timed out or was interrupted after 120,001 ms]

Build step 'Send files or execute commands over SSH' changed build result to UNSTABLE

Finished: UNSTABLE

2、解決方案

       Jenkins的Job在執行 "Send files or execute commands over SSH" 的過程中超時了,預設超時時間為120000ms,也就是2分鐘。因此,解決方案有以下兩種:

縮短這一步驟的部署時間

將job的部署時間控制在2分鐘內即可。

配置更長的超時時間

Send build artifacts over SSH ---> Advanced ---> Exec timeout (ms) 中設定。

 

 

 

比如將超時時間調整為300000ms(也即5分鐘),問題解決。

 

5.2 Couldn't find any revision to build

1、現象

ERROR: Couldn't find any revision to build. Verify the repository and branch configuration for this job.

Finished: FAILURE

2、解決方案

       在Job的配置中,我們使用Git作為拉取程式碼的託管倉庫,但在部署過程中,不存在該分支或者版本號,導致Jenkins拉取不到對應Job的程式碼。解決方案為:在對應的原始碼管理中填寫正確的分支名稱或者正確的版本號。

Source Code Management  --> Branch Specifier (blank for 'any')

 

 

注意:如果配置了引數化構建過程,則需要保證預設值為正確的分支。

同時,如果使用了Jenkins的API進行呼叫,則需要保證輸入的分支名稱是正確存在的。

 

 

5.3 Could not create or change to directory

1、現象

SSH: Disconnecting configuration

ERROR: Exception when publishing, exception message [Could not create or change to directory. Directory xxx ]

Build step 'Send files or execute commands over SSH' changed build result to UNSTABLE

2、解決方案

       造成該錯誤的原因為Jenkins無法建立目錄,這主要是因為:"連線到該SSH的使用者沒有許可權" 或者 "伺服器的磁碟空間滿了"。

因此,針對上面兩種可能的情況,解決方案分別如下:

 連線到該SSH的使用者沒有許可權

針對這種情況,需要將該SSH使用者所操作的目錄,賦予許可權。操作命令為:

chown -R name:pwd /xxx

其中name,pwd為對應SSH使用者的賬號密碼,/xxx為需要賦予許可權的目錄名稱。注意必須要切換為root使用者下操作。

例子: chown -R  zz:123456  /zz/ms

伺服器的磁碟空間滿了

可以通過df,du命令檢視磁碟佔用情況,清掉無用的資源,騰出空間。

df -hl

du -h --max-depth=1

其中, df 命令是linux系統以磁碟分割槽為單位檢視檔案系統,可以加上引數檢視磁碟剩餘空間資訊。

而 du 命令可以檢視當前目錄下各資料夾的大小。

 

5.4 Build step 'Invoke top-level Maven targets' marked build as failure

1、現象

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.2:war (default-war) on project xxx: Failed to copy file for artifact [xxx:jar:0.0.1:compile]: File /root/.m2/repository/xxx/xxx/xxx/xxx.jar does not exist -> [Help 1]

org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.2:war (default-war) on project xxx: Failed to copy file for artifact [xxx:jar:0.0.1:compile]

at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:215)

at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:156)

at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:148)

at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:117)

at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:81)

at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:56)

at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128)

at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:305)

at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:192)

at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:105)

at org.apache.maven.cli.MavenCli.execute (MavenCli.java:956)

at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:288)

at org.apache.maven.cli.MavenCli.main (MavenCli.java:192)

[ERROR] Re-run Maven using the -X switch to enable full debug logging.

[ERROR] For more information about the errors and possible solutions, please read the following articles:

Build step 'Invoke top-level Maven targets' marked build as failure

Finished: FAILURE

2、解決方案

       這裡使用了Maven進行打包,且由 Failed to execute goal xxx 內容可以看出,這裡是Maven編譯打包過程中報錯。根據相應的提示排查專案程式碼即可。例如這裡的報錯內容為:/root/.m2/repository/xxx/xxx/xxx/xxx.jar 不存在,因此在Maven倉庫上傳這個jar包即可。

 

5.5 Failed to connect and initialize SSH connection

1、現象

SSH: Connecting from host [JR-JDH-SITAPP3]

SSH: Connecting with configuration [10.0.17.234-jdh] ...

ERROR: Exception when publishing, exception message [Failed to connect and initialize SSH connection. Message: [Failed to connect SFTP channel. Message [failed to send channel request]]]

Build step 'Send files or execute commands over SSH' changed build result to UNSTABLE

Finished: UNSTABLE

2、解決方案

       由報錯提示可知,在SSH階段,Jenkins無法與需要連線到的伺服器建立SSH連線。因此解決方案為:檢查Jenkins與需要連線的伺服器的網路策略是否開通。

 

5.6 Compilation failure

1、現象

Waiting for Jenkins to finish collecting data

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project jdh-invoice: Compilation failure

[ERROR] /xxx/xxxImpl.java:[111,62] cannot find symbol

[ERROR] symbol: variable p1001

[ERROR] location: class com.xxx.xxx.xxx.xxxImpl

[ERROR] -> [Help 1]

2、解決方案

專案編譯報錯,根據報錯提示修改程式碼,重新部署即可。

 

5.7 Exception when publishing, exception message [Exec exit status not zero. Status [1]

1、現象

mv: cannot stat ‘/xxx/xxx/xxx.jar’: No such file or directory

SSH: EXEC: completed after 200 ms

SSH: Disconnecting configuration [10.0.112.59-fuhsi] ...

ERROR: Exception when publishing, exception message [Exec exit status not zero. Status [1]]

Build step 'Send build artifacts over SSH' changed build result to UNSTABLE

Finished: UNSTABLE

2、解決方案

       執行退出狀態不為0,意味著執行出現異常。這裡根據提示,No such file or directory,在shell指令碼中執行了mv命令,且找不到xxx.jar,所以報錯。解決方案為,根據錯誤提示,修改部署指令碼即可。

 

5.8 Exception when publishing, exception message [Exec exit status not zero. Status [-1]

1、現象

 

 

我在jenkins裡配置的很簡單,就是cd 目錄,然後  sh server.sh 。 進入目錄,執行一個指令碼。 

後來在網上查了一下,得到的答案很多, 第一種說是磁碟滿了。 我用#df -hl檢視磁碟剩餘空間,發現實際不是這個問題

第二種解釋是說,腳本里的命令沒有返回0, 有可能ps的時候得到兩個程序,沒有把本身執行緒去掉, 加一個 grep -v grep 這個我對照了一下,腳本里也是有的。

後來我在指令碼 server.sh的最後 加了一行  exit 0 發現還是不管用

我想了下,其實所有的流程都已經成功了,無非是哪個語句在執行的時候沒有正確返回,所以我最後直接在jenkins的指令碼後面 配置了一個  ps -ef | grep java

 

完整命令: 

cd  ${DIST_SERVER_PROJECT_DIR} && sh autos.sh && ps -aux |grep -v grep | grep java

問題解決。總結一下,應該就是加了 ps之後, jenkins就可以正確讀取到指令碼的返回值了。

 

5.9 Exception when publishing, exception message [Exec exit status not zero. Status [127]

1、現象:

在遠端部署jar包的時候

RROR: Exception when publishing, exception message [Exec exit status not zero. Status [127]]

也有說Jenkins執行shell時無法獲取環境變數的原因導致

2、解決方案

在shell指令碼上加上環境變數如

#!/bin/bash

source ~/.bash_profile

source /etc/profile

Status [127] 代表的是沒找到對應的執行檔案。

cd 開啟到自己部署的war的路徑就可以了

 

5.10 Cannot find /tomcat8081/bin/catalina.sh

現象

Cannot find /Tomcat-7.0.39/bin/catalina.sh

The file is absent or does not have execute permission

This file is needed to run this program

SSH: EXEC: completed after 8,008 ms

SSH: Disconnecting configuration [10.0.17.234-jdh] ...

ERROR: Exception when publishing, exception message [Exec exit status not zero. Status [1]]

Build step 'Send files or execute commands over SSH' changed build result to UNSTABLE

Finished: UNSTABLE

解決方案

報錯原因為,sh指令碼沒有執行許可權。因此解決方案為,在tomcat 的bin目錄下,執行如下命令:

chmod +x *.sh  

然後重新部署即可。

 

5.11 Neither the JAVA_HOME nor the JRE_HOME environment variable is defined

1、現象

Neither the JAVA_HOME nor the JRE_HOME environment variable is defined

At least one of these environment variable is needed to run this program

SSH: EXEC: completed after 7,808 ms

SSH: Disconnecting configuration [10.0.17.xxx-xxx] ...

ERROR: Exception when publishing, exception message [Exec exit status not zero. Status [1]]

Build step 'Send files or execute commands over SSH' changed build result to UNSTABLE

Finished: UNSTABLE

2、解決方案

Tomcat 找不到Java的環境變數,需要手動新增。解決方案為,在當前 Tomcat 的目錄下,新增 setenv.sh,並插入以下內容:

JAVA_HOME=/usr/java/jdk1.7.0_65

JAVA_JRE=/usr/java/jdk1.7.0_65/jre

儲存並退出,重新部署即可。

 

5.12 java.net.ConnectException: Connection refused

1、現象

 

 

2、解決方案:

1)埠號被佔用:殺死佔用埠號(一般為8080)的程序,釋放埠;徹底關閉 Tomcat 伺服器,或者重新啟動專案。

2)使用以下命令檢查伺服器中允許的最大程序數: ulimit -u。如果將此值設定為較低值,例如1024,則使用以下值將其增加到131072或無限制:ulimit -u 131072  或者 ulimit -u無限制 。

3)客戶端和伺服器,它們中的任何一個或兩個都不在網路中。

它們可能沒有連線到LAN或網際網路或任何其他網路,在這種情況下,Java將會丟擲

客戶端的“ java.net.ConnectException:Connection refused ”異常。

4)伺服器未執行用

是伺服器已關閉但未執行。在這種情況下,你也會得到java.net.ConnectException:連線被拒絕錯誤。可ping來檢查伺服器是否正在執行並偵聽埠。

5)伺服器正在執行但沒有偵聽埠,客戶端正在嘗試連線。

伺服器正在執行但是正在偵聽不同的埠。驗證配置。如果你正在處理一個大專案,並有一個分層配置檔案,它可能是預設配置或其他一些設定覆蓋了您正確的設定。

6)主機埠組合不允許使用防火牆

幾乎每個企業網路都受防火牆保護。如果您正在連線其他公司網路,例如在任何電子交易系統中,需要提高防火牆

雙方要求確保他們允許彼此的IP地址和埠號。如果防火牆不允許連線,也會收到相同的java.net.ConnectException:Java應用程式中的連線拒絕異常。

7)主機埠組合不正確。

提供的主機埠組合不正確,或者伺服器端的早期主機埠組合已經更改。檢查客戶端和伺服器端的最新配置。

8)連線字串中的協議不正確

TCP是許多高階協議的基礎協議,包括HTTP,RMI等。通過連線時字串,你需要確保你傳遞正確的協議,伺服器期望。例如伺服器已暴露,通過 RMI 而不是連線字串的服務應該以rmi:// 開頭。

 

5.13 job for jenkins.service failed because the control process exited with error code.

1、現象

通過RPM安裝Jenkins簡單方便,不太需要複雜的過程,但是在安裝完成以後啟動Jenkins的時候提示“Starting jenkins (via systemctl): Job for jenkins.service failed because the control process exited with error code. See "systemctl status jenkins.service" and "journalctl -xe" for details.”,此時無法啟動Jenkins,需要執行systemctl status jenkins.service來檢查下其狀態;

 

2、解決方案

通過檢查Jenkins的執行狀態我們可以捕捉到啟動的時候報錯“Starting Jenkins bash: /usr/bin/java: No such file or directory”,沒有找到jdk;

 

 

因為此時我預設安裝的jdk的路徑是“/usr/java/jdk1.8.0_91/bin/”,此時我們需要修改下Jenkins的查詢jdk的路徑;

開啟“Jenkins的啟動指令碼路徑/etc/rc.d/init.d/jenkins”,搜尋jdk的配置路徑

 

此時觀察我們發現預設搜尋的路徑是/usr/bin/java,所以需要變更成為自己的jdk路徑“/usr/java/jdk1.8.0_91/bin/java”,注意需要指定到java的執行檔案,修改完成重新啟動;

 

這樣我們就可以成功的啟動Jenkins啦

 

5.14 jenkins無法將war包傳送到遠端伺服器之路徑配置

1、現象:雖然表現為finished success,但實際傳輸檔案為0

 

2、解決方案:

 

這時候選擇你要的伺服器,這時候是不是發現你沒有伺服器可以選擇,彆著急,先看完,後面會講如何新增遠端伺服器。

(1)、Sourec files這個是配置war包的,具體內容:

 

 

 

 

兩個紅框中的目錄的差就是此處要填寫的內容:iSteam_server/target/*.war。

(1)、Remove prefix這個是移除字首目錄的,主要是我的war包在根目錄下面的iSteam_server/target下面,所以要移除iSteam_server/target這個目錄。

(2)、Remote directory 這個目錄要傳送war包到目標伺服器的目錄,這個很關鍵,這個適合系統管理-》系統設定中的Publish over SSH的Remote Directory拼在一起的:最後的結果是/usr/local/tomcat/webapps。

(3)、Exec command 這個是要執行的遠端指令碼目錄,主要是用於tomcat的重啟,部署,達到自動化部署的目的,如果不寫指令碼,那就jenkins只能幫你把war包傳到目標伺服器而已。

 

5.15 ERROR: Exception when publishing, exception message [Permission denied]

1、現象:用jenkins打包往各節點自動釋出程式碼時,遇到如下問題:

 

2、解決方案:

從提示來看,應該是許可權問題。在configure中檢查發現,jenkins ssh 10.101.3.167是用test使用者遠端的,而非root使用者。

 

 

在釋出路徑下檢視發包的工程許可權,如下圖所示。原來eie_info只有root使用者才有許可權操作,ssh遠端釋出專案時test使用者無法覆蓋eie_info導致釋出失敗,故只要刪除eie_info專案或者給專案test完全許可權,問題即可解決,如下。

 

 

修改後,jekins可以成功釋出!

 

1、概述

Jenkins 是一個可擴充套件的持續整合引擎。主要用於持續、自動地構建/測試軟體專案、監控一些定時執行的任務。Jenkins用Java語言編寫,可在Tomcat等流行的servlet容器中執行,也可獨立執行。通常與版本管理工具(SCM)、構建工具結合使用。常用的版本控制工具有SVN、GIT,構建工具有Maven、Ant、Gradle。

1.1 軟體環境配置

Centos7.0 64位

Vmware workstation 16.1

2、前期準備

安裝好JDK,Maven,Subversion

2.1 配置JDK環境

1、先檢視本地是否自帶java環境:

#yum list installed | grep java

2、解除安裝自帶的java(輸入su,輸入root超級管理員的密碼,切換到root使用者模式)

#yum -y remove java-1.8.0-openjdk*

#yum -y remove tzdata-java*

3、檢視yum倉庫中的java安裝包

#yum -y list java*

4、安裝java:

yum -y install java-1.8.0-openjdk*

(yum安裝java預設安裝目錄為usr/lib/jvm)

5、查詢Java安裝路徑

#which java

 

6、檢查Java是否安裝成功:java -version

 

7、新增Jenkins repo:

wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins.io/redhat-stable/jenkins.repo

rpm --import http://pkg.jenkins.io/redhat-stable/jenkins.io.key

 

8、更新Jenkins repo cache:

#yum clean all

#yum makecache

 

9、新增JAVA_HOME環境變數:

#sudo vim /etc/profile

在檔案末尾新增如下程式碼:

export JAVA_HOME=/usr/java/jdk1.8.0_202/bin/java #(yum安裝時需指定Java可執行檔案,可避免報錯)

export JRE_HOME=$JAVA_HOME/jre

export PATH=${PATH}:${JAVA_HOME}/bin

CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib

 

儲存檔案,並執行# source /etc/profile命令使環境變數生效:

在控制檯輸入#echo $JAVA_HOME命令,如果能看到相關路徑資訊,則說明JAVA已經配置成功:

 

2.2 配置Maven環境

Mavn 是一個基於 Java 的工具,所以要做的第一件事情就是安裝 JDK。

如果你還未安裝 JDK,請參考前文

2.2.1 系統要求

專案

要求

JDK

Maven 3.3 要求 JDK 1.7 或以上

Maven 3.2 要求 JDK 1.6 或以上

Maven 3.0/3.1 要求 JDK 1.5 或以上

記憶體

沒有最低要求

磁碟

Maven 自身安裝需要大約 10 MB 空間。除此之外,額外的磁碟空間將用於你的本地 Maven 倉庫。你本地倉庫的大小取決於使用情況,但預期至少 500 MB

作業系統

沒有最低要求

2.2.2 檢查 Java 安裝

作業系統

任務

命令

Windows

開啟命令控制檯

c:\> java -version

Linux

開啟命令終端

# java -version

Mac

開啟終端

$ java -version

 

2.2.3 Maven下載解壓、環境變數配置

Maven 下載地址:http://maven.apache.org/download.cgi(可自行下載後解壓)

Maven下載解壓及環境變數配置:

# wget http://mirrors.hust.edu.cn/apache/maven/maven-3/3.3.9/binaries/apache-maven-3.3.9-bin.tar.gz

# tar -xvf apache-maven-3.3.9-bin.tar.gz

# sudo mv -f apache-maven-3.3.9 /usr/local/

編輯 /etc/profile 檔案,:

#sudo vim /etc/profile

在檔案末尾新增如下程式碼:

export MAVEN_HOME=/usr/local/apache-maven-3.3.9

export PATH=${PATH}:${MAVEN_HOME}/bin

儲存檔案,並執行如下命令使環境變數生效:

# source /etc/profile

在控制檯輸入如下命令,如果能看到 Maven 相關版本資訊,則說明 Maven 已經安裝成功:

# mvn -v

 

2.3 配置Subversion

(此步驟非必須)之後鉤子程式的構建也可直接在遠端伺服器的svn副本操作

//安裝

#yum install subversion

//檢視版本

#svnserve --version

//建庫

#mkdir -p /data/svn

#cd /data/svn

#svnadmin create project

//修改啟動預設路徑

#vim /etc/sysconfig/svnserve

OPTIONS="-r /data/svn"

//修改配置

#vim /data/svn/project/conf/svnserve.conf

anon-access=none         //匿名使用者許可權

auth-access=write           //認證使用者許可權  

password-db=passwd          //指定使用者檔案

authz-db=authz        //使用者授權檔案

realm=project       //域,與庫名一致

//新增使用者

#vim /data/svn/project/conf/passwd

[users]

admin = admin_password

//新增授權

#vim /data/svn/project/conf/authz

[project:/]

admin = rw

//關閉selinux

#setenforce 0   或修改selinux配置檔案關閉

//啟動

#systemctl start svnserve

#systemctl enable svnserve

//檢視埠是否開啟,預設3690

#netstat -ntpl

//開啟防火牆

#firewall-cmd --add-port=3690/tcp

#firewall-cmd --add-port=3690/tcp --permanent

//測試

#mkdir /data/project

#cd /data/project

#svn co svn://localhost/project .    //最後有個點

#touch aaa.txt

#svn ci -m ""    //上傳

#svn list svn://localhost/project      //可看到aaa.txt則正常

//一些常用命令

#svn list    //當前版本號所有檔案

#svn log

#svn log filename -v

#svn log -r 1 -v   檢視特定版本號

#svn update -r version_no   更新至特定版本號

 

3、Jenkins配置

3.1 Jenkins安裝

3.1.1 離線安裝

## http://pkg.jenkins-ci.org/redhat/

#wget http://pkg.jenkins-ci.org/redhat/jenkins-2.39-1.1.noarch.rpm ## 下載(也可以Windows下載再用xftp傳過來)

#sudo rpm --import http://pkg.jenkins-ci.org/redhat/jenkins.io.key ## 公鑰

#sudo yum -y install jenkins-*.noarch.rpm

 

3.1.2 線上安裝

## http://pkg.jenkins-ci.org/redhat/

#sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat/jenkins.repo

#sudo rpm --import https://pkg.jenkins.io/redhat/jenkins.io.key

#sudo yum -y install jenkins

3.1.3 基於Tomcat 安裝

安裝並啟動 Tomcat;

從官網下載 jenkins.war 至 $CATALINA_BASE/webapps,Tomcat 會自動部署;

瀏覽器訪問:http://centos:8080/jenkins/

3.1.4 免安裝方式

#wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war

#sudo java -jar jenkens.war ## 啟動服務,直至看到日誌 `Jenkins is fully up and running`

#curl http://localhost:8080/ ## Jenkins 已就緒

 

注:jenkins檔案預設安裝路徑

       /usr/lib/jenkins/jenkins.war    war

       /etc/sysconfig/jenkins       配置檔案

       /var/lib/jenkins/        預設jenkins目錄

       /var/log/jenkins/jenkins.log    Jenkins日誌檔案

 

3.2 Jenkins訪問

3.2.1 啟動Jenkins訪問

    現在Jenkins已經安裝好了,不過啟動之前最好稍微修改一下配置。預設情況是Jenkins是使用Jenkins使用者啟動的,但這個使用者目前系統並沒有賦予許可權,這裡我們將啟動使用者修改為root;另外Jenkins預設埠是8080,這個跟tomcat的預設埠衝突,我們也修改一下預設埠。

## sudo vim /etc/sysconfig/jenkins

#JENKINS_USER="root" ## 原值 "jenkins" 最好修改,否則許可權不足

#JENKINS_PORT="8080" ## 原值 "8080"如埠衝突,可另行修改(這裡不做修改)

## 還有開啟 HTTPS 相關引數,此處不打算開啟,故不作說明

 

1、啟動jenkins,訪問

#systemctl daemon-reload            ## 重新載入配置檔案

#systemctl start jenkins            ## 啟動

 

2、jenkins預設埠8080,瀏覽器訪問 http://: 192.168.0.252:8080 訪問

 

3、輸入命令以找到密碼。

tail /var/lib/jenkins/secrets/initialAdminPassword

 

 

4、輸入密碼後,進入外掛安裝頁面。點選Install suggested plugins,安裝預設外掛。

 

 

 

5、安裝完成後,頁面會自動進入管理員賬戶註冊頁面,建立賬號

 

 

 

 

6、安裝完成後,進入主介面

 

 

3.3 Jenkins基本配置

3.3.1 全域性安全設定

預設情況下,任何使用者都可以使用 Jenkins 進行釋出。可以進入相關設定:系統管理 / 全域性安全設定(Configure Global Security),選擇 Jenkins專有使用者資料庫,不要選中 允許使用者註冊,選擇 登入使用者可以做任何事,選中 Allow anonymous read access

 

 

3.3.2 全域性工具配置

進入:系統管理 / 全域性工具設定(Global Tool Configuration)

JDK 下不勾選“自動安裝”,指定別名=JDK-1.8.0.121, JAVA_HOME=/usr/java/jdk1.8.0_202

Maven 下不勾選“自動安裝”,指定別名=Maven-3.8.1, MAVEN_HOME=/var/lib/apache-maven-3.8.1

點選 Save 按鈕。

 

3.3.3 外掛管理

首頁  >> Manager Jenkins(系統管理)   >> Manage Plugins(外掛管理)

Subversion    # 版本管理 SVN 的外掛

Maven Integration     # 專案構建 Maven 的外掛

Deploy To Container     # 部署tomcat外掛,為熱部署

Publish Over SSH           #部署tomcat外掛

確保這幾個外掛已經安裝,如果已安裝中沒有這幾個外掛,到可選外掛中搜索並安裝,安裝失敗可重試或者下載在“高階”介面通過hpi上傳

 

 

3.3.4 系統配置

首頁  >> Manager Jenkins(系統管理)   >> Configure System(系統管理)

別忘記新增Credentials(你的遠端伺服器的登陸使用者名稱和密碼)

 

 

 

4、自動化部署tomcat

4.1 tomcat專案配置

4.1.1 建立maven專案

首頁  >> New Item(新建任務)   >> Maven(構建一個maven專案)

 

注:如果沒有出現<構建一個maven專案>的選項,是因為沒裝maven外掛

 

4.1.2 General配置

 

4.1.3 Source Code Managment(原始碼管理)配置

 

注:svn原始碼地址需定位到pom.xml檔案的上一級,因為後面的Build構建操作就是要自動定位到pom.xml檔案進行構建

 

4.1.4 填寫svn的登入名和密碼 

 

 

4.1.5 Build Triggers(構建觸發器)配置

選中Build periodically:週期性進行專案構建,這個是到指定的時間必須觸發構建任務

選中Poll SCM:定時檢查原始碼變更,如果有更新就checkout最新code下來,然後執行構建動作

注:定時構建語法如下:(五顆星,中間用空格隔開)

* * * * *

第一顆*表示分鐘,取值0~59

第二顆*表示小時,取值0~23

第三顆*表示一個月的第幾天,取值1~31

第四顆*表示第幾月,取值1~12

第五顆*表示一週中的第幾天,取值0~7,其中0和7代表的都是週日

 

 

4.1.6 Build配置

Root POM:  pom.xml 

Goals and options: 指定 mvn 執行目標或選項,設定為 package -Dmaven.test.skip=true

 

一般配置到這裡可以先構建把war包打包下來,同時根據控制檯輸出找到工作空間位置,以及war包位置,如下圖工作空間為/var/lib/jenkins/jobs/CloudPayment/workspace

 

 

4.2 構建後操作

4.2.1 ssh部署

儲存後構建即可

附上autos.sh 及start.sh指令碼 (根據實際情況自行更改)

autos.sh

  1 #!/bin/bash
  2 #Time
  3 log_time=`date +[%Y-%m-%d]%H:%M:%S`
  4 
  5 ###manual_properties###
  6 
  7 tomcat_basehome=/data/tomcat8081
  8 
  9 tomcat_port=8080
 10 
 11 shell_environment=/bin/bash
 12 
 13 war_Dir=/var/lib/jenkins/workspace/CloudPayment/target
 14 
 15 war_Name=library.war
 16 
 17 war_home=/home/zencj/webapps
 18 
 19 backup_name=/data/backup/tomcat8081
 20 
 21 back_name=library
 22 
 23 ###manual_properties###
 24 
 25 
 26 #update server environment
 27 
 28 echo "**********************************  ${log_time} *************************************"
 29 
 30 echo "updating server  environment start"
 31 
 32 export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.302.b08-0.el8_4.x86_64
 33 
 34 export JRE_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.302.b08-0.el8_4.x86_64/jre
 35 
 36 export PATH = $JAVA_HOME/bin:$PATH
 37 
 38 export CLASSPATH= .:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
 39 
 40 sleep 3
 41 
 42 echo "updating server  environment  end"
 43 
 44 
 45 #transfer  application package
 46 
 47 deploy_Loaction = ${tomcat_basehome}/webapps/
 48 
 49 war_Dir_Data=`ls ${war_Dir}`
 50 
 51 echo "--------------  begin  transfer  war package to tomcat webapps -------------------"
 52 
 53 
 54 if [ -z $war_Dir ];then
 55 
 56      echo "Folder ${war_Dir} is empty.please check war package in this folder!"
 57 
 58      exit 1
 59 
 60 else
 61 
 62      echo "Find ${war_Dir} exist war package ${war_Name}"
 63 
 64     # echo "deleteing old  package ${war_Name} in ${war_Dir}"
 65 
 66     # rm ${war_Dir}/${war_Name}
 67 
 68      echo "deleteing old  package ${war_Name} in ${deploy_Loaction}"
 69 
 70      echo "備份library.war"
 71 
 72      rm -rf ${backup_name}/${back_name}
 73 
 74      cp -r ${deploy_Loaction}/${war_Name} ${backup_name}
 75 
 76      rm ${deploy_Loaction}${war_Name}
 77 
 78      echo "start  transfer ${war_Name} to ${deploy_Loaction}"
 79 
 80      cp -r ${war_home}/${war_Name}  ${deploy_Loaction}
 81 
 82      echo "start chmod war"
 83 
 84      chmod 777 ${deploy_Loaction}/${war_name}
 85 
 86      sleep 3
 87 
 88 fi
 89 
 90 echo "--------------  transfer  war package to tomcat webapps  end -------------------"
 91 
 92 #reboot tomcat
 93 
 94 echo " >>>>>>>  rebooting  tomcat begin <<<<<<<<"
 95 
 96 cd ${deploy_Loaction}
 97 
 98 ./start.sh
 99 
100 echo "************************ deploy war package into container Successlly  **********************************"

start.sh

#!/usr/local/bin/expect -f
#Implementing interaction with the terminal command line

spawn sudo -s
 
expect "zengcj 的密碼:"
 
send "********\r"

expect "*#*"

send "docker restart tomcat8081\r"

expect "*#*"

send "exit\r"

 

4.2.2 tomcat熱部署

將構建後的war包部署到tomcat容器

1、Tomcat使用者配置

修改<tomcat_home>/conf/tomcat-users.xml,新增下列內容,建立對應的角色和使用者

<role rolename="manager-gui"/>

 

<role rolename="admin-gui"/>

 

<role rolename="manager-script"/>

 

<user username="tomcat" password="tomcat" roles="manager-gui,admin-gui,manager-script"/>

 

2、Tomcat訪問許可權配置

修改<tomcat_home>/webapps/manager/META-INF/context.xml 檔案中標籤的allow的值,去除訪問限制

修改前:

 

修改後:

 

 

3、Tomcat配置上傳的war包大小限制

修改<tomcat_home>/webapps/manager/WEB-INF/web.xml檔案,預設是50M

 

配置完成後,啟動tomcat

 

4、Post-build Actionsgoi(構建後操作)配置

選擇“Deploy war/ear to container”

 

 

儲存後即可開始構建

 

4.3 實現自動化

通過webhook鉤子程式實現,在SVN版本庫上提交程式碼後,自動觸發Jenkins上的某個Job。

4.3.1 webhook簡介

每個SVN版本庫都會有一個hooks目錄。裡面儲存了各種鉤子指令碼(shell)。

 


4.3.2 hooks觸發介紹

  

目錄下將有多個指令碼

1、  每一個都對應了一個事件。

2、  如果要使用,需要cp一份,去掉字尾,保持和事件名一樣。 hook可以用Shell,Python或其它語言寫。

3、  另外hook需要加可執行許可權,否則svn commit時會報錯:

#cp post-commit.tmpl post-commit

#chmod +x post-commit

4.3.3 事件說明

 

  以上表格資訊參考(侵刪):https://www.cnblogs.com/harrymore/p/8574134.html  


4.3.4 post-commit指令碼內容參考

post-commit本身就是一個Shell指令碼,我們只需要將期望的操作編寫進該指令碼內。SVN檢測到程式碼有變更後,就會來執行該指令碼。

#!/bin/bash
#SVN版本庫路徑

REPOS="$1"
 
#SVN版本號

REV="$2"

#獲取當前日期

DATE_TIME=`date +%y-%m-%d`
 
echo "$REPOS $DATE_TIME $REV" >> /tmp/text.txt

curl"http://192.168.136.132:8080/job/CloudPayment/build?token=zeng”

#指令碼內容完結
#備註:最後的curl就是去發起GET請求,前提是Jenkins-Job的觸發器配置好這個身份驗證令牌"zeng"

 

 

構建完成後即可實現SVN版本庫上提交程式碼後,自動從svn拉取程式碼,打包成library.war包,通過ssh上傳部署或tomcat熱部署到遠端伺服器上,實現自動化部署

 

5、Jenkins error自查

 下面總結在Jenkins部署過程中遇到的常見問題,並列出對應的解決方案,供讀者自查。

5.1 Exec timed out or was interrupted after 120,001 ms

1、現象

ERROR: Exception when publishing, exception message [Exec timed out or was interrupted after 120,001 ms]

Build step 'Send files or execute commands over SSH' changed build result to UNSTABLE

Finished: UNSTABLE

2、解決方案

       Jenkins的Job在執行 "Send files or execute commands over SSH" 的過程中超時了,預設超時時間為120000ms,也就是2分鐘。因此,解決方案有以下兩種:

縮短這一步驟的部署時間

將job的部署時間控制在2分鐘內即可。

配置更長的超時時間

Send build artifacts over SSH ---> Advanced ---> Exec timeout (ms) 中設定。

 

 

 

比如將超時時間調整為300000ms(也即5分鐘),問題解決。

 

5.2 Couldn't find any revision to build

1、現象

ERROR: Couldn't find any revision to build. Verify the repository and branch configuration for this job.

Finished: FAILURE

2、解決方案

       在Job的配置中,我們使用Git作為拉取程式碼的託管倉庫,但在部署過程中,不存在該分支或者版本號,導致Jenkins拉取不到對應Job的程式碼。解決方案為:在對應的原始碼管理中填寫正確的分支名稱或者正確的版本號。

Source Code Management  --> Branch Specifier (blank for 'any')

 

 

注意:如果配置了引數化構建過程,則需要保證預設值為正確的分支。

同時,如果使用了Jenkins的API進行呼叫,則需要保證輸入的分支名稱是正確存在的。

 

 

5.3 Could not create or change to directory

1、現象

SSH: Disconnecting configuration

ERROR: Exception when publishing, exception message [Could not create or change to directory. Directory xxx ]

Build step 'Send files or execute commands over SSH' changed build result to UNSTABLE

2、解決方案

       造成該錯誤的原因為Jenkins無法建立目錄,這主要是因為:"連線到該SSH的使用者沒有許可權" 或者 "伺服器的磁碟空間滿了"。

因此,針對上面兩種可能的情況,解決方案分別如下:

 連線到該SSH的使用者沒有許可權

針對這種情況,需要將該SSH使用者所操作的目錄,賦予許可權。操作命令為:

chown -R name:pwd /xxx

其中name,pwd為對應SSH使用者的賬號密碼,/xxx為需要賦予許可權的目錄名稱。注意必須要切換為root使用者下操作。

例子: chown -R  zz:123456  /zz/ms

伺服器的磁碟空間滿了

可以通過df,du命令檢視磁碟佔用情況,清掉無用的資源,騰出空間。

df -hl

du -h --max-depth=1

其中, df 命令是linux系統以磁碟分割槽為單位檢視檔案系統,可以加上引數檢視磁碟剩餘空間資訊。

而 du 命令可以檢視當前目錄下各資料夾的大小。

 

5.4 Build step 'Invoke top-level Maven targets' marked build as failure

1、現象

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.2:war (default-war) on project xxx: Failed to copy file for artifact [xxx:jar:0.0.1:compile]: File /root/.m2/repository/xxx/xxx/xxx/xxx.jar does not exist -> [Help 1]

org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.2:war (default-war) on project xxx: Failed to copy file for artifact [xxx:jar:0.0.1:compile]

at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:215)

at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:156)

at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:148)

at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:117)

at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:81)

at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:56)

at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128)

at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:305)

at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:192)

at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:105)

at org.apache.maven.cli.MavenCli.execute (MavenCli.java:956)

at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:288)

at org.apache.maven.cli.MavenCli.main (MavenCli.java:192)

[ERROR] Re-run Maven using the -X switch to enable full debug logging.

[ERROR] For more information about the errors and possible solutions, please read the following articles:

Build step 'Invoke top-level Maven targets' marked build as failure

Finished: FAILURE

2、解決方案

       這裡使用了Maven進行打包,且由 Failed to execute goal xxx 內容可以看出,這裡是Maven編譯打包過程中報錯。根據相應的提示排查專案程式碼即可。例如這裡的報錯內容為:/root/.m2/repository/xxx/xxx/xxx/xxx.jar 不存在,因此在Maven倉庫上傳這個jar包即可。

 

5.5 Failed to connect and initialize SSH connection

1、現象

SSH: Connecting from host [JR-JDH-SITAPP3]

SSH: Connecting with configuration [10.0.17.234-jdh] ...

ERROR: Exception when publishing, exception message [Failed to connect and initialize SSH connection. Message: [Failed to connect SFTP channel. Message [failed to send channel request]]]

Build step 'Send files or execute commands over SSH' changed build result to UNSTABLE

Finished: UNSTABLE

2、解決方案

       由報錯提示可知,在SSH階段,Jenkins無法與需要連線到的伺服器建立SSH連線。因此解決方案為:檢查Jenkins與需要連線的伺服器的網路策略是否開通。

 

5.6 Compilation failure

1、現象

Waiting for Jenkins to finish collecting data

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project jdh-invoice: Compilation failure

[ERROR] /xxx/xxxImpl.java:[111,62] cannot find symbol

[ERROR] symbol: variable p1001

[ERROR] location: class com.xxx.xxx.xxx.xxxImpl

[ERROR] -> [Help 1]

2、解決方案

專案編譯報錯,根據報錯提示修改程式碼,重新部署即可。

 

5.7 Exception when publishing, exception message [Exec exit status not zero. Status [1]

1、現象

mv: cannot stat ‘/xxx/xxx/xxx.jar’: No such file or directory

SSH: EXEC: completed after 200 ms

SSH: Disconnecting configuration [10.0.112.59-fuhsi] ...

ERROR: Exception when publishing, exception message [Exec exit status not zero. Status [1]]

Build step 'Send build artifacts over SSH' changed build result to UNSTABLE

Finished: UNSTABLE

2、解決方案

       執行退出狀態不為0,意味著執行出現異常。這裡根據提示,No such file or directory,在shell指令碼中執行了mv命令,且找不到xxx.jar,所以報錯。解決方案為,根據錯誤提示,修改部署指令碼即可。

 

5.8 Exception when publishing, exception message [Exec exit status not zero. Status [-1]

1、現象

 

 

我在jenkins裡配置的很簡單,就是cd 目錄,然後  sh server.sh 。 進入目錄,執行一個指令碼。 

後來在網上查了一下,得到的答案很多, 第一種說是磁碟滿了。 我用#df -hl檢視磁碟剩餘空間,發現實際不是這個問題

第二種解釋是說,腳本里的命令沒有返回0, 有可能ps的時候得到兩個程序,沒有把本身執行緒去掉, 加一個 grep -v grep 這個我對照了一下,腳本里也是有的。

後來我在指令碼 server.sh的最後 加了一行  exit 0 發現還是不管用

我想了下,其實所有的流程都已經成功了,無非是哪個語句在執行的時候沒有正確返回,所以我最後直接在jenkins的指令碼後面 配置了一個  ps -ef | grep java

 

完整命令: 

cd  ${DIST_SERVER_PROJECT_DIR} && sh autos.sh && ps -aux |grep -v grep | grep java

問題解決。總結一下,應該就是加了 ps之後, jenkins就可以正確讀取到指令碼的返回值了。

 

5.9 Exception when publishing, exception message [Exec exit status not zero. Status [127]

1、現象:

在遠端部署jar包的時候

RROR: Exception when publishing, exception message [Exec exit status not zero. Status [127]]

也有說Jenkins執行shell時無法獲取環境變數的原因導致

2、解決方案

在shell指令碼上加上環境變數如

#!/bin/bash

source ~/.bash_profile

source /etc/profile

Status [127] 代表的是沒找到對應的執行檔案。

cd 開啟到自己部署的war的路徑就可以了

 

5.10 Cannot find /tomcat8081/bin/catalina.sh

現象

Cannot find /Tomcat-7.0.39/bin/catalina.sh

The file is absent or does not have execute permission

This file is needed to run this program

SSH: EXEC: completed after 8,008 ms

SSH: Disconnecting configuration [10.0.17.234-jdh] ...

ERROR: Exception when publishing, exception message [Exec exit status not zero. Status [1]]

Build step 'Send files or execute commands over SSH' changed build result to UNSTABLE

Finished: UNSTABLE

解決方案

報錯原因為,sh指令碼沒有執行許可權。因此解決方案為,在tomcat 的bin目錄下,執行如下命令:

chmod +x *.sh  

然後重新部署即可。

 

5.11 Neither the JAVA_HOME nor the JRE_HOME environment variable is defined

1、現象

Neither the JAVA_HOME nor the JRE_HOME environment variable is defined

At least one of these environment variable is needed to run this program

SSH: EXEC: completed after 7,808 ms

SSH: Disconnecting configuration [10.0.17.xxx-xxx] ...

ERROR: Exception when publishing, exception message [Exec exit status not zero. Status [1]]

Build step 'Send files or execute commands over SSH' changed build result to UNSTABLE

Finished: UNSTABLE

2、解決方案

Tomcat 找不到Java的環境變數,需要手動新增。解決方案為,在當前 Tomcat 的目錄下,新增 setenv.sh,並插入以下內容:

JAVA_HOME=/usr/java/jdk1.7.0_65

JAVA_JRE=/usr/java/jdk1.7.0_65/jre

儲存並退出,重新部署即可。

 

5.12 java.net.ConnectException: Connection refused

1、現象

 

 

2、解決方案:

1)埠號被佔用:殺死佔用埠號(一般為8080)的程序,釋放埠;徹底關閉 Tomcat 伺服器,或者重新啟動專案。

2)使用以下命令檢查伺服器中允許的最大程序數: ulimit -u。如果將此值設定為較低值,例如1024,則使用以下值將其增加到131072或無限制:ulimit -u 131072  或者 ulimit -u無限制 。

3)客戶端和伺服器,它們中的任何一個或兩個都不在網路中。

它們可能沒有連線到LAN或網際網路或任何其他網路,在這種情況下,Java將會丟擲

客戶端的“ java.net.ConnectException:Connection refused ”異常。

4)伺服器未執行用

是伺服器已關閉但未執行。在這種情況下,你也會得到java.net.ConnectException:連線被拒絕錯誤。可ping來檢查伺服器是否正在執行並偵聽埠。

5)伺服器正在執行但沒有偵聽埠,客戶端正在嘗試連線。

伺服器正在執行但是正在偵聽不同的埠。驗證配置。如果你正在處理一個大專案,並有一個分層配置檔案,它可能是預設配置或其他一些設定覆蓋了您正確的設定。

6)主機埠組合不允許使用防火牆

幾乎每個企業網路都受防火牆保護。如果您正在連線其他公司網路,例如在任何電子交易系統中,需要提高防火牆

雙方要求確保他們允許彼此的IP地址和埠號。如果防火牆不允許連線,也會收到相同的java.net.ConnectException:Java應用程式中的連線拒絕異常。

7)主機埠組合不正確。

提供的主機埠組合不正確,或者伺服器端的早期主機埠組合已經更改。檢查客戶端和伺服器端的最新配置。

8)連線字串中的協議不正確

TCP是許多高階協議的基礎協議,包括HTTP,RMI等。通過連線時字串,你需要確保你傳遞正確的協議,伺服器期望。例如伺服器已暴露,通過 RMI 而不是連線字串的服務應該以rmi:// 開頭。

 

5.13 job for jenkins.service failed because the control process exited with error code.

1、現象

通過RPM安裝Jenkins簡單方便,不太需要複雜的過程,但是在安裝完成以後啟動Jenkins的時候提示“Starting jenkins (via systemctl): Job for jenkins.service failed because the control process exited with error code. See "systemctl status jenkins.service" and "journalctl -xe" for details.”,此時無法啟動Jenkins,需要執行systemctl status jenkins.service來檢查下其狀態;

 

2、解決方案

通過檢查Jenkins的執行狀態我們可以捕捉到啟動的時候報錯“Starting Jenkins bash: /usr/bin/java: No such file or directory”,沒有找到jdk;

 

 

因為此時我預設安裝的jdk的路徑是“/usr/java/jdk1.8.0_91/bin/”,此時我們需要修改下Jenkins的查詢jdk的路徑;

開啟“Jenkins的啟動指令碼路徑/etc/rc.d/init.d/jenkins”,搜尋jdk的配置路徑

 

此時觀察我們發現預設搜尋的路徑是/usr/bin/java,所以需要變更成為自己的jdk路徑“/usr/java/jdk1.8.0_91/bin/java”,注意需要指定到java的執行檔案,修改完成重新啟動;

 

這樣我們就可以成功的啟動Jenkins啦

 

5.14 jenkins無法將war包傳送到遠端伺服器之路徑配置

1、現象:雖然表現為finished success,但實際傳輸檔案為0

 

2、解決方案:

 

這時候選擇你要的伺服器,這時候是不是發現你沒有伺服器可以選擇,彆著急,先看完,後面會講如何新增遠端伺服器。

(1)、Sourec files這個是配置war包的,具體內容:

 

 

 

 

兩個紅框中的目錄的差就是此處要填寫的內容:iSteam_server/target/*.war。

(1)、Remove prefix這個是移除字首目錄的,主要是我的war包在根目錄下面的iSteam_server/target下面,所以要移除iSteam_server/target這個目錄。

(2)、Remote directory 這個目錄要傳送war包到目標伺服器的目錄,這個很關鍵,這個適合系統管理-》系統設定中的Publish over SSH的Remote Directory拼在一起的:最後的結果是/usr/local/tomcat/webapps。

(3)、Exec command 這個是要執行的遠端指令碼目錄,主要是用於tomcat的重啟,部署,達到自動化部署的目的,如果不寫指令碼,那就jenkins只能幫你把war包傳到目標伺服器而已。

 

5.15 ERROR: Exception when publishing, exception message [Permission denied]

1、現象:用jenkins打包往各節點自動釋出程式碼時,遇到如下問題:

 

2、解決方案:

從提示來看,應該是許可權問題。在configure中檢查發現,jenkins ssh 10.101.3.167是用test使用者遠端的,而非root使用者。

 

 

在釋出路徑下檢視發包的工程許可權,如下圖所示。原來eie_info只有root使用者才有許可權操作,ssh遠端釋出專案時test使用者無法覆蓋eie_info導致釋出失敗,故只要刪除eie_info專案或者給專案test完全許可權,問題即可解決,如下。

 

 

修改後,jekins可以成功釋出!

 

 

出處:https://www.cnblogs.com/zcj-0928/archive/2021/08/06/15108927.html