使用开源工具构建 DevOps 管道的初学者指南

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

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

我的 DevOps 之旅

我曾经在花旗集团的云团队工作,开发一个基础设施即服务 (IaaS) Web 应用程序来管理花旗的云基础设施,但我一直对找出使开发管道更有效并为开发团队带来积极文化变革的方法感兴趣。我在格雷格·薰衣草(Greg Lavender)推荐的一本书中找到了答案,格雷格·薰衣草是花旗云架构和基础设施工程的首席技术官,这本书名为凤凰项目。这本书读起来像小说,同时解释了 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

您的本地主机中运行着 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 管道。

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 较宽松公共许可证 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 管道几乎可用了。干得好!

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 需要操作系统的庞大占用空间,这会使应用程序大小不堪重负,而容器只需要一些库和配置即可运行应用程序。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 与开源敏捷工具集成也是一个好主意

标签
User profile image.
Bryant Jimin Son 是一名 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。IMO 它是所有 CI/CD 和代码托管平台中最好的(但这取决于您的用例),而且它都在一个应用程序中。您不必集成 5 个不同的应用程序即可获得良好的 DevOps 工作流程,您只需在存储库根目录中编写一个简单的 .gitlab-ci.yml 脚本即可 - 其余的是 GitLab 的魔力。你们真的应该试试 - https://about.gitlab.com

GitLab 不错。一些 Red Hatter 也在使用它 :)

回复 作者 Sergiu Marton (未验证)

GitLab 不错。一些 Red Hatter 也在使用它 :)

回复 作者 Sergiu Marton (未验证)

为什么甚至没有将 Gitlab CE 提及为 CI/CD 替代方案?

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