使用开源工具构建 DevOps 流水线的初学者指南

如果您是 DevOps 新手,请查看构建您的第一个流水线的这五个步骤流程。
382 位读者喜欢这篇文章。
Shaking hands, networking

DevOps 已成为解决缓慢、孤立或功能失调的软件开发流程的默认答案。但是,如果您是 DevOps 新手并且不确定从哪里开始,这并没有多大意义。本文探讨了 DevOps 流水线是什么,并提供了一个创建流水线的五步流程。虽然本教程不全面,但它应该为您提供一个入门并在以后扩展的基础。但首先,讲个故事。

我的 DevOps 之旅

我曾经在花旗集团的云团队工作,开发一个基础设施即服务 (IaaS) Web 应用程序来管理花旗的云基础设施,但我一直对如何提高开发流水线的效率并为开发团队带来积极的文化变革感兴趣。我在 Greg Lavender 推荐的一本书中找到了答案,Greg Lavender 是花旗云架构和基础设施工程的首席技术官,这本书名为 The Phoenix Project。这本书读起来像小说,同时解释了 DevOps 原则。

本书背面的表格显示了不同公司部署到发布环境的频率

公司 部署频率
亚马逊 每天 23,000 次
谷歌 每天 5,500 次
Netflix 每天 500 次
Facebook 每天 1 次
Twitter 每周 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 流水线的五步方法,就像下图所示的流水线一样。

Complete DevOps pipeline

事不宜迟,让我们开始吧。

步骤 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 tool

您的 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
Concurrent Versions System (CVS) GNU
Vesta LGPL
Mercurial GNU GPL v2+

这是添加 SCM 后的 DevOps 流水线的样子。

Source control management

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 工具构建它。

Build automation tool

一切都很好,对吧?但是您可以在哪里部署它呢?

步骤 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 流水线几乎可以使用了。做得好!

Web application server

虽然可以到此为止并自行进一步集成,但代码质量是应用程序开发人员需要关注的重要事项。

步骤 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 需要操作系统的巨大占用空间,这会超过应用程序的大小,而容器只需要一些库和配置即可运行应用程序。虚拟机显然仍然有重要的用途,但容器是托管应用程序(包括应用程序服务器)的轻量级解决方案。

虽然还有其他容器选项,但 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 或 GPL

有关中间件自动化工具的更多信息,请查看 Opensource.com 上的其他文章

接下来可以做什么?

这只是完整的 DevOps 流水线可能是什么样子的冰山一角。从 CI/CD 工具开始,探索您还可以自动化哪些内容,以使您团队的工作更轻松。此外,还可以查看 开源通信工具,这些工具可以帮助您的团队更好地协同工作。

为了获得更多见解,以下是一些关于 DevOps 的非常好的入门文章

将 DevOps 与开源敏捷工具集成也是一个好主意

标签
User profile image.
Bryant Jimin Son 是 GitHub 的一名 Octocat,这不是官方头衔,但他喜欢被这样称呼。GitHub 是一家以托管世界上大多数开源项目而闻名的公司。在工作中,他正在探索不同的 git 技术、GitHub Actions、GitHub 安全等。此前,他曾在 Red Hat 担任高级顾问,Red Hat 是一家以其 Linux 服务器和开源贡献而闻名的技术公司。

14 条评论

非常喜欢这篇文章。我只是想问一下:C++ 是一种专有语言吗?我以为它像 C 一样是开源的。C# 我知道是专有的。

C++ 本身是一种语言,而不是特定的实现,因此标准/语言本身没有源代码可用。一些 C++ 实现是开源的(例如,Gnu 和 Clang)。

回复 ,作者:Marcos Alano (未验证)

文章写得不错 Bryant,但我认为 Travis 是基于 SAAS 的服务,而不是开源工具(带有 MIT 许可证)。

您忘记了 GitLab。在我看来,它是所有 CI/CD 和代码托管平台中最好的(但这取决于您的用例),而且它都在一个应用程序中。您不必集成 5 个不同的应用程序即可获得良好的 DevOps 工作流程,您只需在存储库根目录中编写一个简单的 .gitlab-ci.yml 脚本即可 - 其余的都是 GitLab 的魔力。你们应该真的尝试一下 - https://about.gitlab.com

为什么甚至没有提到 Gitlab CE 作为 CI/CD 的替代方案?

Creative Commons License本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.