DevOps 已成为解决软件开发流程缓慢、孤立或功能失调的默认答案。但是,当您是 DevOps 新手并且不确定从哪里开始时,这并没有多大意义。本文探讨了 DevOps 管道是什么,并提供了创建管道的五个步骤流程。虽然本教程并不全面,但它应该为您提供一个开始和以后扩展的基础。但首先,讲一个故事。
我的 DevOps 之旅
我曾经在花旗集团的云团队工作,开发一个基础设施即服务 (IaaS) Web 应用程序来管理花旗的云基础设施,但我一直对找出使开发管道更有效并为开发团队带来积极文化变革的方法感兴趣。我在格雷格·薰衣草(Greg Lavender)推荐的一本书中找到了答案,格雷格·薰衣草是花旗云架构和基础设施工程的首席技术官,这本书名为凤凰项目。这本书读起来像小说,同时解释了 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?”,您可能会得到几个不同的答案。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 | 知识共享和 MIT |
Travis CI | MIT |
CruiseControl | BSD |
Buildbot | GPL |
Apache Gump | Apache 2.0 |
Cabie | GNU |
以下是使用 CI/CD 工具的 DevOps 流程。

您的本地主机中运行着 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 | 不适用 |
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 较宽松公共许可证 | Java |
GlassFish | CDDL 和 GNU 较宽松公共许可证 | Java |
Django | 3 条款 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 公共许可证 (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 公共许可证 |
SaltStack | Apache 2.0 |
Chef | Apache 2.0 |
Puppet | Apache 或 GPL |
有关中间件自动化工具的更多信息,请查看 Opensource.com 上的其他文章
您接下来可以去哪里?
这只是完整 DevOps 管道的冰山一角。从 CI/CD 工具开始,探索您可以自动化的其他内容,以使您团队的工作更轻松。此外,还可以查看可以帮助您的团队更好地协同工作的开源通信工具。
为了更深入的了解,以下是一些关于 DevOps 的非常好的入门文章
将 DevOps 与开源敏捷工具集成也是一个好主意
14 条评论