本文作者:CODING 用户 - 高文

持续集成 (Continuous integration) 是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。成员之间的代码相互影响,可能会出现各种编译、运行的错误,为了避免提交代码影响到其他开发者,每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现错误,使得开发过程更加简单方便。

通用的持续集成流程大体是像上图所示一样,借助 Jenkins 连通 Git 与 Docker 镜像仓库,为后续的持续部署做准备。

而在「CODING 持续集成」中,可以省去其中很多环境部署的麻烦事,下面说一下我在 CODING 平台做的持续集成工作。

我与 CODING 之缘

CODING 是国内首个一站式云端软件服务平台,致力于通过技术创新推动软件开发升级转型,让开发更简单。将代码托管、项目管理、Cloud Studio、一键部署等开发工具集成到浏览器中,免除繁杂的开发环境部署,降低软件开发部署成本。

最初了解 「CODING」 ,是我在开发微信小程序时,腾讯云推荐托管代码到 CODING 上,于是注册了一个 CODING 账号。

开始使用时,主要以Web版开发工具为主,觉得只是一个 Eclipse 的 Che 版本,当时也自己部署一个 Eclipse 的 Che 版本。但部署 Che 版本时,才发现, CODING 其实比 Che 好用得不是一点半点。流畅性、易用性已经高出 Che 一个等级了,功能上也比 Che 更丰富。后来逐渐用起来了,发现 「CODING」 不只是 WebIDE ,还是 Git 、 Jenkins 、 Wiki 、敏捷开发工具、项目管理工具……现在持续集成功能出来了,可以免费试用15天,于是注册一个玩一玩。

wencst 的个人主页

「CODING 持续集成」

基础操作

  • 首先需要创建企业账号;
  • 然后创建自己的项目;
  • 进入项目维护项目代码。

本文所使用的源代码为本人开源的自动开发框架。

Git 操作

下面为 Git 的操作了,相信看文章的大部分人可以略过这一步。

详细的 Git 步骤可以参考:《 CODING 中的 Git 操作》

Git 操作主要为后续持续集成操作的触发器。

持续集成

持续集成操作的设置相对比较简单,按照提示一步步下来即可。有一块需要注意的,就是构建所用的分支,在配置持续集成时,需要选择构建触发方式,触发时间(代码上传时触发/手动触发),以及完成时邮件发送提醒(提醒触发者/不做任何事/只有失败时提醒)。对于多分支代码工程一定要注意,选择自己所需的配置。我这里所用的为系统默认配置,即当有人提交代码至 master 时触发构建,完成时总是发邮件提示开发者。

「CODING 持续集成」提供了三套不同的 Jenkinsfile 模板供开发者使用:简易模板、并行模板、自定义模板。我这里选用简易模板,并稍作修改。

  1. pipeline {
  2. agent {
  3. label "default"
  4. }
  5. stages {
  6. stage("检出") {
  7. steps {
  8. sh 'ci-init'
  9. checkout(
  10. [$class: 'GitSCM', branches: [[name: env.GIT_BUILD_REF]],
  11. userRemoteConfigs: [[url: env.GIT_REPO_URL]]]
  12. )
  13. }
  14. }
  15. stage("构建") {
  16. steps {
  17. echo "构建中..."
  18. sh 'mvn clean install'
  19. echo "构建完成."
  20. archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true // 收集构建产物
  21. }
  22. }
  23. stage("Docker") {
  24. steps {
  25. echo "Docker镜像生成中..."
  26. sh 'cd wencst-generatorJPA/target && cp classes/Dockerfile . && docker build -t wencst/wencst-generatorJPA .'
  27. echo "镜像生成完成."
  28. sh 'docker push wencst/wencst-generatorJPA'
  29. echo "镜像上传完毕"
  30. }
  31. }
  32. }
  33. }

更新 Jenkinsfile 后,代码 push 到对应的分支上,会自动执行构建,发现构建失败。

点开后,查看构建失败的具体原因,输出与 maven 编译时输出的没有什么差别。

原因提示: there is no POM in this directory。

