写点什么

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

  • 2019-04-15
  • 本文字数:3943 字

    阅读完需:约 13 分钟

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

DevOps 生态需要考虑各种需求,例如持续集成方案、源控制管理、自动化构建、服务器选择、测试覆盖率等。本文通过 5 个关键步骤,向 DevOps 初学者介绍如何通过流行的开源工具来解决这些需求。


DevOps 在修复缓慢、孤立或其他功能失调方面已成为软件开发过程的首选方案。如果刚接触 DevOps 并且不确定从哪里开始,可以参考本文 DevOps Pipeline 的内容,以及创建一个 Pipeline 的五个步骤。

DevOps 之旅

我曾经在花旗集团的云团队工作,开发基础架构即服务(IaaS)Web 应用程序来管理花旗的云基础架构,但总想找到方法来提高开发流程效率,并为开发团队带来积极的文化变革。我在 Greg Lavender 推荐的一本书中找到了答案,他是花旗云架构和基础设施工程的首席技术官,书名叫The Phoenix Project,它像一本小说一样阐释了 DevOps 的原则。


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



Amazon、Google 和 Netflix 的频率是如何做到的?这是因为这些公司已经找到了制作一个近乎完美的 DevOps Pipeline 的方法。


花旗在实施 DevOps 之前,情况并非如此良好。那时候,团队有不同的阶段性环境,但是开发服务器的部署是非常手动的。所有开发人员只能访问基于 IBM WebSphere Application Server Community Edition 的一个开发服务器。问题是,当试图为多个用户同时进行部署时,服务器就会崩溃,因此开发人员不得不在即将进行部署时让对方知道,这点让人非常痛苦。此外,还存在代码测试覆盖率低、手动部署过程繁琐,以及无法绑定已定义的任务或用户故事来跟踪代码部署的问题。


我意识到必须要做一些改变,并找到了志同道合的同事。我们决定合作构建一个初始 DevOps 管道 - 他在 Jenkins 工作期间设置了虚拟机和 Tomcat 应用服务器,与 Atlassian Jira 和 BitBucket 集成等。之后,该项目取得了巨大成功:几乎完全自动化了开发流程,在开发服务器上实现了近 100%的正常运行时间,可以跟踪和改进代码测试覆盖率,Git 分支可以与部署和 Jira 任务相关联。并且,用于构建 DevOps 管道的大多数工具都是开源的。我现在意识到,DevOps 管道还存在不足,因为没有利用类似 Jenkins 文件或 Ansible 这样的高级配置。然而,这个简单的过程运作良好,可能是由于帕累托原则(也称为 80/20 规则)。

DevOps 和 CI/CD Pipeline 简要介绍

如果随便问几个人,“什么是 DevOps?”,可能会得到几个不同的答案。与敏捷开发一样,DevOps 已经发展到包含许多不同学科,但是大多数人会认可:DevOps 是一个软件开发实践或者软件开发生命周期(SDLC),核心原则是一种文化变革,开发人员和非开发人员都在一个原本是手动操作、现在是自动化的环境中工作,每个人都做最擅长的事情,每个时期的部署数量都在增加,吞吐量也在增加,灵活性则逐渐提高。


虽然合适的软件工具并不是实现 DevOps 环境所需的唯一办法,但有些工具是必需的。关键是持续集成和持续部署(CI/CD)。Pipeline 构建了一个环境,具有不同的阶段(例如,DEV,INT,TST,QA,UAT,STG,PROD),手工部分被自动化,开发人员可以实现高质量、高灵活性的代码,并允许大量部署。


本文介绍了使用开源工具创建 DevOps Pipeline 的五步方法,如下图所示:


第 1 步:CI/CD 框架

第一件事是找一款 CI/CD 工具。Jenkins 是一个基于 Java 开源的、基于 MIT 许可证的 CI/CD 工具,已成为 DevOps 的标准。


Jenkins 是什么?想象一种神奇的通用遥控器,Jenkins 可以与许多不同的服务和工具交互协调。类似 Jenkins 这样的 CI/CD 工具本身没多大用,但随着插入不同的工具和服务,将变得越来越强大。


Jenkins 只是众多开源 CI/CD 工具中的一种,可以利用它来构建 DevOps Pipeline。


NameLicense
JenkinsCreative Commons and MIT
Travis CIMIT
CruiseControlBSD
BuildbotGPL
Apache GumpApache 2.0
CabieGNU


以下是使用 CI/CD 工具的 DevOps 流程:



现在本地主机中运行了 CI/CD 工具,可以开始 DevOps 之旅的下一步。

第 2 步:源控制管理

验证 CI/CD 工具是如何运作最佳(也可能是最简单)方法是与源控制管理(SCM)工具集成。为什么需要源代码管理?假设正在开发一个应用程序,无论何时要构建应用程序,都需要编程,无论是 Java、Python、C ++、Go、Ruby、JavaScript 还是其他任何一种编程语言,所编写的编程代码称为源代码。


一开始,尤其是独自工作时,开发者将所有内容放在本地目录可能是可以的。但是,当项目变得更大并且需要邀请其他人协作时,需要一种方法来避免合并冲突,同时有效共享代码修改,还需要一种方法来恢复以前的版本,备份、复制和粘贴就显得比较落伍,开发者可能需要更好的东西。


这就是 SCM 几乎成为必需品的原因,SCM 工具通过将代码存储在存储库中,对代码进行版本控制,在项目成员之间进行协调来提供帮助。


实际上,有很多 SCM 工具,Git 是一个标准。强烈建议使用 Git,但如果愿意,还有其他开源可选:


NameLicense
GitGPLv2 & LGPL v2.1
SubversionApache 2.0
Concurrent Versions System (CVS)GNU
VestaLGPL
MercurialGNU GPL v2+


以下是添加 SCM 后 DevOps 管道的样子:



CI/CD 工具可以自动执行源代码迁入和迁出,执行跨成员协作任务。但是,如何将其变成一个有效的应用程序,以便数十亿人可以使用和欣赏呢?

第 3 步:自动化构建工具

开发者可以查看代码并将更改提交到源代码管理,然后邀请朋友进行源代码管理开发和协作。如果到目前还没有构建应用程序,要使其成为一款 Web 应用程序,必须进行编译并放入可部署的包或作为可执行文件运行。(请注意,像 JavaScript 或 PHP 这样的解释型语言不需要编译)


现在来看看自动化构建工具。无论决定使用哪种构建工具,都有一个共同目标:将源代码构建为某种所需格式,并自动执行任务来清理、编译、测试并部署到特定位置。构建工具将根据编程语言而有所不同,这里有一些常见的开源选项可以考虑:


NameLicenseProgramming Language
MavenApache 2.0Java
AntApache 2.0Java
GradleApache 2.0Java
BazelApache 2.0Java
MakeGNUN/A
GruntMITJavaScript
GulpMITJavaScript
BuildrApacheRuby
RakeMITRuby
A-A-PGNUPython
SConsMITPython
BitBakeGPLv2Python
CakeMITC#
ASDFExpat (MIT)LISP
CabalBSDHaskell


现在,可以将自动化构建工具的配置文件放入源代码管理,然后让 CI/CD 工具构建它:



一切都很好,对吧?但是,在哪里进行部署呢?

第 4 步:Web 应用程序服务器

到目前为止,开发者有一个可执行或可部署打包文件。对于任何真正有用的应用程序,必须提供某种服务或接口,但还需要一个容器来托管应用程序。


对于 web 应用程序,web 服务器就是这类容器。应用程序服务器提供了这样一个环境,可以检测可部署包内的编程逻辑、公开接口,通过 socket 向外部提供 web 服务。HTTP 服务器以及其他一些环境(如虚拟机)可以用来安装应用程序服务器。


有许多可用的开源 web 应用程序服务器:


NameLicenseProgramming Language
TomcatApache 2.0Java
JettyApache 2.0Java
WildFlyGNU Lesser PublicJava
GlassFishCDDL & GNU Less PublicJava
Django3-Clause BSDPython
TornadoApache 2.0Python
GunicornMITPython
Python PasteMITPython
RailsMITRuby
Node.jsMITJavascript


现在,DevOps Pipeline 基本可以使用:



虽然可以就此进行下一步集成,但代码质量对于应用程序开发人员来说是一件很重要的事情。

第 5 步:代码测试覆盖率

另一个繁琐的要求可能是实现代码测试,开发人员需要尽早捕获应用程序中的任何错误,提高代码质量以确保最终用户满意。幸运的是,有许多开源工具可用于测试代码并提出改进其质量的方法。更好的消息是,大多数 CI/CD 工具可以插入这些工具并将这个过程自动化。


代码测试分为两部分:协助编写、运行测试的代码测试框架,以及有助于提高代码质量的代码质量建议工具。


代码测试框架:


NameLicenseProgramming Language
JUnitEclipse Public LicenseJava
EasyMockApacheJava
MockitoMITJava
PowerMockApache 2.0Java
PytestMITPython
HypothesisMozillaPython
ToxMITPython


代码质量建议工具:


