Last Updated on

前言

上一篇,记录了Jenkins的安装,下面就从Jenkins最常用的实践之一开始说起,从实践中熟悉Jenkins的使用。

这一篇我们实现通过参数化构建,选择分支,实现maven项目的构建与发布。话不多说,下面开始。

正文

1. 插件准备

首先要完成参数化构建和maven项目构建与部署,首先需要安装相关插件:

  • Build With Parameters,参数化构建插件
  • Git Parameter, 实现选择git仓库分支,tag等作为参数传递
  • Maven Integration,maven项目基础插件,安装后才可以创建mavne项目
  • Persistent Parameter,实现参数默认值为上一次构建成功的值
  • Publish Over SSH,发送文件并执行命令

安装完Publish Over SSH插件后,需要配置接受文件执行命令的服务器连接,然后在job中就可以配置发送文件并在对应服务器上执行命令。

进去系统配置,新增服务器连接信息,根据实际服务器的连接方式进行配置,然后就可以在job中向此服务器发送文件并执行命令了。


安装完成以上相关插件后,还需要配置mavne的全局工具配置,添加maven,git,jdk等相关程序,如下:

默认全局的maven配置,指定为系统中安装的maven的settings.xml:

以上工具为手动安装,并没有使用jenkins自带的自动安装,以方便我们自己进行管理。

2. 创建maven项目

新建job,选择maven项目:

3. 添加构建参数

添加构建参数,常用的参数类型,有Git Parameter分支参数,和常见的字符串参数,选择参数,布尔值参数。 Persistent 开头的参数与自带的插件的区别就是,Persistent参数会默认保留上一次构建成功的参数,而不是直接显示设定的默认参数。
Git Parameter 插件就更常用了,可以通过git连接,列出git的分支进行选择,然后使用指定分支代码进行构建,非常好用。

这里我们定义一个Git分支参数和一个字符串参数,如下:

定义了参数后,在下面通过 $参数名 就可以调用参数了。

这里有一个 Successful Only,勾选上时,就会保留上一次构建成功的值作为下一次构建时的参数的默认值。

4. 添加Git代码仓库

Git代码仓库配置,在选择分支这里,通过上面定义的Git 分支参数名,使用 $参数名 来调用参数,实现自定义选择分支进行代码拉取。

5. 设置maven打包命令

然后配置maven打包命令,常见如下,根据自己的项目进行配置,在高级中也可以单独指定更多maven设置。

6. 发送war包并重启tomcat

构建完成后,就需要将构建好的war包发送到目标服务器上,然后通过tomcat启动服务。需要使用到上面设置好的服务器。

这里我选择只有mavne构建成功才执行下面的操作,选择添加如下的步骤:

这里要注意了,先说明一下这些参数的意思和作用:

Source files: 源文件路径,输入的是jenkins中此job的workspace的相对路径,其中可以使用通配符*,如*.jar表示所有.jar后缀的文件。还可以使用**表示此所有文件与子目录的所有文件。

Remove prefix: 指源目录地址中,从哪个路径还是传,比如,我这里源路径为:x5/target/x5.war,如果我不指定Remove prefix,那么传过去的文件目录就够就是x5/target/x5.war,会将前面的文件夹也一次传递过去,但是我只是要x5.war这个文件,前面的目录不要,所以我定义了Remove prefix为 x5/target/,那么传输到目标服务器上时,就只有x5.war一个文件,而不包含前面的目录文件夹。

Remote directory:指定文件传送到目标服务器上的哪个路径下。另外,最初上面在系统配置中定义服务器连接信息时也会定义一个Remote Directory,这里的这个目录会加在系统配置中定义的目录之下。比如:我在系统配置中定义的目录为/home,在这里job中定义远程路径为/opt/tomcat/,那么最后文件会被传输到远程服务器的/home/opt/tomcat目录下,也就是说不管你在job中定义什么,都不会超出系统配置中定义的路径,只能在系统配置中定义的路径之下。因为我上面在系统配置中定义的路径为/,即根目录,所以在job中定义/opt/tomcat/webapps/就能传文件到远程服务器上的/opt/tomcat/webapps/下。

Exec command:执行的命令,其中可以直接应用上面定义的参数,来控制部署过程,这里我只是简单打印出来而已,具体根据实际的项目情况进行灵活使用。PS:执行命令的用户为系统配置中服务器连接时的连接用户,如果用root连接则是用root用户执行命令。另外,登录后执行shell时,由于其并不是交互式模式,定义在/etc/profile中的环境变量会无法获取到,可以手动在命令中添加source /etc/profile 来添加环境变量,也可以将环境变量定义到登录用户的.bashrc文件中,在用户登录时则会自动加载。

除了上面这些基础的配置外,还有一些需要注意的,如果你连接服务器的不是root用户,但是又想用使用root的权限,默认情况下,sudo命令是无法使用的,需要通过pty,tty终端连接,才能使用sudo命令,这是由visudo中的下图中的配置所定义的,注释掉下图中的配置就可以正常使用sudo。在自己安装的centos7服务器上,默认是这样的。但是在阿里云等云服务器上,centos7服务器上,默认是没有此配置的,也就可以直接shell直接使用sudo命令。(具体的可以直接通过visudo命令查看配置是否存在)

在插件的高级选项中,有一行pty的选项,可以使用pty连接,则可以使用sudo命令

PS:但是!!,使用pty连接执行的shell,如果你在shell中启动了tomcat服务,但是连接断开后,默认会杀死由于这个连接所开的衍生进程,也就是默认会kill掉你在命令中启动的tomcat服务。

所以,我这里建议各位:不要使用pty!!,最好是程序用什么用户执行,则使用什么用户登录,而如果非要通过sudo来获取root权限,则通过注释visudo中的Default requiretty 配置来实现sudo命令的使用。

结束

OK,到此就配置完了,执行此job,通过build log查看构建过程,调试,构建结果等。

此为Jenkins的最常见的单个maven项目部署过程,很经典,但是也还存在很多的问题,比如如果要部署多台服务器,每台服务器要部署多个应用,若不多还好,如果很多,比如微服务的情况,需要启动在多台服务器上,分别使用jar包,启动多个程序,如果使用此方式,则Jenkins的配置会非常繁多。

另外,Publish Over SSH插件还有一个问题,就是无法通过网关代理服务器连接,即如果需要部署的服务器无法直接连接,比如在阿里云的内网中,需要通过一个可以连接的服务器作为网关进行中转跳板,在系统配置中,是有一项Jump Host的配置,但是此配置是没有用的,起码我通过多次尝试都是无法正常使用的。

对于这些问题,曾有人问过我,该怎么做,我当时推荐说通过脚本去自定义控制,不使用Publish Over SSH插件。后面我会分享一个部署脚本项目,教大家如果通过通过脚本自定义控制部署,灵活解决几乎所有部署问题。

好了,这个实践就到这里,有任何问题,欢迎留言。