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_listi.trim()+' | grep -v grep | awk \'{print $2}\' | xargs --no-run-if-empty kill -9 ; source /etc/profile ; nohup java -jar '+module_listi.trim()+'.jar > '+module_listi.trim()+'.log 2>&1 & '

// 转到目录

cd /java

//通过进程名查找PID

ps -ef | grep '+module_listi.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_listi.trim()+'.jar > '+module_listi.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_listi

我的选项

注意,modulesPath带上/

kintech-modules:

kintech-gateway:

相关推荐
姜鱼问生4 小时前
Nginx 缓存命中率监控:从 X-Cache-Status 到实时统计
运维·nginx·缓存
Apipi*4 小时前
30天速通Linux 第六章信号及信号处理
linux·运维·信号处理
运维行者_5 小时前
网络性能监控怎么做?从自动发现到根因分析的4个环节
运维·服务器·网络·人工智能·支持向量机
此时不提桶,更待何时6 小时前
06-14-A-Kafka集群运维与迁移实战详解
运维·kafka
IT研究所8 小时前
AI-ITR平台如何减少客户问题反复升级?
大数据·运维·人工智能·低代码·自然语言处理·安全架构·企微
AIgorithmGEEK8 小时前
[Linux]从手写报头到内核套路:序列化、反序列化与自定义协议全链路
linux·运维·服务器·网络·序列化·反序列化
Nil2088 小时前
leetcode 139单词拆分
linux·运维·服务器
Starry-sky(jing)8 小时前
BUG: unable to handle kernel paging request 完整排查:dmesg 四要素与三路定罪
linux·运维·服务器·内核·排障
mounter6258 小时前
从硬件互连到操作系统变革:CXL 技术演进与 Linux 内核工程挑战
linux·运维·服务器
zhengqweasd8 小时前
机房托管服务器怎么选硬盘,机械盘和 SSD 托管场景差异
运维·服务器·github