jenkins pipeline 发布 jar并运行
废话不多说,上教程
一,配置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: