场景

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 '构建失败'
        }
    }
}

posted on 2024-06-17 17:01  霸道流氓  阅读(16)  评论(0编辑  收藏  举报