NameLicenseProgramming Language
CoberturaGNUJava
CodeCoverEclipse Public (EPL)Java
Coverage.pyApache 2.0Python
EmmaCommon Public LicenseJava
JaCoCoEclipse Public LicenseJava
HypothesisMozillaPython
ToxMITPython
JasmineMITJavaScript
KarmaMITJavaScript
MochaMITJavaScript
JestMITJavaScript


请注意,上面提到的大多数工具和框架都是针对 Java、Python 和 JavaScript 编写的,因为 C ++和 C#是专有编程语言(尽管 GCC 是开源的)。


现在已经实现了代码测试覆盖工具,DevOps Pipeline 应该类似于本教程开头所示的 DevOps Pipeline 图。

可选的步骤

容器

如上所述,可以在虚拟机或服务器上托管应用程序服务器,但容器是一种流行的解决方案。


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


虽然有多种容器可选择,但 Docker 和 Kubernetes 是最受欢迎的:


NameLicense
DockerApache 2.0
KubernetesApache 2.0

中间件自动化工具

DevOps Pipeline 主要侧重于协作构建和部署应用程序,还可以使用 DevOps 工具执行许多其他操作。其中之一是利用 Infrastructure as Code(IaC)工具,也称为中间件自动化工具。这些工具有助于自动化中间件软件的安装、管理和其他任务。例如,自动化工具可以通过正确的配置提取应用程序(如 Web 应用程序服务器、数据库和监视工具),并将它们部署到应用程序服务器。


以下是几个可以考虑的开源中间件自动化工具:


NameLicense
AnsibleGNU Public
SaltStackApache 2.0
ChefApache 2.0
PuppetApache或GPL


原文链接:A beginner’s guide to building DevOps pipelines with open source tools


2019-04-15 11:557379
用户头像

发布了 43 篇内容, 共 34.4 次阅读, 收获喜欢 136 次。

关注

评论

发布
暂无评论
发现更多内容

架构师第5周总结

老姜

联想来酷广谱化生存:后疫情时代的"硬核品牌"启示录

Geek_116789

啃碎并发(二):Java线程的生命周期

猿灯塔

用进废退,增加能力熟练度与经验值,让你的技能再次精进。

叶小鍵

数据分析师成长体系漫谈--数据埋点

analysis-lion

数据分析 数据采集 埋点

一次非常有意思的 SQL 优化经历: 从 30248.271s 到 0.001s

Java小咖秀

MySQL 面试 后端 经验分享 优化逻辑

Ceph数据恢复初探

焱融科技

焱融科技 文件存储 分布式存储 数据恢复 Ceph

架构师训练营第5周

大丁💸💵💴💶🚀🐟

架构师训练营第五周作业

一剑

springBoot集成rabbitmq并实现延时队列

生命在于折腾

RabbitMQ

【Python】__name__ 是什么?

Leetao

Python Python基础

很多人毕业多年以后,还是改不掉学生思维

小智

职场 思维方式 高考

这份高考卷,只有程序员能得满分...

程序员生活志

程序员 高考

小师妹学JVM之:cache line对代码性能的影响

程序那些事

JVM 小师妹 性能调优 cache line 签约计划第二季

Java 线程池中的线程复用是如何实现的?

武培轩

Java 程序员 后端 线程池 源码解析

第五周作业

Linuxer

极客大学架构师训练营

第 5 周作业:一致性 Hash 算法

姜 某某

一致性 hash 算法

Z冰红茶

一致性Hash算法

一致性hash的理解与实现

dongge

计算机操作系统基础(十四)---线程同步之条件变量

书旅

php laravel 操作系统 进程 线程’

女同事问哪吒什么是 Spring 循环依赖?我...

通天哪吒

超详细!一文带你了解 LVS 负载均衡集群!

JackTian

Linux 负载均衡 运维 LVS 服务器集群

「深度解析」AI训练之数据缓存

焱融科技

人工智能 AI 存储 焱融科技 数据缓存

week05 学习总结 分布式缓存&消息队列&负载

Z冰红茶

一致性哈希算法实现

老姜

架构师训练营第五周课后总结

Cloud.

啃碎并发(三):Java线程上下文切换

猿灯塔

架构师训练营 - 第 5 课总结 -20200704- 技术选型

👑👑merlan

负载均衡 缓存 分布式数据库 架构设计 消息队列

干货 | 如何评估Kubernetes持久化存储方案

焱融科技

Kubernetes 容器 云原生 k8s

游戏夜读 | 关卡设计的难点

game1night

SpringBoot 中使用 Filter 的正确姿势

Java课代表

使用开源工具构建DevOps Pipeline的初学者指南_服务革新_Bryant Son_InfoQ精选文章