原来我中间还有一层目录,需要进入目录后才能编译。

  1. pipeline {
  2. agent {
  3. label "default"
  4. }
  5. stages {
  6. stage("检出") {
  7. steps {
  8. sh 'ci-init'
  9. checkout(
  10. [$class: 'GitSCM', branches: [[name: env.GIT_BUILD_REF]],
  11. userRemoteConfigs: [[url: env.GIT_REPO_URL]]]
  12. )
  13. }
  14. }
  15. stage("构建") {
  16. steps {
  17. echo "构建中..."
  18. sh 'cd wencst-generatorJPA && mvn clean install'
  19. echo "构建完成."
  20. archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true // 收集构建产物
  21. }
  22. }
  23. stage("Docker") {
  24. steps {
  25. echo "Docker镜像生成中..."
  26. sh 'cd wencst-generatorJPA/target && cp classes/Dockerfile . && docker build -t wencst/wencst-generatorJPA .'
  27. echo "镜像生成完成."
  28. sh 'docker push wencst/wencst-generatorJPA'
  29. echo "镜像上传完毕"
  30. }
  31. }
  32. }
  33. }

提交代码后,会自动执行构建。

可以显示程序编译过程,可以显示每一步详细输出,可以增加状态徽标到相应的文档或网页中。可以说「CODING 持续集成」 想的是比较周到的,基本集成了绝大部分开源系统中相应的职能。

构建使用默认的 https://repo.maven.apache.org 源,构建速度也还可以。

至此持续集成完成,界面清晰整洁,并且可以对测试报告和构建结果进行下载,构建过程也会发邮件给相关人员。确实让开发更简单了。以前在做这一系列工作时,架构师起码要做几件事情:

1.搭建 git 仓库

2.搭建 jenkins

3.在 git 仓库中增加 CI 配置

4.邮箱配置

「CODING 持续集成」为开发者省去了很多工作,除了构建过程中必要的工作以外,其他的基本一键搞定,不用关心各个组件的安装配置,环境情况,网络情况,存储备份等内容。

Jenkinsfile 拆解

重点解释一下 stages 部分,整体分为三个 stages:

  • 第一步为代码检出
  1. stage("检出") {
  2. steps {
  3. sh 'ci-init'
  4. checkout(
  5. [$class: 'GitSCM', branches: [[name: env.GIT_BUILD_REF]],
  6. userRemoteConfigs: [[url: env.GIT_REPO_URL]]]
  7. )
  8. }
  9. }

这一步检出项目中的代码到 jenkins 的 workspace 目录下,这一步是 「CODING 持续集成」 默认的配置,无需过多解释。

  • 第二步为编译构建
  1. stage("构建") {
  2. steps {
  3. echo "构建中..."
  4. sh 'cd wencst-generatorJPA && mvn clean install'
  5. echo "构建完成."
  6. archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true
  7. }
  8. }

这一步是执行代码编译,我所用的是 maven 编译 spring boot 工程, 「CODING 持续集成」 集成了 mvn 命令,可以直接执行 maven 操作。

注意: jenkins 执行 sh 命令的根路径都是在当前 workspace 下,所以切换路径与 maven 编译命令要在同一个 sh 命令下。

编译执行后,收集编译的产物,archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true这一步的意思是,将所有工程的 target 路径下的 jar 包都算作工程产物。

  • 第三步为 docker 镜像生成
  1. stage("Docker") {
  2. steps {
  3. echo "Docker镜像生成中..."
  4. sh 'cd wencst-generatorJPA/target && cp classes/Dockerfile . && docker build -t wencst/wencst-generatorJPA .'
  5. echo "镜像生成完成."
  6. sh 'docker push wencst/wencst-generatorJPA'
  7. echo "镜像上传完毕"
  8. }
  9. }

对于熟悉 docker 的人并不是很陌生,依旧使用 shell 命令来执行 docker build 操作。

cd wencst-generatorJPA/target 首先切换路径到 jar 包所在目录。

cp classes/Dockerfile . 拷贝 Dockerfile 到当前路径下。

docker build -t wencst/wencst-generatorJPA . 执行 docker build 操作,用以创建 docker 镜像。

docker push wencst/wencst-generatorJPA 将创建出来的 docker 镜像上传到 dockerhub 中去。

总结

整体来说 「CODING 持续集成」 想的很周全了,无论从易用性、美观度以及人性化角度上来说,做得都非常不错。下面着重说说我使用 「CODING 企业版」 的持续集成后的感受:

  1. 满足了从开发到代码管理,到代码集成,到单元测试,甚至到后续部署,一站式管理;
  2. 配置相对简单,只需配置 Jenkinsfile 即可完成,无需花费大量的人力物力来做各系统间的整合操作;
  3. 系统集成后,会给开发人员发送邮件,报告集成成功或失败,这一点还是比较人性化的;
  4. 「CODING 持续集成」平台集成了很多种命令,起码我用到的 mvn/java/docker/git 这一类的命令基本都集成在服务中了。

希望 CODING 会越来越完善,越来越好!

