废话不多说,上教程
一,配置publish ssh
二,配置 ssh server
记住Name
三 设置发布选项
1 设置模块多选(请安装多选插件:Active Choices Plug-in)
四 编写pipeline
说明:
1 modules.split(',')中的modules就是上面多选框的Name
2 详细解说:
execCommand: 'cd /java ; ps -ef | grep '+module_list[i].trim()+' | grep -v grep | awk \'{print $2}\' | xargs --no-run-if-empty kill -9 ; source /etc/profile ; nohup java -jar '+module_list[i].trim()+'.jar > '+module_list[i].trim()+'.log 2>&1 & '
// 转到目录
cd /java
//通过进程名查找PID
ps -ef | grep '+module_list[i].trim()+' | grep -v grep | awk \'{print $2}\'
//删除此进程(如果为空则不运行kill)
xargs --no-run-if-empty kill -9
//此命令配合nohup,不然Jenkins中无法通过nohup运行Jar
source /etc/profile ;
//后台运行nohup
nohup java -jar '+module_list[i].trim()+'.jar > '+module_list[i].trim()+'.log 2>&1 &
完整代码:
pipeline {
agent any
// 设置工具
tools {
maven "Maven3"
jdk "JDK17"
}
//动态参数
environment{
source_dir="${WORKSPACE}"
}
options {
timestamps() // 设置在项目打印日志时带上时间戳
disableConcurrentBuilds() // 不允许同时执行流水线,被用来防止同时访问公共资源等
timeout(time: 40, unit: 'MINUTES') // 设置流水线运行超时时间,Jenkins自动终止流水线
buildDiscarder(logRotator(numToKeepStr: '10')) // 保留n次构建历史
}
// 存放所有任务的合集
stages {
stage('clone') {
steps {
// 拉取代码
git credentialsId: 'xxxx-xxxx-xxxx-xxx-xxxxxxxx',
url: 'http://localhost:xxxx/xxxxx/kintech-cloud',
branch: 'dev'
}
}
// 打包
stage('install') {
steps {
script {
//服务名称数组
module_list = modules.split(',')
for (int i = 0; i < module_list.size(); i++) {
echo "=================package ${module_list[i]} "
// 打对应的项目以及依赖包
bat 'mvn -Dmaven.test.failure.ignore=true -pl kintech-modules/' + module_list[i].trim() + ' -am clean package '
}
echo 'Install success'
}
}
}
// 部署
stage('deploy') {
steps {
script {
for (int i = 0; i < module_list.size(); i++) {
echo "=================sshPublisher ${module_list[i]} "
// scp 免密传输
sshPublisher(publishers: [sshPublisherDesc(configName: 'kintech-cloud测试服务', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: 'ls', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: 'kintech-modules/'+module_list[i].trim()+'/target/', sourceFiles: 'kintech-modules/'+module_list[i].trim()+ '/target/' +module_list[i].trim()+'.jar')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: true)])
}
echo 'Deploy success'
}
}
}
// 启动
stage('start') {
steps {
script {
for (int i = 0; i < module_list.size(); i++) {
//启动 (cd到java目录,杀掉进程,启动jar)
sshPublisher(publishers: [sshPublisherDesc(configName: 'kintech-cloud测试服务', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: 'cd /java ; ps -ef | grep '+module_list[i].trim()+' | grep -v grep | awk \'{print $2}\' | xargs --no-run-if-empty kill -9 ; source /etc/profile ; nohup java -jar '+module_list[i].trim()+'.jar > '+module_list[i].trim()+'.log 2>&1 & ', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '/java', sourceFiles: '/java')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: true)])
}
echo 'Start success'
}
}
}
}
}
五 效果
六 题外话
我的模块层级,略有不同,所以打包路径也不一样。
如下图:
gateway就是一个模块,而kintech-bo模块在总的kintech-modules模块下。
所以发布jar时,打包路径会有所不同。
而我的解决方案是,增加一个选项框,用Referenced parameters 来记录。
最后在pipeline中拼接:modulesPath.trim()+module_list[i]
我的选项
注意,modulesPath带上/
kintech-modules:
kintech-gateway: