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

  • A+
所属分类:linux技术
摘要

Jenkins 是一个可扩展的持续集成引擎。主要用于持续、自动地构建/测试软件项目、监控一些定时执行的任务。Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行,也可独立运行。通常与版本管理工具(SCM)、构建工具结合使用。常用的版本控制工具有SVN、GIT,构建工具有Maven、Ant、Gradle。


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

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

6、检查Java是否安装成功:java -version

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

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

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

 

 

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

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

 

 

 

 

4、输入密码后,进入插件安装页面。点击Install suggested plugins,安装默认插件。

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

 

 

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

 

 

 

 

 

5、安装完成后,页面会自动进入管理员账户注册页面,创建账号

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

 

 

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

 

 

 

 

 

6、安装完成后,进入主界面

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

 

 

 

 

 

3.3 Jenkins基本配置

3.3.1全局安全设置

默认情况下,任何用户都可以使用 Jenkins 进行发布。可以进入相关设置:系统管理 / 全局安全设置(Configure Global Security),选择 Jenkins专有用户数据库,不要选中 允许用户注册,选择 登录用户可以做任何事,选中 Allow anonymous read access

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

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

 

 

 

 

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 按钮。

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

 

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

 

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

 

 

 

 

 

 

 

 

 

3.3.3 插件管理

首页  >> Manager Jenkins(系统管理)   >> Manage Plugins(插件管理)

Subversion    # 版本管理 SVN 的插件

Maven Integration     # 项目构建 Maven 的插件

Deploy To Container     # 部署tomcat插件,为热部署

Publish Over SSH           #部署tomcat插件

确保这几个插件已经安装,如果已安装中没有这几个插件,到可选插件中搜索并安装,安装失败可重试或者下载在“高级”界面通过hpi上传

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

 

 

 

 

 

 

3.3.4系统配置

首页  >> Manager Jenkins(系统管理)   >> Configure System(系统管理)

别忘记添加Credentials(你的远程服务器的登陆用户名和密码)

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

 

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

 

 

 

 

 

 

 

 

 

 

4、自动化部署tomcat

4.1 tomcat项目配置

4.11创建maven项目

首页  >> New Item(新建任务)   >> Maven(构建一个maven项目)

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

 

 

注:如果没有出现<构建一个maven项目>的选项,是因为没装maven插件

 

 

4.1.2 General配置

 

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

 

 

 

 

4.1.3 Source Code Managment(源码管理)配置

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

 

 

 注:svn源码地址需定位到pom.xml文件的上一级,因为后面的Build构建操作就是要自动定位到pom.xml文件进行构建

 

 

4.1.4 填写svn的登录名和密码 

 

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

 

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

 

 

 

 

 

4.1.5 Build Triggers(构建触发器)配置

选中Build periodically:周期性进行项目构建,这个是到指定的时间必须触发构建任务

选中Poll SCM:定时检查源码变更,如果有更新就checkout最新code下来,然后执行构建动作

注:定时构建语法如下:(五颗星,中间用空格隔开)

* * * * *

第一颗*表示分钟,取值0~59

第二颗*表示小时,取值0~23

第三颗*表示一个月的第几天,取值1~31

第四颗*表示第几月,取值1~12

第五颗*表示一周中的第几天,取值0~7,其中0和7代表的都是周日

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

 

 

 

 

 

 

4.1.6 Build配置

Root POM:  pom.xml 

Goals and options: 指定 mvn 执行目标或选项,设置为 package -Dmaven.test.skip=true

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

 

 

 

 

一般配置到这里可以先构建把war包打包下来,同时根据控制台输出找到工作空间位置,以及war包位置,如下图工作空间为/var/lib/jenkins/jobs/CloudPayment/workspace

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

 

 

 

 

 

4.2构建后操作

4.2.1 ssh部署

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

 

 

 

 

 

保存后构建即可

附上autos.sh 及start.sh脚本 (根据实际情况自行更改)

autos.sh

#!/bin/bash

#Time

log_time=`date +[%Y-%m-%d]%H:%M:%S`

 

###manual_properties###

tomcat_basehome=/data/tomcat8081

tomcat_port=8080

shell_environment=/bin/bash

war_Dir=/var/lib/jenkins/workspace/CloudPayment/target

war_Name=library.war

war_home=/home/zencj/webapps

backup_name=/data/backup/tomcat8081

back_name=library

###manual_properties###

 

#update server environment

echo "**********************************  ${log_time} *************************************"

echo "updating server  environment start"

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.302.b08-0.el8_4.x86_64

export JRE_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.302.b08-0.el8_4.x86_64/jre

export PATH=$JAVA_HOME/bin:$PATH

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

sleep 3

echo "updating server  environment  end"

 

#transfer  application package

deploy_Loaction=${tomcat_basehome}/webapps/

war_Dir_Data=`ls ${war_Dir}`

echo "--------------  begin  transfer  war package to tomcat webapps -------------------"

 

if [ -z $war_Dir ];then

     echo "Folder ${war_Dir} is empty.please check war package in this folder!"

     exit 1

else

     echo "Find ${war_Dir} exist war package ${war_Name}"

    # echo "deleteing old  package ${war_Name} in ${war_Dir}"

    # rm ${war_Dir}/${war_Name}

     echo "deleteing old  package ${war_Name} in ${deploy_Loaction}"

     echo "备份library.war"

     rm -rf ${backup_name}/${back_name}

     cp -r ${deploy_Loaction}/${war_Name} ${backup_name}

     rm ${deploy_Loaction}${war_Name}

     echo "start  transfer ${war_Name} to ${deploy_Loaction}"

     cp -r ${war_home}/${war_Name}  ${deploy_Loaction}

     echo "start chmod war"

     chmod 777 ${deploy_Loaction}/${war_name}

     sleep 3

