一、环境说明
所需服务器:
SVN服务器;
Jenkins服务器;
代码运行服务器;
服务器环境要求:
SVN服务器:无
Jenkins服务器:jdk、maven
运行服务器:jdk
执行步骤:
编写Java代码;
代码上传SVN;
Jenkins从SVN拉取代码,编译构建后,推送到运行服务器上并运行;
执行说明:
测试项目DemoApplication上传到svn的仓库p2中,jenkins通过Subversion插件从svn中拉取代码,通过Maven Intergration插件配置pom.xml文件位置和要执行的构建命令,最后通过Publish Over SSH插件将构建好的jar包通过ssh上传到目标服务器的指定文件夹中。
二、Jenkins服务器搭建
2.1 JDK安装
下载
yum install -y java-devel
配置环境变量(vi /etc/profile)
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
export PATH=$JAVA_HOME/bin:$PATH
刷新环境变量
source /etc/profile
2.2 Maven安装
maven官网下载tar.gz压缩包,在linux上解压
解压命令
tar -zxvf <apache-maven-xxx.tar.gz>
配置环境变量
export MAVEN_HOME=/opt/maven/apache-maven-3.9.6
export PATH=$MAVEN_HOME/bin:$PATH
刷新环境变量
source /etc/profile
修改maven配置文件
// 配置本地仓库
<localRepository>/opt/maven/repository</localRepository>
// 配置阿里云镜像,要在<mirrors>标签里
<mirror>
<id>aliyun-maven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven mirror</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
2.3 Jenkins安装
参考连接:
官方下载war包(2.346.1版,适配jdk8)
War Jenkins Packageshttps://get.jenkins.io/war-stable/
后台运行
nohup java -jar jenkins.war --httpPort=8080 &
浏览器访问(解锁jenkins)
安装插件
Subversion 2.15.5
Localization:Chinese 1.0.24
Credentials
Maven Intergration 3.22
Publish Over SSH 1.24
2.4 Jenkins配置JDK环境
在【Manage Jenkins】->【Gloal Tool Configuration】-> 【JDK】下,新增jdk。
2.5 Jenkins配置Maven环境
在【Manage Jenkins】->【Gloal Tool Configuration】-> 【Maven】下,新增maven。
2.6 Jenkins配置SSH服务器
在【Manage Jenkins】->【Configure System】-> 【SSH Servers】下,配置运行服务器信息,点击高级按钮,登录配置密码。RemoteDirectory代表要把jar包传递到哪个目录(后面会用到这个配置,不要忘了)。
三、SVN服务器搭建
参考连接
四、运行服务器搭建
4.1 JDK环境配置
下载
yum install -y java-devel
配置环境变量(vi /etc/profile)
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
export PATH=$JAVA_HOME/bin:$PATH
刷新环境变量
source /etc/profile
五、Jenkins打包流程
5.1 编写测试代码DemoApplication
代码结构:
pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.3.RELEASE</version>
</parent>
<packaging>jar</packaging>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
DemoApplication.java
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
HelloController.java
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello(){
return "hello ," + new Date();
}
}
application.properties
server.port=8080
5.2 上传代码到SVN
5.3 Jenkins新建Item
选择【新建一个maven项目】
5.4 Jenkins配置SVN地址
在【源码管理】中,选择subversion,填入URL和用户账号
5.5 Jenkins配置Build
在【Build】中,配置pom.xml所在位置,和要执行的maven命令
clean package
5.6 Jenkins配置Post Steps
在【Post Steps】中选择【send files or execute commands over SSH】
- 在【Name】中选择前面配置的SSH服务器;
- 在【Source file】中选择要传输的文件;(可以在服务器的/root/.jenkins/workspace中查看到新建的Item,如果没有就先执行一下任务的build。进入Item中可以看到jenkins使用Maven插件构建的代码目录,在target中选择要传输的文件即可。jenkins会从你创建的Item目录开始查找,本文中是Project1,你只需要写相对路径即可。)
- 在【Remove prefix】中配置去除的前缀;(即默认SSH传输的文件是带目录结构的。如本文中的target/DemoApplactaion.jar,传递到SSH服务器将会是/opt/test/target/DemoApplication.jar。去除target前缀后,就会是/opt/test/DemoApplication.jar。(其中/opt是3.6节配置的,/test是下面【Remote directory配置的】
) -
【Exec command】配置文件传输的SSH服务器后,要执行的命令,这里是启动jar;
使用以下命令,指定日志的存储路径,可以避免命令行卡顿导致任务执行失败
nohup java -jar /opt/test/DemoApplication-*.jar >app.log 2>&1 &
5.7 Jenkins配置Pre Steps
选择Send files or execute commands over SSH,
执行linux中的shell脚本,杀死进程、删除jar包和日志文件。
clean.sh
#!/bin/bash
#获取脚本传入的第一个变量
AppName=$1
if [ -z $AppName ]
then
echo '应用名称不能为空'
exit 1
fi
#获取pid
pid=`ps -ef | grep $AppName | grep 'java -jar' | awk '{printf $2}'`
#使用-z判断pid是否为空
if [ -z $pid ];
then
echo "$AppName not running..."
exit 1
else
kill -9 $pid
echo "$AppName stoping..."
fi
#查询是否真正kill掉
check=`ps -ef | grep -w $pid | grep 'java -jar'`
if [ -z $check ]
then
echo "$AppName sotpped!"
else
echo "sotp $AppName failed!"
fi
#删除历史数据
rm -rf DemoApplication-*.jar
rm -rf nohup.out