0%

DevOps杂谈

卡农Canon——复调音乐的一种,原意为“规律”。一个声部的曲调自始至终追逐着另一声部,直到最后的一个小节,最后的一个和弦,融合在一起,给人以一个神圣的意境。卡农的所有声部虽然都模仿一个声部,但不同高度的声部依一定间隔进入,造成一种此起彼伏连绵不断的效果,轮唱也是一种卡农。在卡农中,最先出现的旋律是导句,以后模仿的是答句。卡农根据各声部高度不同的音程差,可分为同度卡农,五度卡农,四度卡农等;根据间隔的时间长短,可分为一小节卡农,两小节卡农等;此外还有伴奏卡农,转位卡农,逆行卡农,反行卡农等各种手法。

一、概念

      DevOps(Development和Operations的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。它是一种重视“软件开发人员(Dev)”和“IT运维技术人员(Ops)”之间沟通合作的文化、运动或惯例,透过自动化“软件交付”和“架构变更”的流程,来使得构建、测试、发布软件能够更加地快捷、频繁和可靠。它的出现是由于软件行业日益清晰地认识到:为了按时交付软件产品和服务,开发和运维工作必须紧密合作。

二、扩展

  1. 持续集成(Continuous Integration)

    • 定义:一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译、发布、自动化测试)来验证,从而尽早地发现集成错误。
    • 目标:让产品可以快速迭代,同时还能保持高质量。
    • 措施:代码集成到主干之前,必须通过自动化测试。只要有一个测试用例失败,就不能集成。
    • 条件
      • 全面的自动化测试,这是实践持续集成&持续部署的基础,同时,选择合适的自动化测试工具也极其重要
      • 灵活的基础设施,如使用容器,虚拟机的存在让开发人员和QA人员不必再大费周折
      • 版本控制工具,如 Git,CVS,SVN 等
      • 自动化的构建和软件发布流程的工具,如Jenkins,flow.ci等
      • 反馈机制,如构建/测试的失败,可以快速地反馈到相关负责人,以尽快解决达到一个更稳定的版本。
    • 优点
      • “快速失败”,在对产品没有风险的情况下进行测试,并快速响应
      • 最大限度地减少风险,降低修复错误代码的成本
      • 将重复性的手工流程自动化,让工程师更加专注于代码
      • 保持频繁部署,快速生成可部署的软件
      • 提高项目的能见度,方便团队成员了解项目的进度和成熟度
      • 增强开发人员对软件产品的信心,帮助建立更好的工程师文化
    • 两个好处
      • 快速发现错误。每完成一点更新就集成到主干,可以快速发现错误,定位错误也比较容易。
      • 防止分支大幅偏离主干。如果不是经常集成,主干又在不断更新,会导致以后集成的难度变大,甚至难以集成。
    • 如何选持续集成系统
      • 私有型:Self Hosted CI 指的是将软件部署在公司的机房或内网中,需要提供多台服务器来完成 CI 系统的运转,同时需要对不同机器之间进行环境配置。比如Maven 或 Gradle 或 Jenkins ,他们的特点是自由开源,且文档支持广泛。优点在于对构建环境有完全的控制权,能够实现完全定制。但需要搭建环境和配置、维护成本高,需要买专门的机器,花费较多人力物力且更新迁移风险高;
      • 托管型:Hosted CI 指的是由 SaaS 型的 CI 服务,全程在线进行构建配置,不需要考虑装机器,装软件,环境搭建等成本。常见的有 CircleCI,Codeship 和TravisCI 等,还有国内最新的持续集成服务——flow.ci 。SaaS 型的 CI 的特点在于无需额外机器,几分钟就可以用起来。可以根据你的需要动态调度资源。省时,省心,省力。
    • 流程
      • 提交:流程的第一步,是开发者向代码仓库提交代码。所有后面的步骤都始于本地代码的一次提交(commit)。
      • 第一轮测试:代码仓库对commit操作配置了钩子(hook),只要提交代码或者合并进主干,就会跑自动化测试。测试分为多种,如:
        • 单元测试:针对函数或模块的测试
        • 集成测试:针对整体产品的某个功能的测试,又称功能测试
        • 端对端测试:从用户界面直达数据库的全链路测试
      • 构建:通过第一轮测试,代码就可以合并进主干,就算可以交付了。交付后,就先进行构建(build),再进入第二轮测试。
        • 构建指的是将源码转换为可以运行的实际代码,比如安装依赖,配置各种资源(样式表、JS 脚本、图片)等等。常见工具:Jenkins、Travis、Codeship、Strider等
      • 第二轮测试:构建完成,就要进行第二轮测试。(如果第一轮已经涵盖了所有测试内容,第二轮可以省略,当然这时构建步骤也要移到第一轮测试前面)第二轮是全面测试,单元测试和集成测试都会跑,有条件的话,也要做端对端测试。所有测试以自动化为主,少数无法自动化的测试用例,就要人工跑。需要强调的是,新版本的每一个更新点都必须测试到。如果测试的覆盖率不高,进入后面的部署阶段后,很可能会出现严重的问题。
      • 部署:通过了第二轮测试,当前代码就是一个可以直接部署的版本。将这个版本的所有文件打包存档,发到生产服务器。生产服务器将打包文件解包成本地的一个目录,再将运行路径的符号链接指向这个目录,然后重新启动应用。这方面的部署工具有 Ansible,Chef,Puppet等。
      • 回滚:一旦当前版本发生问题,就要回滚到上一个版本的构建结果。最简单的做法就是修改一下符号链接,指向上一个版本的目录。
  2. 持续交付(Continuous Delivery)

    • 定义:在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境的类生产环境中。给测试人员或者用户,以供评审。如果评审通过代码没有问题,可以继续手动部署到生产环境中。
      • 持续交付优先于整个产品生命周期的软件部署,建立在高水平自动化持续集成之上。
    • 目标:持续交付用来确保让代码能够快速、安全的部署到生产环境中,它通过将每一次改动都提交到一个模拟生产环境中,使用严格的自动化测试,确保业务应用和服务能符合预期。
    • 好处
      • 快速发布,能够应对业务需求,并更快地实现软件价值
      • 编码->测试->上线->交付的频繁迭代周期缩短,同时获得迅速反馈
      • 高质量的软件发布标准。整个交付过程标准化、可重复、可靠
      • 整个交付过程进度可视化,方便团队人员了解项目成熟度
      • 更先进的团队协作方式,从需求分析、产品的用户体验到交互设计、开发、测试、运维等角色密切协作,相比于传统的瀑布式软件团队,更少浪费
  3. 持续部署(Continuous Deployment)

    • 定义:在持续交付的基础上,代码通过评审以后(或者是通过自动化测试以后),自动部署到生产环境。
      • 持续部署是持续交付的最高阶段
    • 目标:代码在任何时刻都是可部署的,可以进入生产阶段。
    • 好处:可以相对独立地部署新的功能,并能快速地收集真实用户的反馈。
    • 工具:jenkins+fastlane

      三、参考

  4. 参考一

  5. 参考二