DevOps 已成为解决软件开发流程缓慢、孤立或其他功能失调的默认答案。但是,当您是 DevOps 的新手,并且不确定从哪里开始时,这并没有太大的意义。本文探讨了什么是 DevOps 流水线,并提供了创建它的五个步骤。虽然本教程并不全面,但它应该为您提供一个开始并在以后扩展的基础。但首先,讲个故事。
我的 DevOps 之旅
我曾经在花旗集团的云团队工作,开发一个基础设施即服务 (IaaS) Web 应用程序来管理花旗的云基础设施,但我一直对如何提高开发流水线的效率以及为开发团队带来积极的文化变革感兴趣。我在 Greg Lavender 推荐的一本书中找到了答案,他是花旗云架构和基础设施工程的 CTO,这本书叫做凤凰项目。这本书读起来像一部小说,同时解释了 DevOps 原则。
本书末尾的一个表格显示了不同公司部署到发布环境的频率
公司 | 部署频率 |
---|---|
亚马逊 | 每天 23,000 次 |
谷歌 | 每天 5,500 次 |
Netflix | 每天 500 次 |
每天 1 次 | |
每周 3 次 | |
典型企业 | 每 9 个月 1 次 |
亚马逊、谷歌和 Netflix 的频率怎么可能实现?这是因为这些公司已经弄清楚了如何创建一个近乎完美的 DevOps 流水线。
在我们花旗实施 DevOps 之前,情况肯定不是这样。那时,我的团队有不同的分段环境,但是到开发服务器的部署非常手动。所有开发人员都只能访问一个基于 IBM WebSphere Application Server Community Edition 的开发服务器。问题是,每当多个用户同时尝试进行部署时,服务器就会崩溃,因此开发人员必须互相告知他们何时要进行部署,这非常痛苦。此外,代码测试覆盖率低、手动部署过程繁琐,并且无法使用已定义的任务或用户故事来跟踪代码部署,这些都是问题。
我意识到必须做些什么,并且我找到了一位有相同感受的同事。我们决定合作构建一个初始的 DevOps 流水线——他设置了一个虚拟机和一个 Tomcat 应用程序服务器,而我则在 Jenkins 上工作,集成 Atlassian Jira 和 BitBucket 以及代码测试覆盖率。这个副项目非常成功:我们几乎完全自动化了开发流水线,我们在开发服务器上实现了近 100% 的正常运行时间,我们可以跟踪和提高代码测试覆盖率,并且 Git 分支可以与部署和 Jira 任务相关联。我们用来构建 DevOps 流水线的大部分工具都是开源的。
我现在意识到我们的 DevOps 流水线是多么的初级,因为我们没有利用 Jenkins 文件或 Ansible 等高级配置。然而,这个简单的过程运行良好,可能是由于 帕累托 原则(也称为 80/20 规则)。
DevOps 和 CI/CD 流水线简介
如果您问几个人“什么是 DevOps?”,您可能会得到几个不同的答案。像 agile 一样,DevOps 已经发展到包含许多不同的学科,但大多数人会在几件事上达成一致:DevOps 是一种软件开发实践或软件开发生命周期 (SDLC),其中心原则是文化变革,开发者和非开发者都在一个环境中呼吸,在这个环境中,以前手动的事情都是自动化的;每个人都做他们最擅长的事情;每个时期的部署数量增加;吞吐量增加;灵活性提高。
[下一步阅读: DevOps 流水线入门:持续集成和持续交付 (CI/CD)]
虽然拥有正确的软件工具并不是实现 DevOps 环境的唯一条件,但有些工具是必要的。一个关键的工具是持续集成和持续部署 (CI/CD)。这个流水线是环境具有不同阶段(例如,DEV、INT、TST、QA、UAT、STG、PROD)、手动的事情是自动化的,以及开发者可以实现高质量的代码、灵活性和大量部署的地方。
本文介绍了一种创建 DevOps 流水线的五步方法,如下图所示,使用开源工具。

事不宜迟,让我们开始吧。
第 1 步:CI/CD 框架
您需要的第一件事是 CI/CD 工具。Jenkins 是一款基于 MIT 许可的开源、基于 Java 的 CI/CD 工具,它普及了 DevOps 运动并已成为事实上的标准。
那么,什么是 Jenkins?把它想象成某种神奇的万能遥控器,它可以与许多不同的服务和工具进行通信并协调它们。就其本身而言,像 Jenkins 这样的 CI/CD 工具是无用的,但是当它插入到不同的工具和服务中时,它会变得更加强大。
Jenkins 只是您可以用来构建 DevOps 流水线的众多开源 CI/CD 工具之一。
名称 | 许可 |
---|---|
Jenkins | Creative Commons 和 MIT |
Travis CI | MIT |
CruiseControl | BSD |
Buildbot | GPL |
Apache Gump | Apache 2.0 |
Cabie | GNU |
以下是使用 CI/CD 工具的 DevOps 流程。

您的 localhost 中运行着一个 CI/CD 工具,但目前您无法做太多事情。让我们继续 DevOps 之旅的下一步。
第 2 步:源代码控制管理
验证您的 CI/CD 工具是否可以执行某些魔法的最佳(可能也是最简单)方法是与源代码控制管理 (SCM) 工具集成。为什么需要源代码控制?假设您正在开发一个应用程序。每当您构建一个应用程序时,您都在编程——无论您使用的是 Java、Python、C++、Go、Ruby、JavaScript 还是其他无数种编程语言中的任何一种。您编写的编程代码称为源代码。一开始,特别是当您独自工作时,将所有内容都放在本地目录中可能还可以。但是,当项目变得更大并且您邀请其他人进行协作时,您需要一种方法来避免合并冲突,同时有效地共享代码修改。您还需要一种方法来恢复以前的版本——并且进行备份和复制粘贴的过程已经过时了。您(和您的队友)想要更好的东西。
这就是 SCM 几乎成为必需品的地方。 SCM 工具通过将您的代码存储在存储库中、对您的代码进行版本控制以及在项目成员之间进行协调来提供帮助。
虽然有很多 SCM 工具,但 Git 是标准,这是理所当然的。我强烈建议使用 Git,但是如果您愿意,还有其他开源选项。
名称 | 许可 |
---|---|
Git | GPLv2 & LGPL v2.1 |
Subversion | Apache 2.0 |
并发版本系统 (CVS) | GNU |
Vesta | LGPL |
Mercurial | GNU GPL v2+ |
以下是添加 SCM 后的 DevOps 流水线。

CI/CD 工具可以自动化检入和检出源代码以及跨成员协作的任务。不错吧?但是,您如何将其变成一个可供数十亿人使用和欣赏的有效应用程序?
第 3 步:构建自动化工具
太棒了!您可以检出代码并将您的更改提交到源代码控制,并且您可以邀请您的朋友协作进行源代码控制开发。但是您还没有构建应用程序。要使其成为 Web 应用程序,必须对其进行编译并放入可部署的软件包格式或作为可执行文件运行。(请注意,像 JavaScript 或 PHP 这样的解释型编程语言不需要编译。)
进入构建自动化工具。无论您决定使用哪种构建工具,所有构建自动化工具都有一个共同的目标:将源代码构建为某种所需的格式,并自动化清理、编译、测试和部署到某个位置的任务。构建工具将根据您的编程语言而有所不同,但以下是一些常见的开源选项供您考虑。
名称 | 许可 | 编程语言 |
---|---|---|
Maven | Apache 2.0 | Java |
Ant | Apache 2.0 | Java |
Gradle | Apache 2.0 | Java |
Bazel | Apache 2.0 | Java |
Make | GNU | N/A |
Grunt | MIT | JavaScript |
Gulp | MIT | JavaScript |
Buildr | Apache | Ruby |
Rake | MIT | Ruby |
A-A-P | GNU | Python |
SCons | MIT | Python |
BitBake | GPLv2 | Python |
Cake | MIT | C# |
ASDF | Expat (MIT) | LISP |
Cabal | BSD | Haskell |
太棒了!您可以将构建自动化工具配置文件放入您的源代码控制管理中,并让您的 CI/CD 工具构建它。

一切都很好,对吧?但是您可以在哪里部署它?
第 4 步:Web 应用程序服务器
到目前为止,您有一个可能可执行或可部署的打包文件。对于任何真正有用的应用程序,它都必须提供某种服务或接口,但是您需要一个容器来托管您的应用程序。
对于 Web 应用程序,Web 应用程序服务器就是该容器。应用程序服务器提供了一个环境,可以在其中检测可部署包中的编程逻辑,呈现界面,并通过向外界打开套接字来提供 Web 服务。您需要一个 HTTP 服务器以及一些其他环境(如虚拟机)来安装您的应用程序服务器。现在,让我们假设您将在此过程中了解这一点(尽管我将在下面讨论容器)。
有许多可用的开源 Web 应用程序服务器。
名称 | 许可 | 编程语言 |
---|---|---|
Tomcat | Apache 2.0 | Java |
Jetty | Apache 2.0 | Java |
WildFly | GNU Lesser Public | Java |
GlassFish | CDDL & GNU Less Public | Java |
Django | 3-Clause BSD | Python |
Tornado | Apache 2.0 | Python |
Gunicorn | MIT | Python |
Python Paste | MIT | Python |
Rails | MIT | Ruby |
Node.js | MIT | Javascript |
现在,DevOps 管道几乎可以使用了。做得好!

虽然可以到此为止,并自行进一步集成,但代码质量是应用程序开发人员需要关注的重要事项。
第 5 步:代码测试覆盖率
实现代码测试片段可能是另一个繁琐的要求,但开发人员需要尽早发现应用程序中的任何错误,并提高代码质量,以确保最终用户满意。 幸运的是,有许多开源工具可用于测试您的代码并建议改进其质量的方法。 更好的是,大多数 CI/CD 工具都可以插入这些工具并自动化该过程。
代码测试分为两部分:代码测试框架,可帮助编写和运行测试,以及代码质量建议工具,可帮助提高代码质量。
代码测试框架
名称 | 许可 | 编程语言 |
---|---|---|
JUnit | Eclipse 公共许可证 | Java |
EasyMock | Apache | Java |
Mockito | MIT | Java |
PowerMock | Apache 2.0 | Java |
Pytest | MIT | Python |
Hypothesis | Mozilla | Python |
Tox | MIT | Python |
代码质量建议工具
名称 | 许可 | 编程语言 |
---|---|---|
Cobertura | GNU | Java |
CodeCover | Eclipse Public (EPL) | Java |
Coverage.py | Apache 2.0 | Python |
Emma | 通用公共许可证 | Java |
JaCoCo | Eclipse 公共许可证 | Java |
Hypothesis | Mozilla | Python |
Tox | MIT | Python |
Jasmine | MIT | JavaScript |
Karma | MIT | JavaScript |
Mocha | MIT | JavaScript |
Jest | MIT | JavaScript |
请注意,上面提到的大多数工具和框架都是为 Java、Python 和 JavaScript 编写的,因为 C++ 和 C# 是专有编程语言(尽管 GCC 是开源的)。
现在您已经实现了代码测试覆盖率工具,您的 DevOps 管道应该类似于本教程开头显示的 DevOps 管道图。
可选步骤
容器
正如我上面提到的,您可以将应用程序服务器托管在虚拟机或服务器上,但容器是一种流行的解决方案。
什么是容器? 简而言之,VM 需要操作系统的巨大占用空间,这超过了应用程序的大小,而容器只需要一些库和配置即可运行应用程序。 显然,VM 仍然有重要的用途,但容器是托管应用程序(包括应用程序服务器)的轻量级解决方案。
虽然还有其他容器选项,但 Docker 和 Kubernetes 是最受欢迎的。
名称 | 许可 |
---|---|
Docker | Apache 2.0 |
Kubernetes | Apache 2.0 |
要了解更多信息,请查看这些其他的 Opensource.com 关于 Docker 和 Kubernetes 的文章
中间件自动化工具
我们的 DevOps 管道主要侧重于协作构建和部署应用程序,但您可以使用 DevOps 工具做很多其他事情。 其中之一是利用基础设施即代码 (IaC) 工具,也称为中间件自动化工具。 这些工具可以帮助自动化中间件软件的安装、管理和其他任务。 例如,自动化工具可以使用正确的配置提取应用程序(例如 Web 应用程序服务器、数据库和监控工具),并将它们部署到应用程序服务器。
以下是几个值得考虑的开源中间件自动化工具
名称 | 许可 |
---|---|
Ansible | GNU Public |
SaltStack | Apache 2.0 |
Chef | Apache 2.0 |
Puppet | Apache or GPL |
有关中间件自动化工具的更多信息,请查看这些其他的 Opensource.com 文章
您可以从这里开始做什么?
这只是一个完整的 DevOps 管道的冰山一角。 从 CI/CD 工具开始,探索您还可以自动化哪些内容,以使您的团队的工作更轻松。 此外,还可以研究开源通信工具,这些工具可以帮助您的团队更好地协同工作。
如需更多见解,请参阅以下有关 DevOps 的非常好的入门文章
将 DevOps 与开源敏捷工具集成也是一个好主意
14 条评论