持续集成之 Spring Boot 实战篇
本文作者: CODING 用户 - 何健
这次实战篇,我们借助「CODING 持续集成」,实现一个简单的 Spring Boot 项目从编码到最后部署的完整过程。本教程还有 B 站视频版,帮助读者更好地学习理解。
思路
在线上环境构建、测试、部署
这种情况,通常会将 jenkins 安装在服务器上,确保构建测试等操作环境和线上环境一致。
此时通常会在 jenkins 中配置好需要持续集成的仓库,以及具体流程。
这种方式非常简单粗暴,也非常有效,但是缺点也很明显。可能 jenkins 会成为线上环境的旁站漏洞,这是非常不安全的。
那么,我们就需要更高级的方式,可以线上环境之外的构建测试,最终部署到线上环境。「CODING 持续集成」正是提供这类持续集成模式的平台。
不在实际部署服务器上构建、测试
为了避免占用线上服务器的资源,也为了避免安全问题,我们可以使用单独的 jenkins (或者其它此类软件)完成构建、测试、分发,实际部署通过单独的 webhook 实现。这样就可以避免在线上环境安装 Jenkins,还可以避免更复杂的系统安全维护。
这样做的优点:不会影响在线服务; 缺点:部署地机器最好是可以公网访问的,否则会无法完成后续分发步骤。
终极解决方案:使用 SaaS 化的 Jenkins
Software as a Service,软件即服务。「CODING 持续集成」集成了 SaaS 化的 Jenkins 等主流企业开发流程工具,实现了 DevOps 流程全自动化。开箱即用,直接用它就好!
捋一下思路
我们这次实战针对后一种思路
检出代码
构建
测试
分发
触发部署
实战
实际体验,还是很不错的。
视频地址:CODING 持续集成 - Spring Boot 项目
第一步:初始化一个持续集成
首先,我们需要进入准备持续集成的项目。
这里我用 start.spring.io 初始化一个 demo 示例项目,并推送到仓库。 为了方便大家,亲自体验,我准备了一个现成的仓库,可以直接 git clone 下来再 git push 到自己账户下使用。仓库地址:demoForCI
解压 demo 项目,进入 demo 目录,初始化仓库。
cd g:\demo\git initgit set remote giturlgit add ./git commit -m 'init repo'git push -u origin master
复制代码
别忘了 git config user.name yourname
和 git config user.email youremail
开始体验 仓库准备好后,就可以开始体验「CODING 持续集成」。
第一次的使用,需要先创建一个 Jenkinsfile,很多小伙伴会说,第一次用,不知道是啥。
没关系,「CODING 持续集成」已经给我们准备好了模板,非常容易理解,可以认为是特定格式语法写一套 task 流程。
点击一下 “简易模板”,更具实际情况修改一下就可以。
第二步:编写 Jenkinsfile
为了方便理解,我们从简易模板开始,分别修改对应阶段的任务。
- 配置构建环境,「CODING 持续集成」目前支持 java-8、python-3.5、ruby-2.3、go-1.11 等等。 在 Jenkinsfile 的 pipeline 里添加:
agent {// 此处设定构建环境,目前可选有// default, java-8, python-3.5, ruby-2.3, go-1.11 等// 详情请阅 https://dev.tencent.com/help/knowledge-base/how-to-use-ci#agentslabel "java-8"}
复制代码
检出 这里不得不说,「CODING 持续集成」这里做的还是很方便的,提供了适用于好几种不同场景的模板。默认简易模板是带有检出部分的,我们可以根据实际情况进行修改。默认情况下,env.GIT_BUILD_REF 的值就是 master 主分支,实际上我们可以定制为其它专门用于构建发的分支。
这里,大家可以自己修改具体要检出的分支。
stage("检出") {steps {sh 'ci-init'checkout([$class: 'GitSCM', branches: [[name: env.GIT_BUILD_REF]], userRemoteConfigs: [[url: env.GIT_REPO_URL]]])}}
复制代码
- 构建
stage("构建") {steps {echo "构建中..."sh 'java -version'sh 'mvn package'echo "构建完成."archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true // 收集构建产物}}
复制代码
这里需要注意,Spring Boot 的 pom 中需要添加一个插件。 修改后:
<plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><!-- 下面是添加的插件 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>2.6</version><configuration><skipTests>true</skipTests></configuration></plugin>
复制代码
- 测试 这里我偷个懒,只做了单元测试, 没有提取测试报告,大家可以根据实际项目定制这个流程。
stage("测试") {steps {echo "单元测试中..."sh 'mvn test'echo "单元测试完成."//junit 'target/surefire-reports/*.xml' // 收集单元测试报告的调用过程}}
复制代码
分发 jar 包到目标服务器 这里比较无奈,我没有单独针对这次演示写部署 jar 包和上传 jar 包的 webhookApi,但是构建好的 jar 包需要要放置到待部署的服务器。
于是有了这个过程,借助 scp 和私钥来上传构建好的jar包。
这里千万记着提前部署好密钥。并且将密钥放到仓库一份,用于分发jar包。
stage("分发jar包") {steps {echo "分发中..."echo "chmod 600 pkey"sh 'chmod 600 authorized_keys.pem'echo "upload"sh 'scp -i authorized_keys.pem ./target/*.jar root@yourip:/root/'echo "准备部署"}}
复制代码
部署
前面有提到,这里部署仍然需要触发一个钩子,否则只能手动部署了。 这里我写了一个最简单的,实际上我们可以写细致一点,判断一下接口返回的结果再根据结果输出部署情况。
stage("部署") {steps {sh 'curl http://youapi'echo "部署完毕"}}
复制代码
第三步:保存 Jenkinsfile 并运行
修改好 Jenkinsfile 和 pom.xml。
我们要保存 Jenkinsfile,编辑框可以直接编辑内容,编辑好可以直接提交到仓库下的 ./Jenkinsfile
接下来, 平台会自动读取 Jenkinsfile 并开始走持续集成的流程:
持续集成的流程是可以看到的:
每个阶段都对应 Jenkinsfile 一个 stage, 我们可以点击查看对应阶段的构建结果。
第四步:排查持续集成的报错
如果某个过程出错,「CODING 持续集成」的流程会停止,并提示失败。此时我们可以进入具体节点查看具体失败原因。
比如现在是提示“分发 jar 包失败”,那么我们可以点击对应节点展开看看日志,排查具体分发失败的原因。
现在可以清晰地看到,报错原因是我没有填写正确的主机 ip。
文中涉及的文件及代码
Jenkinsfile
pipeline {agent {// 此处设定构建环境,目前可选有// default, java-8, python-3.5, ruby-2.3, go-1.11 等// 详情请阅 https://dev.tencent.com/help/knowledge-base/how-to-use-ci#agentslabel "java-8"}stages {// 检出仓库stage("检出") {steps {// 这里sh调用ci-init 初始化sh 'ci-init'// 这里检出仓库,默认检出分支为环境变量中的GIT_BUILD_REFcheckout([$class: 'GitSCM', branches: [[name: env.GIT_BUILD_REF]], userRemoteConfigs: [[url: env.GIT_REPO_URL]]])}}// 构建jar包stage("构建") {steps {echo "构建中..."// 输出java版本sh 'java -version'// 调用maven 构建jar包sh 'mvn package'echo "构建完成."//收集构建产物,这一步成功,我们就可以在平台上看到构建产物archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true // 收集构建产物}}// 测试stage("测试") {steps {echo "单元测试中..."// 做单元测试sh 'mvn test'echo "单元测试完成."}}// 分发jar包,这里只是简单的通过scp分发jar包到目标机器指定目录stage("分发jar包") {steps {echo "分发中..."echo "chmod 600 pkey"sh 'chmod 600 authorized_keys.pem'echo "upload"sh 'scp -i authorized_keys.pem ./target/*.jar root@youip:/root/'echo "准备部署"}}// 部署jar包stage("部署") {// 这里需要触发一个部署的webhook,可以是一个很简单的重启java进程的操作steps {// 用curl 来触发hooksh 'curl http://baidu.com'echo "请登录服务器手动部署"}}}
}
复制代码
pom.xml
文中所用 Spring Boot 示例项目的 pom.xml
实际上,大家可以直接去 start.spring.io 参考照这份 pom 来创建一个 demo。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.2.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>tech.hejian</groupId><artifactId>codingj8</artifactId><version>0.0.1-SNAPSHOT</version><name>codingj8</name><description>coding project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>2.6</version><configuration><skipTests>true</skipTests></configuration></plugin></plugins></build></project>
复制代码
总结
CODING 是一个面向开发者的云端开发平台,提供 Git/SVN 代码托管、任务管理、在线 WebIDE、Cloud Studio、开发协作、文件管理、Wiki 管理、提供个人服务及企业服务,其中「CODING 持续集成」集成了 SaaS 化的 Jenkins 等主流企业开发流程工具,实现了 DevOps 流程全自动化,为企业提供软件研发全流程管理工具,打通了从团队构建、产品策划、开发测试到部署上线的全过程。
持续集成之 Spring Boot 实战篇相关推荐
- springboot java获取版本号_深入实践Spring Boot 实战篇,大佬整理出的PDF文档
如何使用Spring Boot 本文章将会详细介绍如何使用Spring Boot.它覆盖了构建系统,自动配置和运行/部署选项等主题.我们也覆盖了一些Spring Boot最佳实践.尽管Spring B ...
- springboot实战pdf_腾讯架构师Spring Boot实战篇(PDF文档)
前言: 什么是Spring Boot?? Spring Boot应用本质上就是一个基于Spring框架的应用 Spring Boot的核心是什么? 自动配置 起步依赖 Actuator 命令行界面(C ...
- spring boot实战(第六篇)加载application资源文件源码分析
前言 在上一篇中了解了spring配置资源的加载过程,本篇在此基础上学习spring boot如何默认加载application.xml等文件信息的. ConfigFileApplicationLis ...
- 《Spring Boot 实战派》--13.集成NoSQL数据库,实现Elasticsearch和Solr搜索引擎
第13章 集成NoSQL数据库,实现Elasticsearch和Solr搜索引擎 关于搜索引擎 我们很难实现 Elasticseach 和 Solr两大搜索框架的效果:所以本章针对两大搜索框架,非常详 ...
- 玩转 Spring Boot 应用篇(搭建菜菜的店铺)
0. 0.0. 历史文章整理 玩转 Spring Boot 入门篇 玩转 Spring Boot 集成篇(MySQL.Druid.HikariCP) 玩转 Spring Boot 集成篇(MyBat ...
- Spring Boot实战系列《六》:人事管理系统的登录设计
Spring Boot实战系列<六>:人事管理系统的登录设计 Spring Boot实战系列<六>:人事管理系统的登录设计 1.前言 在上一篇中教大家在IEDA或者eclips ...
- Spring Boot实战解决高并发数据入库: Redis 缓存+MySQL 批量入库
前言 最近在做阅读类的业务,需要记录用户的PV,UV: 项目状况:前期尝试业务阶段: 特点: 快速实现(不需要做太重,满足初期推广运营即可) 快速投入市场去运营 收集用户的原始数据,三要素: 谁 在什 ...
- 最新Spring Boot实战项目(权限后台管理系统)详解
Spring Boot实战项目 - 权限后台管理系统 简介 这是一套基于spring boot 2.16.shiro.jwt.redis.swagger2.mybatis .thymeleaf.lay ...
- 《JavaEE开发的颠覆者: Spring Boot实战》资源及勘误
感谢大家对<JavaEE开发的颠覆者: Spring Boot实战>的支持,您可以在如下地址购买: 京东地址:http://item.jd.com/11894632.html 当当地址:h ...
最新文章
- Chrome控制台实用指南
- crontab命令简介
- 数据结构与算法(四):二叉树
- tar.xz压缩、解压方式
- Fragment切换。radiobutton加fragment切换(附件源码下载)
- mysql ==null_mysql = null 问题
- Qt工作笔记-QGraphicsView框架容易忽视的坐标问题-“画布”QgraphicsScene到底放在了哪儿?
- 31 CO配置-控制-产品成本控制-成本对象控制-期末结算-定义结算在产品的记帐规则
- python命名实体识别工具_Day14:使用斯坦福 NER 软件包实现你自己的命名实体识别器(Named Entity Recognition,NER)...
- css hsla和rgba的区别
- 别看人家日子过得很轻松的样子,实际都很难,相信吗?
- 大数据中数据挖掘的基本步骤
- 【Pandas】实操手册
- 【知识积累】Edge vs Fog Computing 边缘计算和雾计算的相同与不同
- 精神污染图制作(matlab代码)
- 其实特简单,Python 做一个漂亮女孩词云跳舞的视频
- android 压力和温度 传感器测试,通过智能无源传感器,实现监测温度、湿度或压力...
- 360html收藏夹,360浏览器的收藏夹如何保存?360浏览器收藏夹备份方法
- Linux LKM suterusu代码分析(一)
- 交通信号灯自动控制模拟指示系统
热门文章
- Python filter 函数 - Python零基础入门教程
- BugkuCTF-Crypto题affine
- 智慧气象机器_智慧电缆隧道火热建设中 传感器+机器人成标配
- 安卓的java无法访问网络_Android网络访问的基本方法
- 2021高考无准考证成绩查询,2021考研没有准考证号怎么查成绩
- C语言调试技巧:stdin,stdout,stderr
- 软件测试技术qtp,51Testing独家连载:(四十一)精通QTP——自动化测试技术领航
- scala java抽象理解_Scala之类、特质和抽象类
- rrt算法流程图_RRT算法移动机器人路径规划(快速扩展随机树).pdf
- 对外经贸大学计算机应用基础,对外经贸大学计算机应用基础试题.doc