前段时间学习了一下jenkins,怕忘了赶紧在工作用运用了一下~~~~~~
关于jenkins安装配置,以及流水线脚本等看这↓↓↓
jenkins安装部署以及应用
项目背景
springboot构建的项目,服务器为阿里云服务器,项目启动方式为shel脚本,本质就是在服务端使用
nohup java -jar xxx.jar &命令启动。
jenkins配置
1.jenkins使用war包方式安装,用tomcat容器运行
2.采用流水线任务方式实现以下流程:
- 环境检查 (jdk,mvn,git)
- git代码拉取
- 原jar包备份
- 新jar包拷贝到部署目录
- 应用启动部署
配置流程
项目改造
对项目改造主要有两部分:pom文件改造,创建Jenkins文件用来编写流水线脚本
pom文件改造:
pom主要是增加了profile,目的是在使用maven打包时指定配置文件,例如dev,test,prod等
<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<spring.profiles.active>dev</spring.profiles.active>
</properties>
</profile>
<profile>
<id>test</id>
<properties>
<spring.profiles.active>test</spring.profiles.active>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<spring.profiles.active>prd</spring.profiles.active>
</properties>
</profile>
....
项目的主配置文件也要修改(application.yml):
读取pom中激活的配置文件,默认就是dev
#spring 配置
spring:
profiles:
active: @spring.profiles.active@
Jenkinsfile
Jenkinsfile文件放在项目根目录下
pipeline {
agent {
label NODE_LABEL
}
stages {
stage('环境监测') {
steps {
echo '环境监测'
sh '''java -version
git --version
mvn -v'''
}
}
stage('拉取代码') {
steps {
echo '拉取代码'
//自己的git
}
}
stage('构建项目') {
steps {
echo '构建项目'
sh 'mvn clean package -Dmaven.test.skip-true -P $ACTIVE_FILE'
}
}
stage('备份jar包') {
steps {
echo '备份jar包'
sh '''\\cp -rf $WORK_DIR/repserver/repserver-0.0.1.jar $WORK_DIR/repserver/repserver-0.0.1.jar.`date +%m%d`
sleep 5'''
}
}
stage('拷贝新jar包') {
steps {
echo '拷贝新jar包'
sh '''\\cp -rf target/repserver-0.0.1.jar $WORK_DIR/repserver/
sleep 5'''
}
}
stage('项目部署') {
steps {
echo '项目部署'
withEnv(['JENKINS_NODE_COOKIE=dontkillme']){
sh '''cd $WORK_DIR/repserver/
./start.sh'''
}
}
}
}
}
这里面定义了一些参数,稍后会再配置任务时进行传入
参数解释:
NODE_LABEL:agent节点label,在构建任务时传入,用来选择具体在哪个node节点上执行任务
ACTIVE_FILE:激活的配置文件,在构建任务时传入,指定maven打包时使用的配置文件,例如测试就传test,正式发布就是传prod
WORK_DIR:agent节点的项目部署目录,不同的节点目录可能不同,在构建任务时传入
这里有个坑!!!
项目部署阶段,犹豫启动项目的shell脚本使用后台启动,也就是nohup &,本地执行脚本没有任何问题,但是在jenkins远程调用脚本就不会启动项目,也不会报错,查了一圈,最后解决,方式就是加一层withEnv
究其原因,是因为Jenkins默认会在Build结束后Kill掉所有的衍生进程,也就是执行的启动脚本刚启动引用进程就被jenkins给kill掉了,网上有很多人说要在启动的shell脚本中加入“BUILD_ID=XXXX”,这种经过测试没有作用,上面给出的方式经过验证可以用。
还有一种解决方式,就是改jenkins的配置,让jenkiins不再kill衍生进程,好处就是不用每次都写上面的配置,个人感觉这样做不好,可能某些原因导致服务有很多本该结束的进程大量存在,造成资源浪费、
下面是在别处看到的修改jenkins配置的案例,没有试过效果~~
配置流程
1.配置凭据:git凭据,用来从git上拉取代码;每个agent节点的ssh登陆凭据,用来通过ssh方式连接agent节点
2.添加agent节点,使用ssh方式连接agent
3.创建构建任务item
任务类型为流水线,流水线脚本从git拉取
构建参数说明一下,上面说在流水线脚本中定义了几个参数,需要在构建时传入,那些参数就在这里进行配置
经过以上这些配置,就可以构建任务进行部署了,配置写比较笼统懂得自然懂,不了解jenkins的看了一头雾水,可以参考开头的jenkins部署和应用文章,也是我写的,那个比较详细,有每一个步骤的详细说明。