使用开源工具构建DevOps流水线的新手指南
发布于 2021-01-25 08:25
原作者:Bryant Son
来源(原文网址):https://opensource.com/article/19/4/devops-pipeline
译者:王伟,周一行
审校:陈文峰,余晓蒨
微信编辑:大眀
周一行
IT男一枚&研发&运维
中国DevOps社区志愿者
王伟
中国DevOps社区志愿者
1. 我的DevOps旅程
2. 对于DevOps和CI/CD流水线的简介
3. 第一步:CI/CD框架
4. 第二步:源代码控制管理
5. 第三步:构建自动化工具
6. 第四步:Web应用服务器
7. 第五步:代码测试覆盖率
7.1 代码测试框架
7.2 代码质量建议工具
8. 可选步骤
8.1 容器
8.2 中间件自动化工具
9. 还可以做些什么?
10. 关于作者
DevOps已经成为解决缓慢、筒仓式、难以协调的软件开发过程的默认解决方案。但当你刚接触DevOps并且不确定从哪里开始时,这并不意味着什么。本文探讨了什么是DevOps流水线,并提供了创建流水线的五步过程。虽然本教程不全面,但它应该为你开始和稍后的拓展学习奠定基础。但首先,从一个故事讲起。
我曾经在花旗集团的云团队工作,开发一个基础设施即服务(IaaS)的网站应用,用于管理花旗的云基础设施,但我致力于想办法提高开发流程的效率,并为开发团队带来积极的文化变革。我在格雷格·拉文德推荐的一本书中找到了我的答案,格雷格·拉文德是花旗云架构和基础设施工程的首席技术官,这本书的名字是《凤凰项目》(https://www.amazon.com/dp/B078Y98RG8/)。这本书读起来像一本小说,它在其中诠释了DevOps的原则。
公司 | 部署频率 |
Amazon | 23,000 次/天 |
5,500 次/天 | |
Netflix | 500 次/天 |
1 次/天 | |
3 次/周 | |
其他典型的公司 | 9个月1次 |
Amazon、Google、Netflix是怎么做到这样高的频率呢?这是因为这些公司已经明白如何构建一个近乎完美的DevOps流水线的方法。
在花旗实施DevOps之前,情况肯定不是现在这样。那时,我的团队有不同的分阶段的环境,但是部署到开发服务器是纯手工的。所有开发人员都只能访问一个基于IBM WebSphere Application Server Community Edition的开发服务器。问题是,每当多个用户试图同时进行部署时,服务器就会宕机,因此开发人员必须互相告知对方即将进行部署的信息,这是一个相当痛苦的问题。此外,还存在代码测试覆盖率低、手工部署过程繁琐、无法使用定义的任务或用户故事跟踪代码部署的问题。
我意识到必须要做些什么,于是我找到了一位有同样想法的同事。我们决定合作构建一个最初的DevOps流水线,他建立了一个虚拟机和一个Tomcat应用服务器,由我操作Jenkins与Atlassian Jira和BitBucket集成,以及负责代码测试覆盖率。这个在工作之余做的项目非常成功:我们几乎完全自动化了开发流水线,我们在开发服务器上实现了将近100%的正常运行时间,我们可以跟踪和提高代码测试覆盖率,以及Git分支可以与部署和Jira任务相关联。而且我们用来构建DevOps流水线的大多数工具是开源的。
我现在意识到我们的DevOps流水线是多么简陋,因为我们没有利用像Jenkins配置文件或Ansible这样的高级配置。然而,这个简单的过程运行得很好,可能是由于帕累托原理(https://en.wikipedia.org/wiki/Pareto_principle)(也称为80/20规则)。
如果你问几个人,什么是DevOps?你可能会得到几个不同的答案。DevOps和敏捷一样,已经发展到包含许多不同的学科,但大多数人会同意以下几点:DevOps是一种软件开发实践,或一个软件开发生命周期(SDLC),其核心原则是文化变革,开发人员和非开发人员都在这样一个环境中工作:以前的手工操作都被自动化了;每个人都做他们最擅长的;每个周期的部署数量增加;吞吐量增加;灵活性提高。
虽然拥有正确的软件工具并不是实现DevOps环境的唯一条件,但是有些工具是必需的。其中一个关键问题是持续集成和持续部署(CI/CD)。在这个流水线中,环境有不同的阶段(例如,DEV、INT、TST、QA、UAT、STG、PROD),手动操作被自动化,开发人员可以实现高质量的代码、灵活性和大量的部署。
本文描述了使用开源工具创建DevOps流水线的五步方法,如下图所示。
首先你需要的是一个CI/CD工具。Jenkins是一种基于MIT许可证开源的,基于Java的CI/CD工具,是在DevOps推进中流行的工具,并已成为事实上的标准的工具。
那么,Jenkins是什么?想象一下,它是一种神奇的通用遥控器,可以与许多不同的服务和工具通讯,并对它们进行编排。像Jenkins这样的CI/CD工具,单独看起来本身没用,但是当它插入到不同的工具和服务中时,它变得更加强大。
Jenkins只是您可以用来构建DevOps流水线的众多开源CI/CD工具之一。
名称 | 许可 协议 |
Jenkins (https://github.com/ jenkinsci/jenkins) | Creative Commons and MIT |
Travis CI (https://github.com/ travis-ci/travis-ci) | MIT |
CruiseControl (http://cruisecontrol .sourceforge.net) | BSD |
Buildbot (https://github.com/ buildbot/buildbot) | GPL |
Apache Gump (https://gump.apache.org) | Apache 2.0 |
Cabie (http://cabie.tigris.org) | GNU |
您有一个CI/CD工具在本地主机中运行,但目前没有太多可以做的事情。让我们遵循DevOps之旅的下一步。
验证CI/CD工具可以实现某些神奇效果的最佳(也可能是最简单的)方法是与源代码控制管理(SCM)工具集成。为什么你需要源代码控制?假设你正在开发一个应用程序。每当你构建一个应用程序时,你都在进行编程,无论你使用Java,Python,C++,Go,Ruby,JavaScript,还是任何其它编程语言。你编写的编程代码称为源代码。一开始,特别是当你独自工作时,将所有内容放在本地目录中可能是可以的。但是当项目变大并邀请其他人合作时,你需要一种方法来避免合并冲突,同时有效地共享代码修改。你还需要一种方法来恢复以前的版本,备份和复制粘贴的过程已经过时。你(和你的团队成员)想要更好的工具。
这是SCM几乎成为必需品的原因。SCM工具有助于将你的代码存储在存储库中,为代码做版本控制,以及在项目成员之间的协调。
虽然有许多SCM工具,但Git是标准的配置管理工具。我强烈建议使用Git,但如果你愿意,也可使用其他开源选项。
名称 | 许可 协议 |
Git (https://git-scm.com) | GPLv2 & LGPL v2.1 |
Subversion (https://subversion.apache.org) | Apache 2.0 |
Concurrent Versions System (http://savannah.nongnu.org /projects/cvs) (CVS) | |
Vesta (http://www.vestasys.org) | LGPL |
Mercurial (https://www.mercurial-scm.org) | GNU GPL v2+ |
CI/CD工具可以自动化检入和检出源代码的任务,以及跨成员协作的任务。看起来不错吧?但是,如何才能把它变成一个可以使用的应用程序,让数十亿人可以使用和欣赏它?
好的!你可以检出代码并将更改提交给源代码控制,你可以邀请你的朋友在源代码控制上进行协作开发。但你还没有构建一个应用程序。要使其成为一个web应用程序,必须将代码编译并放入可部署的包格式,或作为可执行文件运行。(请注意,不需要编译JavaScript或PHP等解释性编程语言。)
进入构建自动化工具。无论您决定使用哪种构建工具,所有构建自动化工具都有一个共同的目标:将源代码构建为某种所需格式,并自动完成清理、编译、测试和部署到某个特定位置的任务。构建工具将根据您的编程语言而有所不同,但这里有一些常见的开源选项供选择。
名称 | 许可 协议 | 编程 语言 |
Maven (https://maven.apache.org) | Apache 2.0 | Java |
Ant (https://ant.apache.org) | Apache 2.0 | Java |
Gradle (https://gradle.org/) | Apache 2.0 | Java |
Bazel (https://bazel.build) | Apache 2.0 | Java |
Make (https://www.gnu.org/software /make) | GNU | N/A |
Grunt (https://gruntjs.com) | MIT | JavaScript |
Gulp (https://gulpjs.com) | MIT | JavaScript |
Buildr (http://buildr.apache.org) | Apache | Ruby |
Rake (https://github.com/ruby/rake) | MIT | Ruby |
A-A-P (http://www.a-a-p.org) | GNU | Python |
SCons (https://www.scons.org) | MIT | Python |
BitBake (https://www.yoctoproject. org/software- item/bitbake) | GPLv2 | Python |
Cake (https://github.com/cake-build/ cake) | MIT | C# |
ASDF (https://common-lisp.net/ project/asdf) | Expat (MIT) | LISP |
Cabal (https://www.haskell.org/cabal) | BSD | Haskell |
一切都很好,对吗?但是你要在哪里部署打包文件呢?
到目前为止,您已经有了一个可以执行或可部署的打包文件。要使任何应用程序真正有用,应用程序必须提供某种服务或接口,但您需要一个容器来承载这个应用程序。
对于一个web应用程序,这个web应用程序服务器就是那个容器。应用服务器提供了一个环境,在这个环境中,可以检测可部署包中的编程逻辑,渲染界面,并通过向外部开放套接字来提供web服务。您需要一个HTTP服务器和一些其他环境(如虚拟机)来安装应用服务器。现在,让我们假设您将在这个过程中了解这一点(尽管我将在下面讨论容器)。
有许多开源web应用服务器可用。
名称 | 许可 协议 | 编程 语言 |
Tomcat (https://tomcat.apache.org) | Apache 2.0 | Java |
Jetty (https://www.eclipse.org/ jetty/) | Apache 2.0 | Java |
WildFly (http://wildfly.org) | GNU Lesser Public | Java |
GlassFish (https://javaee.github. io/glassfish) | CDDL& GNU Less Public | Java |
Django (https://www.djangoproject. com/) | 3-Clause BSD | Python |
Tornado (http://www.tornadoweb.org/ en/stable) | Apache 2.0 | Python |
Gunicorn (https://gunicorn.org) | MIT | Python |
Python Paste (https://github.com/ cdent/paste) | MIT | Python |
Rails (https://rubyonrails.org) | MIT | Ruby |
Node.js (https://nodejs.org/en) | MIT | Javascript |
虽然可以停下来,自己做集成,但对于一个应用开发工程师来说,代码质量是非常重要的,这是必须要考虑的一件事。
实现代码测试部件,是另外一个难处理的需求,但是开发工程师需要在早期捕捉应用中的错误并提高代码质量,使最终用户感到满意。幸运的是,有很多开源工具可以测试你的代码,并提供改进质量的建议。更好的是,很多CI/CD工具可以嵌入这些工具,并自动化这些流程。
代码测试有两部分:代码测试框架可以帮助编写和运行测试,代码质量建议工具可以帮助改进代码质量。
代码测试框架
名称 | 许可 协议 | 编程 语言 |
JUnit (https://junit.org/junit5) | Eclipse Public License | Java |
EasyMock (http://easymock.org) | Apache | Java |
Mockito (https://site.mockito.org) | MIT | Java |
PowerMock (https://github.com/ powermock/powermock) | Apache 2.0 | Java |
Pytest (https://docs.pytest.org) | MIT | Python |
Hypothesis (https://hypothesis.works) | Mozilla | Python |
Tox (https://github.com/ tox-dev/tox) | MIT | Python |
代码质量建议工具
名称 | 许可 协议 | 编程 语言 |
Cobertura (http://cobertura.github.io /cobertura) | GNU | Java |
CodeCover (http://codecover.org/) | Eclipse Public (EPL) | Java |
Coverage.py (https://github.com/nedbat /coveragepy) | Apache 2.0 | Python |
Emma (http://emma.sourceforge.net) | Common Public License | Java |
JaCoCo (https://github.com/jacoco/ jacoco) | Eclipse Public License | Java |
Hypothesis (https://hypothesis.works) | Mozilla | Python |
Tox (https://github.com/ tox-dev/tox) | MIT | Python |
Jasmine (https://jasmine.github.io) | MIT | JavaScript |
Karma (https://github.com/ karma- runner/karma) | MIT | JavaScript |
Mocha (https://github.com/ mochajs/mocha) | MIT | JavaScript |
Jest (https://jestjs.io) | MIT | JavaScript |
注意上面提到的工具和框架,大部分都是用Java, Python和JavaScript写的,因为C++和C#是专有的编程语言(尽管GCC是开源的)。
现在你已经应用了代码测试覆盖率工具,你的DevOps流水线应该与本教程开头所示的DevOps流水线类似。
容器
正如我前面提到的,你可以将你的应用服务器部署在虚拟机上或者某个固定的物理机器上,但是容器是一个非常流行的解决方案。
什么是容器(https://opensource.com/resources/what-are-linux-containers)?简单的解释是: 虚拟机(VM)需要操作系统的巨大空间,这使得应用程序的大小不堪重负,而容器只需要一些库和配置来运行应用程序。显然,VM仍然有重要的用途,但是容器是承载应用程序和应用程序服务器的轻量级解决方案。
虽然容器还有其他选择,但Docker和Kubernetes是最受欢迎的。
名称 | 许可协议 |
Docker (https://www.docker.com) | Apache 2.0 |
Kubernetes (https://kubernetes.io) | Apache 2.0 |
要了解更多,请查看其他Opensource.com网站(http://opensource.com/)关于Docker和Kubernetes的文章:
什么是Docker?
(https://opensource.com/resources/what-docker)
Docker介绍
(https://opensource.com/business/15/1/introduction-docker)
什么是Kubernetes?
(https://opensource.com/resources/what-is-kubernetes)
从0到Kubernetes
(https://opensource.com/article/17/11/kubernetes-lightning-talk)
我们的DevOps流水线主要致力于协同构建和部署应用程序,但是,使用DevOps工具还可以做很多其他事情。其中之一是利用基础设施即代码(IaC)工具,也称为中间件自动化工具。这些工具有助于自动化中间件软件的安装、管理和其他任务。例如,自动化工具可以使用正确的配置拉取应用程序,如web应用程序服务器、数据库,以及监控工具,并将其部署到应用服务器。
这里有几个开源中间件自动化工具可以考虑:
名称 | 许可协议 |
Ansible (https://www.ansible.com) | GNU Public |
SaltStack (https://www.saltstack.com) | Apache 2.0 |
Chef (https://www.chef.io) | Apache 2.0 |
Puppet (https://puppet.com) | Apache or GPL |
有关中间件自动化工具的更多信息,请查看其他Opensource.com网站(http://opensource.com/)的文章:
Ansible 快速入门指南
(https://opensource.com/article/19/2/quickstart-guide-ansible)
利用Ansible实现部署策略的自动化
(https://opensource.com/article/19/1/automating-deployment-strategies-ansible)
五大配置管理工具
(https://opensource.com/article/18/12/configuration-management-tools)
这只是一个完整的DevOps流水线的冰山一角。从一个CI/CD工具开始,探索您还可以自动化哪些来简化团队的工作。此外,还可以研究帮助您的团队更好地协同工作的开源通信工具
(https://opensource.com/alternatives/slack)。
为了更深入地了解DevOps,以下是一些非常好的介绍性文章:
什么是DevOps?
(https://opensource.com/resources/devops)
成为devops工程师需要掌握的5件事
(https://opensource.com/article/19/2/master-devops-engineer)
DevOps适合所有人
(https://opensource.com/article/18/11/how-non-engineer-got-devops)
DevOps中的预测分析入门
(https://opensource.com/article/19/1/getting-started-predictive-analytics-devops)
将DevOps与开源敏捷工具集成也是一个好主意
什么是Agile?
(https://opensource.com/article/18/10/what-agile)
成为一名出色的敏捷开发人员的4个步骤
(https://opensource.com/article/19/2/steps-agile-developer)
关于作者
Bryant Son——Bryant Jimin Son是红帽公司的高级顾问,这是一家以Linux服务器和开源贡献著称的技术公司。在工作中,他致力于为客户构建技术,利用诸如BPM、PAM、Openshift、Ansible等红帽技术栈,以及使用Java、Spring Framework、AngularJS、Material design进行全栈开发。在加入红帽之前,Bryant曾在花旗集团的花旗云团队工作,负责构建私有基础设施即服务(IaaS)云平台。
- End -
猜你喜欢
拓展阅读
本文来自网络或网友投稿,如有侵犯您的权益,请发邮件至:aisoutu@outlook.com 我们将第一时间删除。
相关素材