Jenkins是一款由Java编写的开源的持续集成工具,也是开源CI&CD软件领导者,本文介绍Jenkins的自动构建,部署SpringBoot项目、传统War项目、前端项目。

环境准备

部署Jenkins的服务器上安装有Java、Maven、Node环境。

配置Jenkins

配置Java

Dashboard -> Manage Jenkins -> Global Tool Configuration,在JDK这一栏点击JDK安装新增JDK,如下图所示:

Jenkins-JDK

配置Maven

Dashboard -> Manage Jenkins -> Global Tool Configuration,在Maven这一栏点击Maven安装新增Maven,如下图所示:

Jenkins-Maven

配置NodeJS

Dashboard -> Manage Jenkins -> Global Tool Configuration,在NodeJS这一栏点击NodeJS安装新增NodeJS,如下图所示:

Jenkins-NodeJS

配置Publish over SSH

Dashboard -> Manage Jenkins -> Configure System,在Publish over SSH这一栏点击新增,如下图所示:

Jenkins - SSH

  • Name :服务器名称,自定义可辨识即可
  • Hostname:服务器的主机名或者IP
  • Username:用户名
  • Remote Directory:远程路径,默认是用户的Home目录。

点击高级,点击Use password authentiation配置密码:

image-20210717165637735

配置完成后,点击右下角的Test Configuration测试是否正确:

Jenkins-Test

左下角显示Success即配置成功。

配置自动编译部署SpringBoot项目

新建Item

Dashboard -> 新建Item -> Freestyle Project

新建Jenkins Job

配置保持构建的策略

General中的描述下面勾选Discard old builds

Jenkins-discard

配置Git

源码管理中选择git,输入仓库地址,可用户认证信息,没有的点击添加即可

Jenkins-src

指定分支默认是*/master,可根据自己的需要修改为类似*/dev*/test之类的分支名称。

构建环境

在构建环境中勾选Add timestamps to the Console Output 选项,这一步非必选。

Jenins-env

构建

构建中点击增加构建步骤选择Invoke top-level Maven targets

Jenkins-build

内容如下:

Jenkins-build-maven

选择Maven版本,目标便是Maven打包的命令,注意不要把mvn填写进去。

构建后操作

构建后操作中点击增加构建后操作步骤选择Send build artifacts over SSH

Jenkins-after-build

按照如下进行配置:

Jenkins-after-build-ssh

参数说明

  • Name: @配置Publish 设置的SSH Sverver的名字列表
  • Source files: 复制到运程机上的文件,相对workspace的路径,也支持表达式,如上图中的@test-web/target/test-web.jar
  • Remove prefix: 文件复制时要过滤的目录,如上图中的@target 目录
  • Remote directory: 文件上传到远程机上的目录,此目录是相对于@SSH 中的@Remote 的,如果不存在将会自动创建
  • Exec command: 在这里可以填写在运程机器上执行的脚本

在部署服务器上的操作

假设我们本次需要将TestSpringBoot项目部署到10.10.22:20中,并使用app用户启动,登录到10.10.22:20中。

创建应用部署目录

1
2
mkdir -p ~/test-web
mkdir -p ~/test-web/backup # 其实执行这个就OK

创建Jenkins-depoly.sh

1
2
touch ~/test-web/jenkins-depoly.sh
vim ~/test-web/jenkins-depoly.sh

文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# /usr/bin
#
DATE=$(date +%Y%m%d%H%M)
export JAVA_HOME PATH CLASSPATH
JAVA_HOME=/usr/local/java/jdk-11.0.11
PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$CLASSPATH
DIR=/home/app/test-web
JARFILE=test-web.jar

if [ ! -d $DIR/backup ];then
mkdir -p $DIR/backup
fi
cd $DIR

ps -ef | grep $JARFILE | grep -v grep | awk '{print $2}' | xargs kill -9
mv $JARFILE backup/$JARFILE"_"${DATE}
mv -f /home/app/test-web-jenkins/$JARFILE .

java -jar $JARFILE --spring.profiles.active=dev --server.port=8092 > test-web.out &
if [ $? = 0 ];then
sleep 30
tail -n 50 test-web.out
fi

cd backup/
ls -lt|awk 'NR>5{print $NF}'|xargs rm -rf

如此,使用Jenkins自动构建部署SpringBoot项目的配置已经完成。

配置自动编译部署传统War项目

有些项目还是使用比较传统的Spring项目,将其打包为war,然后部署到Tomcat中。与SpringBoot项目的流程类似,只不过构建后操作不同罢了,前面的就不赘述了。

构建后操作

构建后操作中点击增加构建后操作步骤选择Deploy war/ear to a container,按照如下配置:

Jenkins-war

Tomcat配置

配置tomcat-users.xml

tomcat-users.xml中填入如下内容:

1
2
3
4
5
6
<role rolename="admin-gui"/>
<role rolename="admin-script"/>
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="manager-status"/>
<user username="busopt" password="123456" roles="admin-gui,manager-script,manager-gui,admin-script" />

配置context.xml

vim webapps/manager/META-INF/context.xml,偷懒的话将Value标签注释了,有兴趣也可以配置下对应的规则也行。

1
2
3
4
5
6
7
<Context antiResourceLocking="false" privileged="true" >
<!--
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
-->
<Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>

配置自动编译部署前端项目

对于前端项目,有差异的也就是从构建环境开始,前面的都一模一样。

构建环境

在构建环境中勾选Add timestamps to the Console OutputProvide Node & npm bin/ folder to PATH 选项,如下图所示:

Jenkins-web

构建

构建中点击增加构建步骤选择Execute NodeJS script:

Jenkins-build-web

构建后操作

构建后操作中点击增加构建后操作步骤选择Send build artifacts over SSH,如下图所示:

Jenkins-after-build-web

jenkins-test-web.sh内容如下,与springboot一样的逻辑:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# /usr/bin
#
DATE=$(date +%Y%m%d)
DIR=/data/wwwroot
WWWROOT=test_web
BACKUP=/data/wwwbackup
CRTBACKDIR=$BACKUP/$WWWROOT"_"${DATE}
if [ ! -d $BACKUP ];then
mkdir -p $BACKUP
fi
cd $DIR
mkdir -p $BACKUP/$WWWROOT"_"${DATE}
rm -fr $BACKUP/$WWWROOT"_"${DATE}/*
mv $WWWROOT/* $BACKUP/$WWWROOT"_"${DATE}/
mv -f /root/data/jenkins-pkg/$WWWROOT/dist/* $WWWROOT/

cd $BACKUP
ls -lt|awk 'NR>5{print $NF}'|xargs rm -rf
rm -fr /root/data/jenkins-pkg/$WWWROOT/dist/*

如此,Jenkins对于前端项目的打包、编译、部署已经完成。