软件工程方法之DevOps

我们经常看到DevOps这个词,那么DevOps究竟是什么呢?DevOps 是一种软件开发方法。它将持续开发、持续测试、持续集成、持续部署和持续监控贯穿于软件开发的整个生命周期。当前几乎所有的顶尖公司均采用了该方法,用以提高软件开发质量,并缩短软件开发生命周期。从而以达到每个公司对软件产品的期望,交付出客户最满意的产品。

什么是瀑布模型

在了解DevOps之前,我们先看一下什么是瀑布模型,瀑布模型是将软件生命周期的各项活动规定为按固定顺序而连接的若干阶段工作,形如瀑布流水,最终得到软件产品。 其过程是将上一项活动的输出作为该项活动的输入,利用这一输入实施该项活动应完成的内容,然后对当前活动的工作结果进行验证,如果验证通过,则该结果作为下一项活动的输入,继续进行下一项活动,否则返回修改。

mark

传统的瀑布模型过于理想化,早期的错误只有等到开发后期才能发现,进而带来严重的后果。为尽早发现错误,在瀑布模型中加入迭代过程。当后面阶段发现前面阶段的错误时,需要沿图中左侧的反馈线返回前面的阶段,修正前面阶段的产品之后再回来继续完成后面阶段的任务。

mark

由此可见,传统的瀑布模型的缺点是非常明显的,而且从总体上来看,瀑布模型的项目整体进度是比较慢的,那么现在被大多数公司采用的则是DevOps。

什么是敏捷开发

敏捷开发是一种价值观与原则,指导我们更加高效的开发。

敏捷开发以用户需求为核心,采用迭代(时间周期)、增量(循序渐进,功能模块) 的方式开发软件,目的在于快速覆盖、响应市场需求。大项目划分为小项目,分别完成,独立运行,如微服务开发过程,就是将系统独立进行开发。传统的开发模式,注重文档约束,而敏捷开发原则的推行原则要求团队内部交流便利、文化相对开发,除去必要的文档约束,如Api接口文档,最注重的是团队成员的高效交流,以此来提高产品、项目的开发效率、开发质量。

敏捷开发提倡用户参与到产品或项目开发的整个流程当中,通过用户反馈使得产品更加符合用户频繁变动的需求。

mark

持续集成 / 持续交付 / 持续部署

在当前 DevOps 的趋势下,持续集成(CI)和持续部署(CD)具有支柱性地位,持续集成就是不断的尝试在一起。能够成功搭建 CI/CD 流水线就至关重要了。为了在开发团队和运营团队之间搭建桥梁,CI/CD 流水线实现了应用程序的自动构建、自动测试和自动部署,那我们接下来看看什么是 CI/CD 流水线,以及它是如何工作的。

mark

CI代表持续集成(Continuous Integration),CD代表持续交付(Continuous Delivery)和持续部署(Continuous Deployment)。也可以将它们看作是类似于软件开发生命周期的过程。

mark

该流水线展示了一个软件在其最终交付给客户或者投入上线之前,它在其生命周期内各个阶段中的移动过程。 其实就是版本控制 -> 构建 -> 测试 -> 部署 -> 自动化测试 -> 部署上线 -> 验证测试的这样的一个流程。假设我们要构建一款Web应用程序,并将它部署在一个现场Web服务器上。假设现在开发团队已经将代码提交到版本控制系统中了(假设版本控制工具为Git)。

构建阶段

在此之前,开发者已经将他们的代码加上合适的标签,并提交到版本控制系统中了。假如我们采用的是Java语言,那么还需要先进行代码编译。因此,代码在通过版本控制阶段之后,会先在构建阶段予以编译。该阶段会从代码库的各个分支中获取到所有的功能代码,合并后最终通过一个编译器来编译它们。这整个过程都被称为构建阶段。

mark

测试阶段

构建阶段结束后,将会继续进入到代码的测试阶段。在这个阶段中,我们会进行各种各样的测试,单元测试就是其中之一。在该阶段中,会测试代码中多个组件间的关系或者单个组件的功能,同时也会进行软件的可用性测试。

mark

部署阶段

测试阶段完成后,就要进入部署阶段了。在该阶段,代码将会被部署到准生产环境服务器或者测试环境服务器中。同时在该阶段中,我们既可以查看程序代码,也可以在模拟器中运行该应用程序。

mark

自动测试阶段

只要我们的代码部署成功,我们就可以运行另一组可用性测试了。该阶段结束后,如果所有的测试都通过了,那么就可以将其部署到生产环境中了。

mark

部署上线阶段

可能在每一个阶段的执行过程中遇到一些错误。在这种情况下,可以将错误邮件发回到开发团队中,以便他们能够及时修复这些错误。当开发团队修复完成后,就可以将代码重新提交到版本控制系统中,然后再次从头开始执行该流水线。如果在执行测试的过程中遇到了任何错误,那么这些错误也将反馈给开发团队,等他们修复完成后,同样会再次触发该流水线,进行新一轮的持续迭代。

mark

验证阶段

整个生命周期将会继续迭代下去,直到我们得到可以直接部署到生产环境中的代码或者产品。除此之外,在生产环境中我们还需要对代码进行度量和验证,以实时监控应用的线上运行状态。到目前为止,我们已经了解了 CI/CD 流水线及其工作原理。

mark

流程总结

为什么需要一个统一的代码仓库Git来做代码管理呢?是为了代码集成在一起。

为什么需要进行构建build呢?就是代码逻辑需要集成在一起,编译不出错。

为什么要单元测试呢?一个模块的功能集成在一起能够正确工作。

为什么需要联调预上线(准生产)环境呢?需要将不同模块之间集成在一起,在一个类生产的环境中进行测试。

最终才是部署到生产环境中,将所有人分开做的工作才算真正的合在了一起。

什么是DevOps

关于敏捷开发是什么我在上面已经说到了,敏捷开发就是一种开发流程,是一种快速迭代的开发流程,每个开发流程非常短,长到一个月,短到两个星期,就会是一个周期,在这个周期中,每天都要开会同步,每天都要集成。正是因为周期短,才需要持续的做这件事情,如果一个开发周期长达几个月,则不需要持续的集成,最后留几个星期的集成时间一起做也是可以的,但是这样就不能达到互联网公司的快速迭代,也是我们常常看到传统公司的做法。

DevOps不仅仅是CI/CD,除了技术和流程,还包含文化。例如容器化带来的一个巨大的转变是,原来只有运维关心环境的部署,无论是测试环境,还是生产环境,都是运维搞定的,而容器化之后,需要开发自己写Dockerfile,自己关心环境的部署。因为微服务之后,模块太多了,让少数的运维能够很好的管理所有的服务,压力大,易出错,然而开发往往分成很多的团队,每个模块自己关心自己的部署,则不易出错,这就需要运维一部分的工作让研发来做,需要研发和运维的打通,如果公司没有这个文化,研发不写Dockerfile,则DevOps是无法实施的。

mark

参考资料: 《How to build CI/CD pipeline from scratch》