首页 > 其他分享 >Docker+Jenkins+Pipline实现SpringBoot项目input选择不同差异性yml文件打包、执行sh打包压缩包、使用archiveArtifacts下载制品(jar包、压缩包)

Docker+Jenkins+Pipline实现SpringBoot项目input选择不同差异性yml文件打包、执行sh打包压缩包、使用archiveArtifacts下载制品(jar包、压缩包)

时间:2024-06-17 17:14:04浏览次数:23  
标签:SpringBoot gz server sh 压缩包 WORKSPACE diff 目录 打包

场景

Docker+Jenkins+Pipline如何获取git插件环境变量(提交sha、分支等)以及Jenkinsfile中获取sh执行结果(获取git最近提交信息):

https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/139697004

在上面的基础上实现了使用Jenkinsfile文件获取git的提交记录以及获取sh的执行结果等效果。

后续需要对SpringBoot项目进行打包成jar包,并可以根据不同的yml差异化配置文件打包成压缩包。

进而实现不用环境下根据打包时人工选择的差异性文件名称打包成不同的tar.gz压缩包。

注:

博客:
https://blog.csdn.net/badao_liumang_qizhi

实现

1、新建SpringBoot项目并在项目根目录下新建diff目录,并在此目录下新建各种不同环境下的差异性yml目录

 

2、Pipeline/Jenkinsfile/Groovy中如何获取当前工作目录下的指定目录下的所有子目录名称并作为input选项进行选择。

在Jenkinsfile中的steps的script中这样写

                        //获取所有子目录
                        diffFile = sh([script: "cd $WORKSPACE/diff&&ls -d *", returnStdout: true])
                        println(diffFile)
                        //选择使用哪个子目录的差异文件
                        env.DIFF = input(id: 'diff', message: '选择差异文件', parameters: [choice(name: 'diff', choices: diffFile, description: '差异文件')])
                        println(env.DIFF)

语法介绍参照上面博客或官方文档说明,其中$WORKSPACE为当前工作路径,即进入到代码根目录下的diff路径下,然后扫描所有子目录的名称

并赋值给diffFile,然后再将其赋值给input的下拉选项。

3、下一步的思路是将mvn打包后的jar包文件以及选择的diff下面的对应环境的配置文件都复制到某路径下,比如新建一个server目录

然后将整个server目录打包成tar.gz包。

在创建server目录前需要判定下server目录是否存在,存在则将整个目录删除。

Pipeline/Jenkinsfile/Groovy中如何获取当前工作目录以及进行路径字符串的拼接

需要获取到server路径的完整路径

dirToDelete = env.WORKSPACE+'/ruoyi-admin/target/server'

其中env.WORKSPACE用来获取当前工作目录,路径字符串拼接直接使用+即可。

Pipeline/Jenkinsfile/Groovy中如何判断某路径存在,存在则删除

通过如下

                        //要删除的server目录的路径
                        dirToDelete = env.WORKSPACE+'/ruoyi-admin/target/server'
                        // 判断目录是否存在
                        exists = sh([script: "if [ -d '${dirToDelete}' ]; then echo 'true'; else echo 'false'; fi", returnStdout: true]).trim()
                        println(exists)
                        if (exists == 'true') {
                            // 目录存在,删除目录
                            sh "rm -rf ${dirToDelete}"
                        }

其中dirToDelete 为要判断是否存在的目录路径,如果存在则sh执行的结果为true,否则为false

sh中的script部分就是linux中用来判断某目录是否存在,存在则为输出true,不存在则输出false的实现

注意中间涉及到路径字符串变量的使用${dirToDelete}

4、Pipeline/Jenkinsfile/Groovy中实现执行sh代码块并进入到工作目录下相对路径下、删除所有指定后缀的文件,并打包成tar.gz包

Pipeline/Jenkinsfile/Groovy中实现执行sh代码块/多行代码的方式是

                   sh '''

                   '''

中间换行跟多行sh命令

Pipeline/Jenkinsfile/Groovy中实现sh进入到工作路径下的相对路径下的方式是

                   sh '''
                       cd ${WORKSPACE}/ruoyi-admin/target
                   '''

下面的实现与linux中实现删除指定后缀名结尾的文件以及打包整个目录为tar.gz包的命令一致

