《企业级前端部署方案:Jenkins+MinIO+SSH+Gitee+Jenkinsfile自动化实践》

06-01 1306阅读

文章目录

  • 前言
    • 前端项目CICD时序图
    • 一、环境准备
      • 1、服务器相关
      • 2、Jenkins凭据
      • 3、注意事项
      • 二、设计思想
        • 1. 模块化设计
        • 2.多环境支持
        • 3. 制品管理
        • 4. 安全部署机制
        • 5. 回滚机制
        • 三、CI阶段
          • 1、构建节点选择
          • 2、代码拉取
          • 3、代码编译
          • 4、打包并上传至minio
          • 四、CD阶段
          • 五、回滚阶段
          • 六、构建通知
          • 七、实战演示--发布/回滚前端项目
            • 1、Jenkins创建流水线项目
            • 2、执行构建
            • 3、执行回滚
            • 八、完整pipeline

              前言

              在现代化前端工程中,高效的CI/CD流程已成为团队标配。本文将详细解析如何通过Jenkins Pipeline实现从代码提交到自动化部署的全流程,重点分享多服务器并行部署、MinIO制品管理以及一键回滚等核心功能的实现方案。文中提供的Jenkinsfile模板可直接用于生产环境,助你快速搭建企业级部署平台。

              前端项目CICD时序图

              《企业级前端部署方案:Jenkins+MinIO+SSH+Gitee+Jenkinsfile自动化实践》

              一、环境准备

              1、服务器相关

              ip部署
              192.168.56.101nginx1
              192.168.56.102nignx2、Jenkins、nodejs(18.16.0)、minio(minio-RELEASE_2023_05_18)

              minio服务器设置myminio

              [root@k8s-node ~]# mc config host add myminio http://192.168.56.102:8021 OpsMinIO OpsAdmin081524
              

              minio服务器设置前端制品库桶

              《企业级前端部署方案:Jenkins+MinIO+SSH+Gitee+Jenkinsfile自动化实践》

              2、Jenkins凭据

              minio账密凭据--usernamePassword类型

              《企业级前端部署方案:Jenkins+MinIO+SSH+Gitee+Jenkinsfile自动化实践》

              服务器账密凭据--usernamePassword类型

              《企业级前端部署方案:Jenkins+MinIO+SSH+Gitee+Jenkinsfile自动化实践》

              3、注意事项

              1、服务器账密保持一致,因为后续pipeline中连接部署服务器会使用
              2、Jenkins服务器需要安装nodejs、yarn等编译前端代码的组件
              3、Jenkins需要安装nodejs插件、ssh相关插件,并在全局工具配置中设置npm路径
              

              《企业级前端部署方案:Jenkins+MinIO+SSH+Gitee+Jenkinsfile自动化实践》

              二、设计思想

              1. 模块化设计

              采用共享库模式将功能解耦为独立模块:

              • build.groovy :封装构建逻辑,支持前端不同构建工具(npm、yarn)

                《企业级前端部署方案:Jenkins+MinIO+SSH+Gitee+Jenkinsfile自动化实践》

              • tools.groovy :提供统一的日志输出和可视化工具

                《企业级前端部署方案:Jenkins+MinIO+SSH+Gitee+Jenkinsfile自动化实践》

              • toemailF.groovy :处理通知机制,实现标准化的邮件模板

                《企业级前端部署方案:Jenkins+MinIO+SSH+Gitee+Jenkinsfile自动化实践》

                2.多环境支持

                通过环境变量实现配置与逻辑分离:

                String Tenv="${env.Tenv}"
                environment {
                    BUILD_TIME = sh(script: "date '+%Y%m%d_%H%M%S'", returnStdout: true).trim()
                    MINIO_BUCKET = 'frontend-artifacts' 
                }
                
                构建参数如 buildType 、 buildshell、Tenv 等通过Jenkins job参数动态注入
                

                3. 制品管理

                采用MinIO作为制品仓库,实现版本追踪:

                // 保存部署信息
                env.DEPLOY_INFO = """
                    应用: ${JOB_NAME}
                    版本: ${BUILD_TIME}-${env.GIT_COMMIT}
                    包路径: ${MINIO_BUCKET}/${JOB_NAME}/${env.ARTIFACT_NAME}
                """
                

                4. 安全部署机制

                • 凭据管理:通过 withCredentials 安全使用SSH和MinIO密钥
                • 签名验证:动态生成AWS签名头保障MinIO访问安全
                  DATE_VALUE_REMOTE=\$(date -R)
                  SIGNATURE_REMOTE=\$(echo -en "GET\\n\\n\\n\${DATE_VALUE_REMOTE}\\n/${MINIO_BUCKET}/${JOB_NAME}/${env.ARTIFACT_NAME}" | 
                      openssl sha1 -hmac "\${MINIO_SECRET_KEY}" -binary | base64)
                  

                  5. 回滚机制

                  实现完整的版本追溯和回滚流程:

                  1. 从MinIO获取历史版本列表
                  2. 交互式选择回滚目标
                  3. 保持与部署相同的安全机制

                  三、CI阶段

                  1、构建节点选择

                  核心思想:
                  	1、后端服务采用Jenkins动态slave-pod的方式,将其部署到k8s
                  	2、前端服务采用宿主机Jenkins服务将其构建部署
                  

                  设置构建节点

                  《企业级前端部署方案:Jenkins+MinIO+SSH+Gitee+Jenkinsfile自动化实践》

                  pipeline{
                      agent {
                          label 'master' #此名称跟上述图片中的名称保持一致
                      }
                      options {
                          timestamps()
                          skipDefaultCheckout()  // 禁用隐式 Checkout
                          timeout(time: 1, unit: 'HOURS') //设置流水线超时
                      }
                  }
                  

                  2、代码拉取

                  《企业级前端部署方案:Jenkins+MinIO+SSH+Gitee+Jenkinsfile自动化实践》

                  《企业级前端部署方案:Jenkins+MinIO+SSH+Gitee+Jenkinsfile自动化实践》

                  #!groovy
                  @Library("jenkinslib") _
                  //func from sharelibrary调用共享库
                  def build=new org.devops.build()
                  def tools=new org.devops.tools()
                  def toemailF=new org.devops.toemailF()
                  //调用Jenkins构建参数
                  String Tenv="${env.Tenv}"
                  String srcURL="${env.SrcURL}"
                  String branch="${env.branchName}"
                  pipeline{
                  	stages{
                          stage("CheckOut"){
                              when { expression { !rollback } }  // 非回滚时执行
                              steps{
                                  script{
                                      tools.PrintMsg("获取分支: ${branch}","checkout")
                                      tools.PrintMsg("获取代码","checkout")
                                      checkout([$class: 'GitSCM', branches: [[name: "${branch}"]], 
                                          extensions: [], 
                                          userRemoteConfigs: [[credentialsId: 'gitee_registry_ssh', url: "${srcURL}"]]])
                                      // 记录当前commit信息用于追踪
                                      env.GIT_COMMIT = sh(script: 'git rev-parse --short HEAD', returnStdout: true).trim()
                                  }
                              }
                          }
                      }
                  }
                  

                  《企业级前端部署方案:Jenkins+MinIO+SSH+Gitee+Jenkinsfile自动化实践》

                  3、代码编译

                  #!groovy
                  @Library("jenkinslib") _
                  //func from sharelibrary调用共享库
                  def build=new org.devops.build()
                  def tools=new org.devops.tools()
                  def toemailF=new org.devops.toemailF()
                  String Tenv="${env.Tenv}"
                  String buildType="${env.buildType}"
                  String buildshell="${env.buildshell}"
                  pipeline{
                      environment {
                          BUILD_TIME = sh(script: "date '+%Y%m%d_%H%M%S'", returnStdout: true).trim()
                          MINIO_BUCKET = 'frontend-artifacts'
                      }
                  	stage("代码编译"){
                              when { expression { !rollback } }  // 非回滚时执行
                              steps{
                                  script{
                                      tools.PrintMsg("代码编译","build")
                                      // 使用共享库中的构建方法,会自动处理依赖安装和构建
                                      build.Builds(buildType,buildshell)
                                      // 生成带版本号的构建产物名称
                                      env.ARTIFACT_NAME = "${JOB_NAME}-${BUILD_TIME}-${env.GIT_COMMIT}.tar.gz"
                                  }
                              }
                          }
                  }
                  

                  《企业级前端部署方案:Jenkins+MinIO+SSH+Gitee+Jenkinsfile自动化实践》

                  4、打包并上传至minio

                  pipeline{
                      environment {
                          BUILD_TIME = sh(script: "date '+%Y%m%d_%H%M%S'", returnStdout: true).trim()
                          MINIO_BUCKET = 'frontend-artifacts'
                      }
                  	stage("打包并上传至minio"){
                              when { expression { !rollback } }  // 非回滚时执行
                              steps{
                                  script{
                                      tools.PrintMsg("构建好的包上传至minio","image_tag")
                                      sh """
                                          tar -czf ${env.ARTIFACT_NAME} dist/
                                          mc cp ${env.ARTIFACT_NAME} myminio/${MINIO_BUCKET}/${JOB_NAME}/
                                      """
                                      // 保存部署信息
                                      env.DEPLOY_INFO = """
                                          应用: ${JOB_NAME}
                                          版本: ${BUILD_TIME}-${env.GIT_COMMIT}
                                          包路径: ${MINIO_BUCKET}/${JOB_NAME}/${env.ARTIFACT_NAME}
                                      """
                                  }
                              }
                      }
                  }
                  

                  《企业级前端部署方案:Jenkins+MinIO+SSH+Gitee+Jenkinsfile自动化实践》

                  四、CD阶段

                  1、Jenkins凭据添加服务器ssh账密、minio账密
                  2、将多个destIp按逗号分割成数组,使用each 循环遍历每个服务器IP
                  3、动态生成minio签名并结合curl命令从minio下载部署包
                  4、通过sshpass命令连接单个服务器IP
                  	a、删除源部署路径下的文件,然后将从minio下载的部署包解压到指定目录
                  	b、删除多余目录和下载的tar包
                  
                          stage("部署"){
                              when { expression { !rollback } }
                              steps{
                                  script {
                                      tools.PrintMsg("开始部署", "deploy")
                                      withCredentials([
                                          usernamePassword(
                                              credentialsId: 'target-server-credential',
                                              usernameVariable: 'SSH_USER',
                                              passwordVariable: 'SSH_PASS'
                                          ),
                                          usernamePassword(
                                              credentialsId: 'minio-credentials',
                                              usernameVariable: 'MINIO_ACCESS_KEY',
                                              passwordVariable: 'MINIO_SECRET_KEY'
                                          )
                                      ]) {
                                          // 将destIp按逗号分割成数组
                                          def servers = destIp.split(',')
                                          servers.each { server ->
                                              sh """
                                                  DATE_VALUE=\$(date -R)
                                                  SIGNATURE=\$(echo -en "GET\\n\\n\\n\${DATE_VALUE}\\n/${MINIO_BUCKET}/${JOB_NAME}/${env.ARTIFACT_NAME}" | 
                                                      openssl sha1 -hmac "\${MINIO_SECRET_KEY}" -binary | base64)
                                                  
                                                  # 直接在SSH会话中生成签名和下载
                                                  sshpass -p \${SSH_PASS} ssh -o StrictHostKeyChecking=no \${SSH_USER}@${server} 
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。

相关阅读

目录[+]

取消
微信二维码
微信二维码
支付宝二维码