使用 CODING 进行 Spring Boot 项目的集成的更多相关文章

  1. 携程Apollo(阿波罗)配置中心在Spring Boot项目快速集成

    前提:先搭建好本地的单机运行项目:http://www.cnblogs.com/EasonJim/p/7643630.html 说明:下面的示例是基于Spring Boot搭建的,对于Spring项目 ...

  2. 如何在Spring Boot项目中集成微信支付V3

    Payment Spring Boot 是微信支付V3的Java实现,仅仅依赖Spring内置的一些类库.配置简单方便,可以让开发者快速为Spring Boot应用接入微信支付. 演示例子: paym ...

  3. [转帖]spring boot项目集成jacoco

    小试牛刀:spring boot项目集成jacoco 2019-03-28 20:14:36 zyq23333 阅读数 509   版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议, ...

  4. spring boot rest 接口集成 spring security(2) - JWT配置

    Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...

  5. spring boot rest 接口集成 spring security(1) - 最简配置

    Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...

  6. Spring Boot项目使用Swagger2文档教程

    [本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究.若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!] 前言 Sprin ...

  7. Spring Boot 项目实战(五)集成 Dubbo

    一.前言 上篇介绍了 Redis 的集成过程,可用于解决热点数据访问的性能问题.随着业务复杂度的提高,单体应用越来越庞大,就好比一个类的代码行数越来越多,分而治之,切成多个类应该是更好的解决方法,所以 ...

  8. Gitlab CI 集成 Kubernetes 集群部署 Spring Boot 项目

    在上一篇博客中,我们成功将 Gitlab CI 部署到了 Docker 中去,成功创建了 Gitlab CI Pipline 来执行 CI/CD 任务.那么这篇文章我们更进一步,将它集成到 K8s 集 ...

  9. Spring Boot 项目集成 Alibaba Druid

    Druid 是一个非常好用的数据库连接池,但是他的好并不止体现在作为一个连接池加快数据访问性能上和连接管理上,他带有一个强大的监控工具:Druid Monitor.不仅可以监控数据源和慢查询,还可以监 ...

随机推荐

  1. .NET程序员所需要注意的网站资源

    一个程序员 需要 对 技术 和 行业 两方面同时具有极大热情和注意力才能让自己在一个新的台阶. 有些程序员是对技术有着极大的热情但是行业完全不注意,这样我感觉只能成为一个专家,并不能让自己真正的质变, ...

  2. 浏览器本地数据库 IndexedDB 基础详解

    一.概述 随着浏览器的功能不断增强,越来越多的网站开始考虑,将大量数据储存在客户端,这样可以减少从服务器获取数据,直接从本地获取数据. 现有的浏览器数据储存方案,都不适合储存大量数据:Cookie 的 ...

  3. 【转载】CSS3 文字溶解效果

    代码如下: <!DOCTYPE html> <html > <head> <meta charset="UTF-8"> <ti ...

  4. Android 音视频开发(三):使用 AudioTrack 播放PCM音频

    一.AudioTrack 基本使用 AudioTrack 类可以完成Android平台上音频数据的输出任务.AudioTrack有两种数据加载模式(MODE_STREAM和MODE_STATIC),对 ...

  5. [SQL]LeetCode196. 删除重复的电子邮箱 | Delete Duplicate Emails

    Write a SQL query to delete all duplicate email entries in a table named Person, keeping only unique ...

  6. [Java]LeetCode690. 员工的重要性 | Employee Importance

    You are given a data structure of employee information, which includes the employee's unique id, his ...

  7. [Swift]LeetCode834. 树中距离之和 | Sum of Distances in Tree

    An undirected, connected tree with N nodes labelled 0...N-1 and N-1 edges are given. The ith edge co ...

  8. 关于scrollTop获取卷曲距离的三种方式- --兼容代码如下

    对于不同浏览器而言--获取卷曲距离方式可能有所不一样---下面提供三种方式--- scrollTop1 = window.pageYoffset || document.documentElement ...

  9. Python档案袋( Socket 与 ScoketServer 通信 )

    Socket有一个缓冲区,缓冲区是一个流,先进先出,发送和取出的可自定义大小的,如果取出的数据未取完缓冲区,则可能存在数据怠慢.其中[recv(1024)]表示从缓冲区里取最大为1024个字节,但实际 ...

  10. Linux 设置自启动服务

     0 为停机,机器关闭.(千万不要把initdefault设置为0 )    1 为单用户模式,就像Win9x下的安全模式类似.    2 为多用户模式,但是没有NFS支持.    3 为完整的多用户 ...