但是需要注意的是这里在使用linux命令打包成tar.gz包时文件命名使用了获取当前时间时间戳的方式

                       find . -type f -name "*.tar.gz" | xargs rm -f
                       mkdir server && cp -r ./*.jar ${WORKSPACE}/diff/$DIFF/* server
                       tar -zcvf ./server-$DIFF-$(date \'+%Y%m%d%H%M\').tar.gz server/

此处选择差异化文件并打包的完整steps

        stage('选择差异性文件并压缩') {
            steps {
                   script {
                        //获取所有子目录
                        diffFile = sh([script: "cd $WORKSPACE/diff&&ls -d *", returnStdout: true])
                        println(diffFile)
                        //选择使用哪个子目录的差异文件
                        env.DIFF = input(id: 'diff', message: '选择差异文件', parameters: [choice(name: 'diff', choices: diffFile, description: '差异文件')])
                        println(env.DIFF)
                        //要删除的server目录的路径
                        dirToDelete = env.WORKSPACE+'/ruoyi-admin/target/server'
                        // 判断目录是否存在
                        exists = sh([script: "if [ -d '${dirToDelete}' ]; then echo 'true'; else echo 'false'; fi", returnStdout: true]).trim()
                        println(exists)
                        if (exists == 'true') {
                            // 目录存在,删除目录
                            sh "rm -rf ${dirToDelete}"
                        }
                   }
                   sh '''
                       cd ${WORKSPACE}/ruoyi-admin/target
                       find . -type f -name "*.tar.gz" | xargs rm -f
                       mkdir server && cp -r ./*.jar ${WORKSPACE}/diff/$DIFF/* server
                       tar -zcvf ./server-$DIFF-$(date \'+%Y%m%d%H%M\').tar.gz server/
                   '''
            }
        }

运行效果

 

可以查看构建日志验证

 

5、Pipeline/Jenkinsfile/Groovy中使用archiveArtifacts artifacts实现制品下载/文件/压缩包下载

上面打包之后的tar.gz包如果不需要通过ssh等方式进行部署,只需要能通过浏览器将其下载到本地,可通过

archiveArtifacts artifacts实现

添加如下语句

archiveArtifacts artifacts: '*/target/*.gz', followSymlinks: false

会扫描target下所有的.gz结尾的文件并提供下载

将其放在构建成功之后的post中

 post {
        always {
            echo '构建结束,结果:'
        }
  success {
            echo '构建成功'
            //制品归档
            archiveArtifacts artifacts: '*/target/*.gz', followSymlinks: false
        }
  failure {
            echo '构建失败'
        }
    }

然后再构建成功后会显示文件名,直接点击文件名下载到本地

 

完整jenkinsfile构建文件

pipeline {
    agent any
 tools {
        maven 'maven'
        jdk   'jdk'
    }
    stages {
        stage('获取提交信息') {
            steps {
                script {
                    try {
                        def gitPreviousCommit = env.GIT_PREVIOUS_COMMIT
                        println("gitPreviousCommit: ${gitPreviousCommit}")
                        def gitCommit = env.GIT_COMMIT
                        println("gitCommit: ${gitCommit}")
                        def gitBranch = env.GIT_BRANCH
                        println("gitBranch: ${gitBranch}")
                        def commit = sh(returnStdout: true, script: "git log -1 --pretty=format:'%h - %an, %ar : %s'").trim()
                        println("获取提交信息: ${commit}")
                    } catch (Exception ex) {
                        println("获取提交信息异常: ${ex}")
                    }
                }
            }
        }
  stage('编译构建') {
            steps {
                echo '编译构建'
                sh 'mvn clean package -DskipTests'
            }
        }
        stage('选择差异性文件并压缩') {
            steps {
                   script {
                        //获取所有子目录
                        diffFile = sh([script: "cd $WORKSPACE/diff&&ls -d *", returnStdout: true])
                        println(diffFile)
                        //选择使用哪个子目录的差异文件
                        env.DIFF = input(id: 'diff', message: '选择差异文件', parameters: [choice(name: 'diff', choices: diffFile, description: '差异文件')])
                        println(env.DIFF)
                        //要删除的server目录的路径
                        dirToDelete = env.WORKSPACE+'/ruoyi-admin/target/server'
                        // 判断目录是否存在
                        exists = sh([script: "if [ -d '${dirToDelete}' ]; then echo 'true'; else echo 'false'; fi", returnStdout: true]).trim()
                        println(exists)
                        if (exists == 'true') {
                            // 目录存在,删除目录
                            sh "rm -rf ${dirToDelete}"
                        }
                   }
                   sh '''
                       cd ${WORKSPACE}/ruoyi-admin/target
                       find . -type f -name "*.tar.gz" | xargs rm -f
                       mkdir server && cp -r ./*.jar ${WORKSPACE}/diff/$DIFF/* server
                       tar -zcvf ./server-$DIFF-$(date \'+%Y%m%d%H%M\').tar.gz server/
                   '''
            }
        }
    }
 post {
        always {
            echo '构建结束,结果:'
        }
  success {
            echo '构建成功'
            //制品归档
            archiveArtifacts artifacts: '*/target/*.gz', followSymlinks: false
        }
  failure {
            echo '构建失败'
        }
    }
}

标签:SpringBoot,gz,server,sh,压缩包,WORKSPACE,diff,目录,打包
From: https://www.cnblogs.com/badaoliumangqizhi/p/18252765

相关文章

  • SpringBoot基础篇
    SpringBoot视频链接:【黑马程序员SpringBoot3+Vue3全套视频教程,springboot+vue企业级全栈开发从基础、实战到面试一套通关】https://www.bilibili.com/video/BV14z4y1N7pg?p=20&vd_source=12bdb5b78bd5d1c45cab173f3aad839b概述SpringBoot是Spring提供的一个子项目......
  • SpringBoot开发Activiti工作流实现审批流程(全套源码)
    前言activiti工作流引擎项目,企业erp、oa、hr、crm等企事业办公系统轻松落地,一套完整并且实际运用在多套项目中的案例,满足日常业务流程审批需求。一、项目形式springboot+vue+activiti集成了activiti在线编辑器,流行的前后端分离部署开发模式,快速开发平台,可插拔工作流服务。工......
  • SpringBoot配置第三方专业缓存技术Memcached 下载 安装 整合测试 5000字详解
    Memcached下载和安装是一个国内使用量还是比较大的技术打开文件夹我们需要在命令行窗口启动注意要以管理员方式运行先尝试进入指定文件然后又再次运行下载memcached.exe-dinstall启动memcached.exe-dstart停止memcached.exe-dstopmemcached.exe-din......
  • 7、docker-commit镜像、将容器打包成一个镜像
    #dockercommit提交容器成为一个新的副本#dockercommit-m="提交的描述信息"-a="作者"容器id目标镜像名:[TAG]===========================================测试:1、启动tomcat·启动:dockerrun-it -p8080:8080tomcat//此命令进到容器后......
  • 使用SpringBoot对接Kafka
    Kafka是什么,以及如何使用SpringBoot对接Kafka一、Kafka与流处理我们先来看看比较正式的介绍:Kafka是一种流处理平台,由LinkedIn公司创建,现在是Apache下的开源项目。Kafka通过发布/订阅机制实现消息的异步传输和处理。它具有高吞吐量、低延迟、可伸缩性和可靠性等优点,使其成为......
  • layui 构建工具gulp打包LayuiAdmin
    https://blog.csdn.net/u010334503/article/details/128762800项目可采用gulp构建,gulpfile.js是任务脚本,package.json是任务配置文件step1:确保你的电脑已经安装好了Node.jsstep2:命令行安装gulp:npminstallgulp-gstep3:切换到该项目根目录(即gulpfile.js所在目录),命令行......
  • 基于springboot的球队训练信息管理系统源码数据库
    传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装球队训练信息管理系统软件来发挥其高效地信息处理的作用,可以规范信息管理流程,让管理工作可以系统化和程序化,同时,球队训练信息管理系......
  • 基于springboot的青年公寓服务平台源码数据库
    传统信息的管理大部分依赖于管理人员的手工登记与管理,然而,随着近些年信息技术的迅猛发展,让许多比较老套的信息管理模式进行了更新迭代,房屋信息因为其管理内容繁杂,管理数量繁多导致手工进行处理不能满足广大用户的需求,因此就应运而生出相应的青年公寓服务平台。本青年公寓服务......
  • 基于springboot的无人智慧超市管理系统【附源码】
    效果如下:首页注册商品信息个人中心管理员主页面仓储信息管理订单管理界面研究背景近年来,由于计算机技术和互联网技术的快速发展,使得所有企事业单位内部都是数字化、信息化、无纸化的发展趋势,随着趋势的发展,各种决策系统、辅助系统也应运而生,其中无人智慧超......
  • 基于springboot的学生宿舍管理系统(带 1w+字文档)
    基于springboot的学生宿舍管理系统(带1w+字文档)基于springboot+vue前后端分离的学生宿舍管理系统:前端vue2、elementui,后端maven、springmvc、spring、mybatis;项目简介本项目可供学习参考,商业慎用。项目带完整安装部署教程+1w+文档。技术栈IntelliJIDEA/Ecl......