本文作者: CODING 用户 - 何健

这次实战篇,我们借助「CODING 持续集成」,实现一个简单的 Spring Boot 项目从编码到最后部署的完整过程。本教程还有 B 站视频版,帮助读者更好地学习理解。


思路

在线上环境构建、测试、部署

这种情况,通常会将 jenkins 安装在服务器上,确保构建测试等操作环境和线上环境一致。

此时通常会在 jenkins 中配置好需要持续集成的仓库,以及具体流程。

这种方式非常简单粗暴,也非常有效,但是缺点也很明显。可能 jenkins 会成为线上环境的旁站漏洞,这是非常不安全的。

那么,我们就需要更高级的方式,可以线上环境之外的构建测试,最终部署到线上环境。「CODING 持续集成」正是提供这类持续集成模式的平台。

不在实际部署服务器上构建、测试

为了避免占用线上服务器的资源,也为了避免安全问题,我们可以使用单独的 jenkins (或者其它此类软件)完成构建、测试、分发,实际部署通过单独的 webhook 实现。这样就可以避免在线上环境安装 Jenkins,还可以避免更复杂的系统安全维护。

这样做的优点:不会影响在线服务;

缺点:部署地机器最好是可以公网访问的,否则会无法完成后续分发步骤。

终极解决方案:使用 SaaS 化的 Jenkins

Software as a Service,软件即服务。「CODING 持续集成」集成了 SaaS 化的 Jenkins 等主流企业开发流程工具,实现了 DevOps 流程全自动化。开箱即用,直接用它就好!

捋一下思路

我们这次实战针对后一种思路

  1. 检出代码

  2. 构建

  3. 测试

  4. 分发

  5. 触发部署


实战

实际体验,还是很不错的。

视频地址:CODING 持续集成 - Spring Boot 项目

第一步:初始化一个持续集成

1、首先,我们需要进入准备持续集成的项目。

 这里我用 [start.spring.io](https://start.spring.io) 初始化一个 demo 示例项目,并推送到仓库。
为了方便大家,亲自体验,我准备了一个现成的仓库,可以直接 git clone 下来再 git push 到自己账户下使用。仓库地址:[demoForCI](https://dev.tencent.com/u/ipaddr/p/demoForCI)
![图片](https://ws1.sinaimg.cn/large/6ccda21fgy1g0s17bwc1cj20zc0ootbd.jpg)

2、解压 demo 项目,进入 demo 目录,初始化仓库。

      cd g:\demo\
git init
git set remote giturl
git add ./
git commit -m 'init repo'
git push -u origin master

别忘了 git config user.name yournamegit config user.email youremail

3、开始体验

仓库准备好后,就可以开始体验「CODING 持续集成」

  第一次的使用,需要先创建一个 Jenkinsfile,很多小伙伴会说,第一次用,不知道是啥。

  没关系,[「CODING 持续集成」](https://e.coding.net/?utm_source=cnblogs&utm_medium=expreport&utm_campaign=devops&utm_content=do05)已经给我们准备好了模板,非常容易理解,可以认为是特定格式语法写一套 task 流程。

  点击一下 “简易模板”,更具实际情况修改一下就可以。

  ![图片](https://ws1.sinaimg.cn/large/6ccda21fgy1g0s1auivl6j210m0kjwgo.jpg)

第二步:编写 Jenkinsfile

为了方便理解,我们从简易模板开始,分别修改对应阶段的任务。

1、配置构建环境,「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#agents
label "java-8"
}

2、检出

这里不得不说,「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]]]
)
}
}

3、构建

    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>

4、测试

这里我偷个懒,只做了单元测试,

没有提取测试报告,大家可以根据实际项目定制这个流程。

    stage("测试") {
steps {
echo "单元测试中..."
sh 'mvn test'
echo "单元测试完成."
//junit 'target/surefire-reports/*.xml' // 收集单元测试报告的调用过程
}
}

5、分发 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 "准备部署"
}
}

6、部署

前面有提到,这里部署仍然需要触发一个钩子,否则只能手动部署了。
这里我写了一个最简单的,实际上我们可以写细致一点,判断一下接口返回的结果再根据结果输出部署情况。
    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#agents
