场景

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

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

DockerCompose+Jenkins+Pipeline流水线打包Vue项目(解压安装配置Node)入门:

DockerCompose+Jenkins+Pipeline流水线打包Vue项目(解压安装配置Node)入门

上面分别讲了对Vue项目中使用Jenkins的配置以及打包SpringBoot项目时选择差异性文件打包的流程。

如果同理前端Vue项目也需要在打包时选择不同的差异性配置文件,比如每个配置文件中标题名称不一样,并且需要对配置文件

中的文本内容进行修改,比如需要修改时间戳字符串。

注:

博客:
霸道流氓气质

实现

1、首先在前端项目目录下新建diff差异性文件目录,并在该目录下新建各种环境下的配置文件,这里使用config目录下的config.js

然后再在前端代码根目录下新建Jenkinsfile文件。

注意前端代码在git仓库根目录下/ruoyi-ui目录下

Docker+Jenkins+Pipline实现Vue项目input选择不同差异性config文件并修改文件内容后打包、执行sh打包压缩包、使用archiveArtifacts下载制品(jar包、压缩_git

差异性文件config.js的内容为

module.exports = {
    titleName: '本地测试系统',
    version: '202406181345',
};

所以这里在新建流水线项目时要注意脚本路径为代码仓库根路径下的ruoyi-ui目录下的Jenkinsfile

将脚本路径配置为

ruoyi-ui/Jenkinsfile

Docker+Jenkins+Pipline实现Vue项目input选择不同差异性config文件并修改文件内容后打包、执行sh打包压缩包、使用archiveArtifacts下载制品(jar包、压缩_docker_02

2、整体步骤是获取git提交信息并输出,然后扫描diff目录下所有差异性文件目录并作为input的选项进行选择

然后删除上次打包的dist目录,然后将上次打包的tar.gz包删掉,然后将选择的差异性文件替换到现有的差异性文件

然后使用sed命令获取当前时间戳,并对配置文件的version进行修改

然后执行npm打包命令以及tar压缩命令

最后使用archiveArtifacts实现压缩包制品下载

第一步编辑Jenkinsfile文件首先实现获取提交信息

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}")
                  }
              }
          }
      }

然后第二步选择差异性文件实现

script {
                      //获取所有子目录
                      diffFile = sh([script: "cd $WORKSPACE/ruoyi-ui/diff&&ls -d *", returnStdout: true])
                      println(diffFile)
                      //选择使用哪个子目录的差异文件
                      env.DIFF = input(id: 'diff', message: '选择差异文件', parameters: [choice(name: 'diff', choices: diffFile, description: '差异文件')])
                      println(env.DIFF)
                      //要删除的dist目录的路径
                      dirToDelete = env.WORKSPACE+'/ruoyi-ui/dist'
                      // 判断目录是否存在
                      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命令块实现复制替换修改配置文件

sh '''
                     cd ${WORKSPACE}/ruoyi-ui
                     find . -type f -name "*.tar.gz" | xargs rm -f
                     cp -r ${WORKSPACE}/ruoyi-ui/diff/$DIFF/* ./public/
                     sed -i \"s/version:.*/version: \'$(date \'+%Y%m%d%H%M\')\',/\" ./public/config/config.js
                 '''

首先删除掉所有.tar.gz结尾的文件

然后将选择对应的差异新文件进行替换

然后Jenkinsfile中使用sh命令实现修改文件中的内容可通过sed命令实现,即这里的

sed -i \"s/version:.*/version: \'$(date \'+%Y%m%d%H%M\')\',/\" ./public/config/config.js

sed -i命令的使用格式

sed -i 's/原字符串/新字符串/' 文件路径

上面\使用的事转义符,因为整个是在sh命令块的引号中包裹的

然后替换完version字符串之后继续添加逗号和换行

第四步执行npm打包命令并进行tar打包压缩包

stage('编译构建') {
          steps {
           nodejs(nodeJSInstallationName: 'node', configId: '14997e88-6fc1-42bb-b9e8-bc54fe8aff81') {
                  sh 'cd ${WORKSPACE}/ruoyi-ui && npm install && npm run build:prod'
                  sh 'cd ${WORKSPACE}/ruoyi-ui && tar zcvf ./web-dist-$DIFF-$(date \'+%Y%m%d%H%M\').tar.gz ./dist'
              }
          }
      }

最后一步使用archiveArtifacts进行成品制作下载

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

完整Jenkinsfile文件

pipeline {
    agent any
 tools {
        nodejs 'node'
    }
    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 {
                 script {
                      //获取所有子目录
                      diffFile = sh([script: "cd $WORKSPACE/ruoyi-ui/diff&&ls -d *", returnStdout: true])
                      println(diffFile)
                      //选择使用哪个子目录的差异文件
                      env.DIFF = input(id: 'diff', message: '选择差异文件', parameters: [choice(name: 'diff', choices: diffFile, description: '差异文件')])
                      println(env.DIFF)
                      //要删除的dist目录的路径
                      dirToDelete = env.WORKSPACE+'/ruoyi-ui/dist'
                      // 判断目录是否存在
                      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-ui
                     find . -type f -name "*.tar.gz" | xargs rm -f
                     cp -r ${WORKSPACE}/ruoyi-ui/diff/$DIFF/* ./public/
                     sed -i \"s/version:.*/version: \'$(date \'+%Y%m%d%H%M\')\',/\" ./public/config/config.js
                 '''
          }
      }
      stage('编译构建') {
          steps {
           nodejs(nodeJSInstallationName: 'node', configId: '14997e88-6fc1-42bb-b9e8-bc54fe8aff81') {
                  sh 'cd ${WORKSPACE}/ruoyi-ui && npm install && npm run build:prod'
                  sh 'cd ${WORKSPACE}/ruoyi-ui && tar zcvf ./web-dist-$DIFF-$(date \'+%Y%m%d%H%M\').tar.gz ./dist'
              }
          }
      }
    }
 post {
    always {
        echo '构建结束,结果:'
    }
  success {
            echo '构建成功'
            //制品归档
            archiveArtifacts artifacts: '*/*.gz', followSymlinks: false
        }
  failure {
            echo '构建失败'
        }
    }
}

3、立即构建运行

选择差异性文件步骤日志正常

Docker+Jenkins+Pipline实现Vue项目input选择不同差异性config文件并修改文件内容后打包、执行sh打包压缩包、使用archiveArtifacts下载制品(jar包、压缩_压缩包_03

打包步骤日志正常

Docker+Jenkins+Pipline实现Vue项目input选择不同差异性config文件并修改文件内容后打包、执行sh打包压缩包、使用archiveArtifacts下载制品(jar包、压缩_git_04

制品压缩包下载正常

Docker+Jenkins+Pipline实现Vue项目input选择不同差异性config文件并修改文件内容后打包、执行sh打包压缩包、使用archiveArtifacts下载制品(jar包、压缩_vue.js_05