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


1、概述

Centos7.0 64位

Vmware workstation 16.1

2、前期准备

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环境

项目

要求

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 安装

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

3.1 Jenkins安装

## 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 在线安装

安装并启动 Tomcat;

从官网下载 jenkins.war 至 $CATALINA_BASE/webapps,Tomcat 会自动部署;

浏览器访问:http://centos:8080/jenkins/

3.1.4 免安装方式

3.2.1 启动Jenkins访问

3.3.1 全局安全设置

进入:系统管理 / 全局工具设置(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(系统管理)   >> Configure System(系统管理)

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

 

4、自动化部署tomcat

4.1.1 创建maven项目

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

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

Root POM:  pom.xml 

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

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

4.2 构建后操作

保存后构建即可

附上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热部署

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

4.3.1 webhook简介

目录下将有多个脚本

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

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

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

#cp post-commit.tmpl post-commit

#chmod +x post-commit

4.3.3 事件说明

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自查

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

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

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

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

在远程部署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

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

通过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、现象:用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