label "java-8"
}
stages {
// 检出仓库
stage("检出") {
steps {
// 这里sh调用ci-init 初始化
sh 'ci-init'
// 这里检出仓库,默认检出分支为环境变量中的GIT_BUILD_REF
checkout(
[$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 来触发hook
sh '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 实战篇的更多相关文章

  1. spring boot实战(第一篇)第一个案例

    版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+]   spring boot实战(第一篇)第一个案例 前言 写在前面的话 一直想将spring boot相关内容写成一个系列的 ...

  2. Spring Boot实战系列(7)集成Consul配置中心

    本篇主要介绍了 Spring Boot 如何与 Consul 进行集成,Consul 只是服务注册的一种实现,还有其它的例如 Zookeeper.Etcd 等,服务注册发现在微服务架构中扮演这一个重要 ...

  3. spring boot实战(第十三篇)自动配置原理分析

    前言 spring Boot中引入了自动配置,让开发者利用起来更加的简便.快捷,本篇讲利用RabbitMQ的自动配置为例讲分析下Spring Boot中的自动配置原理. 在上一篇末尾讲述了Spring ...

  4. spring boot实战(第十二篇)整合RabbitMQ

    前言 最近几篇文章将围绕消息中间件RabbitMQ展开,对于RabbitMQ基本概念这里不阐述,主要讲解RabbitMQ的基本用法.Java客户端API介绍.spring Boot与RabbitMQ整 ...

  5. Redis篇之操作、lettuce客户端、Spring集成以及Spring Boot配置

    Redis篇之操作.lettuce客户端.Spring集成以及Spring Boot配置 目录 一.Redis简介 1.1 数据结构的操作 1.2 重要概念分析 二.Redis客户端 2.1 简介 2 ...

  6. spring boot 实战教程

    二八法则 - get more with less Java.spring经过多年的发展,各种技术纷繁芜杂,初学者往往不知道该从何下手.其实开发技术的世界也符合二八法则,80%的场景中只有20%的技术 ...

  7. 一键式Spring集成工具 Spring Boot

    最近公司使用Spring boot进行开发,稍微了解一下,不过自我感觉把集中式配置applicate.properties搞明白,注解用过Spring MVC的boot绝对没问题的 比如拦截器:@As ...

  8. Spring boot 提高篇

    Spring boot 提高篇 上篇文章介绍了Spring boot初级教程:构建微服务:Spring boot 入门篇,方便大家快速入门.了解实践Spring boot特性:本篇文章接着上篇内容继续 ...

  9. [转] Spring Boot实战之Filter实现使用JWT进行接口认证

    [From] http://blog.csdn.net/sun_t89/article/details/51923017 Spring Boot实战之Filter实现使用JWT进行接口认证 jwt(j ...

随机推荐

  1. 性能超前,详解腾讯云新一代Redis缓存数据库

    背景 当前内存数据库发展迅速,用户对于存储系统的要求也越来越高,为了满足各类业务场景的需要,腾讯云设计了新一代的内存数据库,不但保留了原来系统的高性能,高可用等特性,同时还兼容了当前流行的Redis原 ...

  2. DownEditTextView【自定义Edittext对Android 软键盘向下的监听】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 记录自定义EditText控件实现监听软键盘隐藏事件的功能.基本上和参考资料相同. 效果图    代码分析 自定义EditText子 ...

  3. 百度病了,必应挂了,Yandex疯了。

    前天一篇<搜索引擎百度已死>的文章火遍了互联网圈.文中作者指出如今的百度搜索首页一大半都是百度自家的产品,比如你搜索特普朗,你会发现第一页的结果分别是:百度百科.贴吧.百家号.百家号.百家 ...

  4. 游戏AI之初步介绍(0)

    目录 游戏AI是什么? 游戏AI和理论AI 智能的假象 (更新)游戏AI和机器学习 介绍一些游戏AI 4X游戏AI <求生之路>系列 角色扮演/沙盒游戏中的NPC 游戏AI 需要学些什么? ...

  5. Asp.NetCore轻松学-部署到 Linux 进行托管

    前言 上一篇文章介绍了如何将开发好的 Asp.Net Core 应用程序部署到 IIS,且学习了进程内托管和进程外托管的区别:接下来就要说说应用 Asp.Net Core 的特性(跨平台),将 .Ne ...

  6. 使用JavaScript和D3.js实现数据可视化

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由独木桥先生发表于云+社区专栏 介绍 D3.js是一个JavaScript库.它的全称是Data-Driven Documents(数据 ...

  7. 14 ,CSS 文字与文本

    1.CSS 中长度与颜色 2.CSS 中的文字属性 3.CSS 中的文本属性 14.1 CSS 中长度与颜色 长度单位 说明 in 英寸 cm 公分 mm 公里 cm 以目前字体高度为单位 ex 以小 ...

  8. SqlServer中的系统数据库

    SqlServer中的系统数据库有五个,平时写代码不太关注,今天一时兴起研究了一下. 1. master 记录SQL Server系统的所有系统级信息,例如:登陆账户信息.链接服务器和系统配置设置.记 ...

  9. Ambari安装HDP问题:User root is not allowed to impersonate anonymous.User: hcat is not allowed to impersonate ambari-qa

    User root is not allowed to impersonate anonymous 修改hadoop 配置文件 etc/hadoop/core-site.xml,加入如下配置项 < ...

  10. Vue(day6)

    一.webpack中常用的文件loader & 插件 由于版本存在变动,以下安装和配置都有可能发生变化,请以官方文档为准. 1.html-webpack-plugin插件 html-webpa ...