Spring 团队开发者的现状

Spring 社区核心项目如何做软件的迭代和发布?_java

Spring 社区核心项目如何做软件的迭代和发布?_java_02


Spring 社区已经有了几十个项目,其中被广泛使用的是 Spring Framework 和 Spring Boot,Spring Cloud 等等。由于 Spring 项目基本涵盖Java 开发所需要的各种功能,并且有庞大的社区支持,它们被 Java 开发者亲切的称为”Spring 全家桶”。

 

Spring 项目的开发者分布在全球各地,主要集中在美国,欧洲。每个项目由几个人的开发团队组成,大部分是 Work From Home,没有 QA,没有专门的测试。Spring 项目非常活跃,以 Spring Boot 项目为例,他们在 Github 上的 Star 已经超过13000+,被 Fork 超过11000次。Spring 社区已经有13000+的 Issues 被创建,其中有 Bug,也有用户提的需求和问题。

Spring 社区核心项目如何做软件的迭代和发布?_java_03

Spring 项目持续交付的工具链

Spring 社区核心项目如何做软件的迭代和发布?_javaSpring 社区核心项目如何做软件的迭代和发布?_java_05


如此活跃的社区项目,必然有一个优秀的软件交付流水线:


  1. 需求变更管理:

    Spring Framework 使用 Jira 记录 Issue,Spring Boot 项目使用 Github Issues管理 Issue。

  2. 构建管理:

    使用 Bamboo 管理构建,使用 JFrog Artifactory 进行包管理。

  3. 包管理:

    使用 JFrog Bintray 进行发布管理,首先包会被上传到 Bintray 进行首发,再由 Bintray 复制到 MavenCentral。

  4. 打包工具

    Spring Boot 使用 Maven,Spring Framework 使用 Gradle。

Spring 社区核心项目如何做软件的迭代和发布?_java_03

如何让外部人员测试一个 Fix?

Spring 社区核心项目如何做软件的迭代和发布?_java

通常,社区用户提了 Issue 之后,Spring 团队的开发者会进行修复,提交代码,和单元测试用例,并且执行单元测试。上传 Snapshot 构建到 JFrog Artifactory 后,开发者会告知 Issue 的提交者从 Artifactory 下载最新的 Snapshot 构建来测试是否这次构建解决了问题,这种早期测试的功能非常有用。


Spring 社区核心项目如何做软件的迭代和发布?_java_08


如何做到?

  1. Spring 使用 Bamboo + Artifactory 插件,一旦有代码提交,便会触发 Bamboo 的构建。

  2. 通过 Artifactory 插件,将包上传到 公网上的 Artifactory 服务器: repo.spring.io。

  3. 如果用户需要测试,他只需在 Pom 文件里修改对应的依赖版本,Maven 的客户端会从 Artifactory 服务器取到最新版的构建。

Spring 社区核心项目如何做软件的迭代和发布?_java_03

如何做文档管理?

Spring 社区核心项目如何做软件的迭代和发布?_javaSpring 社区核心项目如何做软件的迭代和发布?_java_11


Spring 庞大的社区必须要靠完善的文档作为支持。Spring 团队使用 AsciiDoctor 创建文档。


熟读 Spring Framework 文档的同学都知道,Spring 的文档是可以下载成为 PDF 和 Epub 类型的文件的,方便离线阅读和搜索,这就是用了 AsciiDoctor 实现的。

 

使用 AsciiDoctor 的另一个好处在于它的可读性非常好,当需要修改文档是,只需 Fork Github 上的文档,修改内容,再提交 Pull Request。


Spring 的文档有 Spring 团队和社区用户共同维护,如何让文档进行实时的更新发布呢?Spring 团队使用 Artifactory 元数据实时发布文档:


Spring 社区核心项目如何做软件的迭代和发布?_java_12


  1. 首先 Spring 团队将所有的文档打成 Zip 文件上传至 Artifactory,命名方式类似于 ‘Spring-boot-docs.1.3.0.zip’。

  2. 用 Cron + Perl 命令将 docs.zip 文件解压并部署到他们的文档服务器。

  3. 如何避免重复部署?当 Cron 任务部署了某个 Doc 文件后,会在 Artifactory 里该文件的 Properties 里记录”Deployed=True”,当下次部署时,会过滤带有这种元数据的文档,从而避免重复发布文档。

Spring 社区核心项目如何做软件的迭代和发布?_java_03

如何做代码,分支合并

Spring 社区核心项目如何做软件的迭代和发布?_javaSpring 社区核心项目如何做软件的迭代和发布?_java_15


依赖 Pull Request 合并 Feature 分支。合并代码的时候,绝不轻易合并,而是考虑进行代码重构,增加测试用例,修改  Commit Message。

 

Commit Message 有一些规范:首行大写,第二行空行,并且要包含 Issue 号,这样可以将 Issue 的信息关联到 Bamboo,并且传递到 Artifactory 做包发布的生命周期记录。

 

Git log 也是极好调试的工具,在 Eclipse/Idea->Annotation 里,可以看到每行代码的最近修改记录,以及对应的 Issue,这样就能知道每行代码修改的原因。


Feature 分支的 Pull Request 被拒绝怎么办?

使用 git commit –amend 修改commit 的 History,进行再次提交,这样保证每个 Bug 的修复是一次变更,而不是挂着一堆变更。目前社区也有专门的工具做 Feature 分支开发的管理,例如 Gerrit。

Spring 社区核心项目如何做软件的迭代和发布?_java_03

Spring 项目如何做发布?

Spring 社区核心项目如何做软件的迭代和发布?_javaSpring 社区核心项目如何做软件的迭代和发布?_java_18


Spring 项目维护两个环境,Staging 和 Release 环境。80%的项目使用 Bamboo + Artifactory 进行发布。发布流程如下:

  1. 创建 Release Branch。

  2. 构建加测试。

  3. 在 Git 里执行 Tag。

  4. 将包部署到 Staging 环境。

  5. 升级到下一个版本。

  6. 一键发布到 JFrog Bintray。

  7. 修改 Spring.io 中的版本。

Spring 社区核心项目如何做软件的迭代和发布?_java_03

Spring 开发者的总结

Spring 社区核心项目如何做软件的迭代和发布?_java
  1. 尽量使用开源项目。

  2. 降低项目启动和配置的难度,这样你的开发者会更容易的上手。

  3. 使用 Git Branch 进行项目的迭代,基于 Feature 分支的开发,每次提交必须是一个最小的可测试单元。

  4. 在 Staging 环境里做测试,并且提供回滚的策略。

  5. 投资工具!

这样的开发流程特别适合微服务的开发。