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