持续交付为业务的持续发展和整个软件的交付周期增加了巨大的价值,但是掌握这项技术就意味着普通开发人员要跳出舒适区,学习很多新技能。本书以实践为基础,作者 Daniel Bryant 和Abraham Marín-Pérez通过大量的实践指导,帮助Java开发人员掌握针对不同平台的架构设计、自动化质量保证, 以及打包和部署的技巧。
· 你将获得一些理解核心概念的帮助,以及有助于向持续交付迁移的指导意见。
· 你将学会如何设计能在不同平台上持续交付Java应用程序的架构。
· 你将学会如何构建应用程序构件,包括胖JAR文件、虚拟机镜像,以及操作系统容器(Docker)镜像。
· 你将学会如何使用Jenkins、PMD和FindSecBug等持续集成工具自动化地进行代码质量检查。
· 你将学会如何创建一个复杂的构建管道,以及如何设计独立的部署和发布流程。
· 你将了解为什么功能测试和系统质量属性测试对于开发和交付非常重要。
· 你将学会如何在本地有效地构建和测试应用程序,以及监控生产环境中运行的应用程序。
本书完整介绍了Java软件开发的整个生命周期,还结合大量的成功实践经验,介绍了每个阶段可能会使用到的工具和技能。在基础设施已经极大完善的今天,本书还与时俱进地介绍了如何在Docker、Kubernetes、Cloud、FaaS等新兴环境下进行持续集成和持续交付。
序一
自从Dave Farley和Jez Humble写了Continuous Delivery一书后,持续交付社区普遍开始认为工具并不重要。在现实中,已经存在大量优秀的编程语言,以及大量用来构建、测试和部署程序的优秀工具。因此,他们曾经的观点是,你使用什么工具并不重要,只要不去使用那些特别糟糕的工具。
这些年,这种观点被Nicole Forsgren博士、Jez Humble和Gene Kim的研究工作进一步发展。他们的著作Accelerate总结了他们在持续交付、IT效能等方面多年的研究成果。
其中的一个结论就是,一个团队是否能够选择适合自己的工具,对于持续交付有着绝对重要的影响。因此,现在这个观点已经变成:你使用什么工具并不重要,只要你有能力自己选择工具,并且不去使用那些特别糟糕的工具。
以我自己为例。我第一次在团队中实施持续交付,还是2007年在Elsevier公司工作期间。我们借助了一些极限编程的方式,例如TDD和CI,使用Java 6、Spring 2和Tomcat 6编写了一个旅行网站。构建工具使用的是Ant和Cruise Control。代码库始终处于可发布的状态,并且每隔一周就将代码部署到生产环境。
我第一次在整个公司中实施持续交付,是2008年在LMAX公司。我们使用极限编程和领域驱动设计,使用Java 6、Spring 3和Resin 3编写了一个艺术品交易平台。构建工具依然使用的是Ant和Cruise Control,以及许多自定义的仪表盘。代码库依旧始终处于可发布状态,每隔两星期部署到生产环境一次。
我肯定你已经看出了其中的共同点。聪明的人会选择紧密的合作,因此我们选择了极限编程,并规定了良好的设计准则,然后根据手上的工作来合理选择使用的工具。我记得在LMAX公司工作期间,研发部门的领导也正在写一本关于持续交付的书,不过我已经记不清他的名字是叫Dafydd、Dev还是其他什么了。我想说的是,不管你使用Java、PHP还是.NET,都可以成功地实施持续交付。你可以使用Solaris Zones或者Docker,也可以使用AWS、Azure或者自己的数据中心(也许你的平台负责人会一直认为它比AWS更便宜)。你只需确保为要解决的具体问题选择了合适的工具。此外,不要使用MKS进行版本控制,不要使用QTP进行测试,也不要使用其他任何商业的发布管理工具,因为它们都太难用了。
那么现在问题来了,如果你真的认为只要选择了合适的工具就行,为什么我还要写这篇序言呢?
实际上,如果我们仔细思考一下,就会发现这里面的细微差别。与持续交付的原则和实践相比,工具可能并不重要,但是它们依然有非常重要的作用。编程语言不仅可以帮助人们快速创建新的功能和补丁,降低产品开发过程中的延期风险,而且有助于构建一个可测试、可发布的应用程序架构,这同样也是持续交付的一个关键目标。良好的构建、测试和部署工具,可以帮助人们向着TDD、基于Trunk开发等正确的实践方向上前进。
当我最近在打扫童年卧室的时候,发现了大学时Ivor Horton写的Uderstanding Java 2一书,于是我想起了一些往事。从1999年开始接触Java,我已经度过了近20个年头。在我的印象中,Java是一门伟大的编程语言。在这些年里,Java、JUnit、Gradle、Spring以及其他许多工具,帮助我构建了许多测试良好的、可发布的应用程序,并鼓励人们不断去接受持续交付的概念。
随着云计算、容器化以及无服务器架构逐渐成为现在的趋势,我们都需要经验丰富的人来告诉我们,如何使用最新的工具来实施持续交付。在本书中,Daniel和Abraham介绍了如何使用Java和Spring Boot、Kubernetes及AWS EKS等流行工具,实现高频率地交付现代化的Web应用程序,从而满足市场需求。通过Daniel和Abraham的讲解,相信任何使用Java的IT人员都可以学会,如何通过一系列工具让应用程序实现可持续性的交付。
—— Steve Smith Continuous Delivery 咨询公司的持续交付顾问
序二
持续交付是一门重要的实践技术,每个工程团队都应该铭记于心。我们经常被问到,是什么样的关键因素,使我们成功地运营了jClarity公司,以及在adoptopenjdk.net上创建了OpenJDK/Java。答案是,我们可以每天以最大的信心进行部署,并且用最小的工程团队来完成此事。自从Dave Farley和Jez Humble在 2010年开创性地编写了Continuous Delivery: Reliable Software Releases through Build,Test, and Deployment Automation(Addison-Wesley Signature)一书后,人们虽然已经逐渐开始接受持续交付的概念,但是仍然缺少一本完整指南,告诉近1000万名Java开发者如何做到这一点。现在,它终于出现了。
Daniel和Abraham都是持续交付的践行者,他们的书中包含了一名Java开发者需要了解的所有有关持续交付的内容,同时又对某些内容进行了深入的讲解,包括“为什么”你希望遵守持续交付的实践原则,如何设计一个符合持续交付的应用架构,如何将构建、测试及部署管道集成到一起,甚至还包括如何在错综复杂的云计算和容器环境中进行部署。
在如今的Java行业中,“云原生”概念的影响范围越来越大,现代应用程序必须开始考虑如何连接大量的外部组件(包括JVM和其他组件),以及通过一种非常不同的方式,处理以往由本地操作系统提供的资源(例如I/O)。甚至连应用程序的生命周期,以及它们与物理机器的关系都在发生变化,例如不可变架构和无服务器架构等,都在要求所有Java开发者不断更新自己的知识,以充分利用这些新的应用交付能力。
在如今这个崭新的世界中,持续交付的技术及其背后的工具和设计理念,以及面向云计算开发的模式已经变得越来越重要。到目前为止,还没有一本专门为Java开发人员编写的指南,指导他们如何完整地实施持续交付,并从中获益,而本书弥补了这一点。
—— Martijn Verburg jClarity 公司 CEO 及 LJC 领导人
这是除了Effective Java(第3版)以外,我要求团队中每个人都要读的书,并且它会无数次证明它的价值。
——Martijn Verburg
jClarity公司CEO及LJC组织领导人
通过持续交付的概念,介绍了大量的云基础架构组件及相关技术。这本书对于任何一名希望进行云原生开发的Java人员来说,都是一本不可或缺的好书。
——Ben Evans作家及某咨询公司CTO