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

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

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

我的 DevOps 之旅

我曾经在花旗集团的云团队工作,开发一个基础设施即服务 (IaaS) Web 应用程序来管理花旗的云基础设施,但我一直对如何提高开发流水线的效率以及为开发团队带来积极的文化变革感兴趣。我在 Greg Lavender 推荐的一本书中找到了答案,Greg Lavender 是花旗云架构和基础设施工程的 CTO,书名是凤凰项目。这本书读起来像小说,同时解释了 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-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 流水线图。

可选步骤

容器

正如我上面提到的,您可以将您的应用程序服务器托管在虚拟机或服务器上,但容器是一种流行的解决方案。

什么是容器?简短的解释是,虚拟机需要操作系统的庞大占用空间,这会淹没应用程序的大小,而容器只需要一些库和配置即可运行应用程序。虚拟机显然仍然有重要的用途,但容器是托管应用程序(包括应用程序服务器)的轻量级解决方案。

虽然容器还有其他选择,但 Docker 和 Kubernetes 是最流行的。

名称 许可证
Docker Apache 2.0
Kubernetes Apache 2.0

要了解更多信息,请查看其他关于 Docker 和 Kubernetes 的 Opensource.com 文章

中间件自动化工具

我们的 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 安全等。此前,他曾担任红帽公司的高级顾问,红帽公司是一家以其 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 不错。一些红帽员工也在使用它 :)

回复 作者:Sergiu Marton (未验证)

GitLab 不错。一些红帽员工也在使用它 :)

回复 作者:Sergiu Marton (未验证)

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

Creative Commons License本作品根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.