fi

echo "--------------  transfer  war package to tomcat webapps  end -------------------"

#reboot tomcat

echo " >>>>>>>  rebooting  tomcat begin <<<<<<<<"

cd ${deploy_Loaction}

./start.sh

echo "************************ deploy war package into container Successlly  **********************************"

 

 

 

start.sh

#!/usr/local/bin/expect -f

 

spawn sudo -s

expect "zengcj 的密码:"

send "********r"

 

expect "*#*"

send "docker restart tomcat8081r"

 

expect "*#*"

send "exitr"

 

 

 

 

 

 

 

 

 

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的值,去除访问限制

修改前:

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

 

 

修改后:

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

 

 

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

修改<tomcat_home>/webapps/manager/WEB-INF/web.xml文件,默认是50M

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

 

 

配置完成后,启动tomcat

 

4、Post-build Actionsgoi(构建后操作)配置

选择“Deploy war/ear to container”

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

 

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

 

 

 

保存后即可开始构建

 

 

4.3实现自动化

通过webhook钩子程序实现,在SVN版本库上提交代码后,自动去出发Jenkins上的某个Job。

4.3.1 webhook简介

每个SVN版本库都会有一个hooks目录。里面存储了各种钩子脚本(shell)。

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

 

 

 


4.3.2 hooks触发介绍

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

 

 

 

目录下将有多个脚本

1、  每一个都对应了一个事件。

2、  如果要使用,需要cp一份,去掉后缀,保持和事件名一样。 hook可以用Shell,Python或其它语言写。

3、  另外hook需要加可执行权限,否则svn commit时会报错:

#cp post-commit.tmpl post-commit

#chmod +x post-commit

4.3.3事件说明

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

 

 

 

  以上表格信息参考(侵删):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。

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

 

 

构建完成后即可实现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) 中设置。

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

 

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

 

 

 

比如将超时时间调整为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+svn自动化部署完整教程

 

 

注意:如果配置了参数化构建过程,则需要保证默认值为正确的分支。

同时,如果使用了Jenkins的API进行调用,则需要保证输入的分支名称是正确存在的。

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

 

 

 

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+svn自动化部署完整教程

 

 

我在jenkins里配置的很简单,就是cd 目录,然后  sh server.sh 。 进入目录,执行一个脚本。 

后来在网上查了一下,得到的答案很多, 第一种说是磁盘满了。 我用#df -hl查看磁盘剩余空间,发现实际不是这个问题

第二种解释是说,脚本里的命令没有返回0, 有可能ps的时候得到两个进程,没有把本身线程去掉, 加一个 grep -v grep 这个我对照了一下,脚本里也是有的。

后来我在脚本 server.sh的最后 加了一行  exit 0 发现还是不管用

我想了下,其实所有的流程都已经成功了,无非是哪个语句在执行的时候没有正确返回,所以我最后直接在jenkins的脚本后面 配置了一个  ps -ef | grep java

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

 

 

完整命令: 

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、现象

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

 

 

 

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;

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

 

 

因为此时我默认安装的jdk的路径是“/usr/java/jdk1.8.0_91/bin/”,此时我们需要修改下Jenkins的查找jdk的路径;

打开“Jenkins的启动脚本路径/etc/rc.d/init.d/jenkins”,搜索jdk的配置路径

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

 

 

此时观察我们发现默认搜索的路径是/usr/bin/java,所以需要变更成为自己的jdk路径“/usr/java/jdk1.8.0_91/bin/java”,注意需要指定到java的执行文件,修改完成重新启动;

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

 

 

这样我们就可以成功的启动Jenkins啦

 

 

 

5.14 jenkins无法将war包发送到远程服务器之路径配置

1、现象:虽然表现为finished success,但实际传输文件为0

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

 

 

 

2、解决方案:

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

 

 

这时候选择你要的服务器,这时候是不是发现你没有服务器可以选择,别着急,先看完,后面会讲如何添加远程服务器。

(1)、Sourec files这个是配置war包的,具体内容:

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

 

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

 

 

两个红框中的目录的差就是此处要填写的内容:iSteam_server/target/*.war。

(2)、Remove prefix这个是移除前缀目录的,主要是我的war包在根目录下面的iSteam_server/target下面,所以要移除iSteam_server/target这个目录。

 

(3)、Remote directory 这个目录要传送war包到目标服务器的目录,这个很关键,这个适合系统管理-》系统设置中的Publish over SSH的Remote Directory拼在一起的:最后的结果是/usr/local/tomcat/webapps。

(4)、Exec command 这个是要执行的远程脚本目录,主要是用于tomcat的重启,部署,达到自动化部署的目的,如果不写脚本,那就jenkins只能帮你把war包传到目标服务器而已。

 

 

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

1、现象:用jenkins打包往各节点自动发布代码时,遇到如下问题:

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

 

 

2、解决方案:

从提示来看,应该是权限问题。在configure中检查发现,jenkins ssh 10.101.3.167是用test用户远程的,而非root用户。

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

 

 

在发布路径下查看发包的工程权限,如下图所示。原来eie_info只有root用户才有权限操作,ssh远程发布项目时test用户无法覆盖eie_info导致发布失败,故只要删除eie_info项目或者给项目test完全权限,问题即可解决,如下。

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

 

 

 

修改后,jekins可以发布成功!