jenkins持续集成从0入门到实战【四】构建SpringBoot项目

简介: 打包发布SpringBoot项目

构建发布

jenkins发布项目的过程可以总结为4个步骤

  1. 拉取代码
  2. 编译打包(mvn或npm)
  3. 部署至应用服务器(scp命令)
  4. 启动应用

SpringBoot项目发布

  1. 准备SpringBoot项目

    这里我继续以上面Maven集成模块的代码为例,添加应用访问的接口和端口,并将代码提交至Gitee

    image.png

    浏览器访问本地的服务是否启动成功

    image.png

    提交代码并推送至Gitee(此处你也可以使用Git命令的方式)

    image.png

    弹出登录提示,输入用户名密码

    image.png

    在Gitee上检查到代码推送成功

    image.png

  2. 添加Maven风格的任务

    image.png

    填写Gitee仓库地址

    image.png

    填写Maven构建操作项

    image.png

  3. 配置Post Steps,选中执行shell

    image.png

    image.png

    思考,这里我们需要执行的shell内容是什么?

    是不是把当前编译好的jar包拷贝到应用服务器去启动

  4. 应用服务器规划

    由于jenkins构建消耗内存极大,一般jenkins是一台单独的工具机器,Java项目一般在其他的机器上,这里我重新安装一台虚拟机,有条件的同学可以直接开通阿里云的ECS

    应用服务器信息

    • IP:192.168.1.2
    • JDK:1.8(安装过程省略)
    • user:admin
    • 部署路径:/data/app/it235-boot
    • 端口:9010
  5. 配置ssh免密登录

    免密登录主要是方便jenkins服务器的jenkins用户—》应用服务器的admin用户上的jar包拷贝,部署本就是jar包拷贝的过程

    • 在jenkins机器上使用jenkins用户生成秘钥

      $ su jenkins
      $ ssh-keygen -t rsa
      # 3次回车
      

      运行后会在当前用户的根目录生成一个.ssh文件夹

      image.png

    • .ssh文件夹中的文件描述

      • id_rsa : 生成的私钥文件
      • id_rsa.pub : 生成的公钥文件
      • know_hosts : 已知的主机公钥清单

      接下来需要将公钥导入到认证文件中

      $ su jenkins
      $ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

      如果希望ssh公钥生效需满足至少下面两个条件:

      • .ssh目录的权限必须是700
      • .ssh/authorized_keys文件权限必须是600
    • 给对应文件授权

      $ chmod 700 ~/.ssh
      $ chmod 600 ~/.ssh/authorized_keys
    • authorized_keys文件拷贝到应用服务器的admin用户.ssh目录下

      # 在应用服务器(192.168.1.2)上用admin用户创建/home/admin/.ssh文件夹
      
      # 在jenkins服务器(192.168.1.195)上将pub公钥文件拷贝到应用服务器的.ssh目录下,并命名为authorized_keys
      $ scp -p ~/.ssh/id_rsa.pub admin@192.168.1.2:/home/admin/.ssh/authorized_keys
    • 在jenkins服务器上进行免密连接测试

      # 在jenkins服务器的/home/admin目录下创建filetest文件,并拷贝到应用服务器
      $ cd ~/
      $ touch filetest
      $ scp -p filetest admin@192.168.1.2:/home/admin/filetest
      # 进入到应用服务器(192.168.1.2),检查/home/admin目录下是否出现filetest
      
      # 在jenkins服务器上使用ssh进行免密连接测试,成功后会出现Last Login的提示
      $ ssh admin@192.168.1.2
      Last login: Sun Sep 20 21:53:03 2020
      $ exit
    • 到此免密登录和拷贝实现成功,为接下来jar包部署提供了快捷的帮助
  6. 编写jenkins发布脚本

    #!/bin/bash
    
    echo "部署的目录和项目名称"
    DIR="/data/app"
    projectName="it235-boot"
    
    echo "待部署的应用服务器,可多台"
    server_ips="192.168.1.2"
    for server_ip in ${server_ips[@]}
    do
    
    echo "ssh连接进行备份操作"
    ssh -Tq -oStrictHostKeyChecking=no admin@${server_ip} <<EOF
    mkdir -p $DIR/backup/${projectName}
    if [ -f "$DIR/${projectName}/${projectName}.jar" ];then
      mv $DIR/${projectName}/${projectName}.jar $DIR/backup/${projectName}/${projectName}-`date "+%Y%m%d_%H%M%S"`.jar 
    fi
    EOF
    
    echo "拷贝jar包到目标服务器的tmp目录"
    scp -q -oStrictHostKeyChecking=no ${WORKSPACE}/target/*.jar admin@${server_ip}:/tmp/${projectName}.jar
    
    echo "ssh远程连接进行发布操作"
    ssh -q -oStrictHostKeyChecking=no admin@${server_ip} <<EOF
    mv /tmp/${projectName}.jar $DIR/${projectName}/${projectName}.jar
    
    EOF
    
    done
    
    echo "success"
  7. 编写应用启动脚本

    • /data/app/it235-boot目录下创建启动脚本

      $ touch start.sh
      $ vim start.sh
      # 将下面代码粘贴到start.sh中
      #!/bin/bash
      set -e #任何命令出错就退出
      set -o pipefail
      
      APP_ID=it235-boot
      APP_DIR="/data/app"
      
      nohup java -Dspring.profiles.active=dev -jar ${APP_DIR}/${APP_ID}/${APP_ID}.jar > release_out.log &
      start_ok=false
      if [[ $? = 0 ]];then
              sleep 3
              tail -n 10 release_out.log
              sleep 5
              tail -n 50 release_out.log
      fi
      aaa=`grep "Started" release_out.log | awk '{print $1}'`
      if [[ -n "${aaa}" ]];then
          echo "Application started ok"
          exit 0
      else
          echo "Application started error"
          exit 1
      fi
    • /data/app/it235-boot目录下创建停止脚本

      $ touch stop.sh
      $ vim stop.sh
      # 将下面代码粘贴到stop.sh中
      #!/bin/bash
      
      APP_ID=it235-boot
      ps aux | grep ${APP_ID} | grep -v "grep" | awk '{print "kill -9 "$2}' | sh
    • 并进行启动和停止测试,查看日志输出是否正常
    • 将下述启动代码配置jenkins

      sh $DIR/${projectName}/stop.sh
      sh $DIR/${projectName}/start.sh
  8. 访问并测试代码是否生效

    • 如果是虚拟机则需要给防火墙添加9010端口

      $ su root
      # 开启防火墙9010端口
      $ firewall-cmd --zone=public --add-port=9010/tcp --permanent
      # 使配置生效
      $ firewall-cmd --reload

      image.png

    • 如果是ECS则需要在安全组中开放9010端口(此处省略)
    • 此外也可以采用Nginx映射(此处省略)
  9. 修改代码返回值,提交至Gitee,并再次进行构建发布,访问http://192.168.1.2:9010查看结果是否更新

    image.png

    image.png

    image.png

  10. 到此一个简单的SpringBoot项目发布完成,但企业中的发布往往比这要复杂很多,在参数化构建章节再为您详细讲解,比如:

    • 自动构建
    • 按分支发布
    • Tag发布
    • 节点发布
    • 流水线发布等等,
目录
相关文章
|
9天前
|
分布式计算 大数据 Apache
ClickHouse与大数据生态集成:Spark & Flink 实战
【10月更文挑战第26天】在当今这个数据爆炸的时代,能够高效地处理和分析海量数据成为了企业和组织提升竞争力的关键。作为一款高性能的列式数据库系统,ClickHouse 在大数据分析领域展现出了卓越的能力。然而,为了充分利用ClickHouse的优势,将其与现有的大数据处理框架(如Apache Spark和Apache Flink)进行集成变得尤为重要。本文将从我个人的角度出发,探讨如何通过这些技术的结合,实现对大规模数据的实时处理和分析。
37 2
ClickHouse与大数据生态集成:Spark & Flink 实战
|
2天前
|
jenkins Java 持续交付
Gitee+Jenkins+SonarQube代码上线的实战操作
通过以上步骤,就可以实现基于Gitee、Jenkins和SonarQube的代码上线流程,确保代码的质量和上线过程的自动化和可控性。在实际操作中,可以根据项目的具体需求和环境进行适当的调整和优化。
|
17天前
|
运维 监控 jenkins
运维自动化实战:利用Jenkins构建高效CI/CD流程
【10月更文挑战第18天】运维自动化实战:利用Jenkins构建高效CI/CD流程
|
23天前
|
Dart Android开发
鸿蒙Flutter实战:03-鸿蒙Flutter开发中集成Webview
本文介绍了在OpenHarmony平台上集成WebView的两种方法:一是使用第三方库`flutter_inappwebview`,通过配置pubspec.lock文件实现;二是编写原生ArkTS代码,自定义PlatformView,涉及创建入口能力、注册视图工厂、处理方法调用及页面构建等步骤。
43 0
|
2月前
|
监控 关系型数据库 MySQL
zabbix agent集成percona监控MySQL的插件实战案例
这篇文章是关于如何使用Percona监控插件集成Zabbix agent来监控MySQL的实战案例。
48 2
zabbix agent集成percona监控MySQL的插件实战案例
|
2月前
|
监控 Devops 测试技术
DevOps实践: 持续集成和持续部署(CI/CD)的入门指南
【9月更文挑战第10天】在快速迭代的软件开发世界中,DevOps已经成为加速产品交付、提升软件质量和团队协作的关键策略。本文将深入浅出地介绍DevOps的核心组成部分——持续集成(Continuous Integration, CI)与持续部署(Continuous Deployment, CD)的基本概念、实施步骤以及它们如何革新传统的软件开发流程。你将学习到如何通过自动化工具简化开发流程,并理解为什么CI/CD是现代软件开发不可或缺的一环。
|
3月前
|
机器学习/深度学习 存储 前端开发
实战揭秘:如何借助TensorFlow.js的强大力量,轻松将高效能的机器学习模型无缝集成到Web浏览器中,从而打造智能化的前端应用并优化用户体验
【8月更文挑战第31天】将机器学习模型集成到Web应用中,可让用户在浏览器内体验智能化功能。TensorFlow.js作为在客户端浏览器中运行的库,提供了强大支持。本文通过问答形式详细介绍如何使用TensorFlow.js将机器学习模型带入Web浏览器,并通过具体示例代码展示最佳实践。首先,需在HTML文件中引入TensorFlow.js库;接着,可通过加载预训练模型如MobileNet实现图像分类;然后,编写代码处理图像识别并显示结果;此外,还介绍了如何训练自定义模型及优化模型性能的方法,包括模型量化、剪枝和压缩等。
49 1
|
3月前
|
C# Windows 开发者
当WPF遇见OpenGL:一场关于如何在Windows Presentation Foundation中融入高性能跨平台图形处理技术的精彩碰撞——详解集成步骤与实战代码示例
【8月更文挑战第31天】本文详细介绍了如何在Windows Presentation Foundation (WPF) 中集成OpenGL,以实现高性能的跨平台图形处理。通过具体示例代码,展示了使用SharpGL库在WPF应用中创建并渲染OpenGL图形的过程,包括开发环境搭建、OpenGL渲染窗口创建及控件集成等关键步骤,帮助开发者更好地理解和应用OpenGL技术。
215 0
|
3月前
|
开发者 前端开发 开发框架
JSF与移动应用,开启全新交互体验!让你的Web应用轻松征服移动设备,让用户爱不释手!
【8月更文挑战第31天】在现代Web应用开发中,移动设备的普及使得构建移动友好的应用变得至关重要。尽管JSF(JavaServer Faces)主要用于Web应用开发,但结合Bootstrap等前端框架,也能实现优秀的移动交互体验。本文探讨如何在JSF应用中实现移动友好性,并通过示例代码展示具体实现方法。使用Bootstrap的响应式布局和组件可以确保JSF页面在移动设备上自适应,并提供友好的表单输入和提交体验。尽管JSF存在组件库较小和学习成本较高等局限性,但合理利用其特性仍能显著提升用户体验。通过不断学习和实践,开发者可以更好地掌握JSF应用的移动友好性,为Web应用开发贡献力量。
48 0
|
3月前
|
API UED 开发者
如何在Uno Platform中轻松实现流畅动画效果——从基础到优化,全方位打造用户友好的动态交互体验!
【8月更文挑战第31天】在开发跨平台应用时,确保用户界面流畅且具吸引力至关重要。Uno Platform 作为多端统一的开发框架,不仅支持跨系统应用开发,还能通过优化实现流畅动画,增强用户体验。本文探讨了Uno Platform中实现流畅动画的多个方面,包括动画基础、性能优化、实践技巧及问题排查,帮助开发者掌握具体优化策略,提升应用质量与用户满意度。通过合理利用故事板、减少布局复杂性、使用硬件加速等技术,结合异步方法与预设缓存技巧,开发者能够创建美观且流畅的动画效果。
77 0