宣布 dpl v2 开发者预览版发布

Travis CI
分享此内容
分享此内容

在过去的几个月里,我们一直在重写当前的代码库 dpl,我们的部署工具,并发布了新的主要版本:dpl v2。

几乎每一行代码都经过了修改,代码质量、测试覆盖率和测试质量都有了很大的提高,许多支持的服务提供商和志愿者贡献者也参与其中。我们很高兴看到这个庞大的社区努力改进和现代化 dpl,并为您提供最佳的部署体验。

这个工作的主要 pull request 的 diff 统计数据,可以大致了解其规模。

在这大约 16,000 行代码中,不到 7,000 行是实现代码,其余的是文档、测试等。

今天,我们发布了 dpl v2.0.0-alpha.1 作为开发者预览版,并希望您能试用它。

开发者预览版

您可以通过在您的 .travis.yml 文件中添加以下内容来选择加入。

deploy:
  - provider: [your-provider]
    edge: true
    ...

在我们可以发布稳定版本之前,此版本不会成为默认版本,但一如既往,我们非常感谢您的早期反馈。我们很乐意欢迎您加入 社区论坛,分享您的想法。

在此过程中,近 30 个 pull request 已经被移植并合并到新的代码库中。如果您有任何尚未解决的公开问题,请提醒我们。

Dpl 的新成熟度模型

我们为 dpl 提供商(每个服务“插件”)实施了一个成熟度模型,这将有助于我们以编程方式传达对提供商稳定性的预期,例如,在您的构建日志、我们的自述文件和命令行工具的帮助输出中(例如,如果在 Travis CI 之外使用)。

该模型包括 4 个级别

  • dev - 提供商处于开发阶段(初始级别)
  • alpha - 提供商已通过完整测试
  • beta - 提供商已处于 alpha 阶段至少一个月,并且已经观察到成功的真实世界生产部署
  • stable - 提供商已处于 beta 阶段至少两个月,并且没有开放的错误可以被归类为严重错误(例如部署失败、文档功能故障等)。

根据上述标准,大多数提供商目前都处于 alpha 阶段:它们是先前功能的完整测试移植,但我们尚未看到任何真实世界的生产部署。少数提供商处于 dev 阶段,因为我们需要端到端的集成测试,将其部署到相应服务。

您可以在自述文件中的 支持的提供商 下查看您喜欢的部署提供商。

以下是如何帮助我们推动工作进展

  • 如果您了解到提供商已作为您构建的一部分进行真实世界生产部署。我们将研究自动化此过程的方法,但目前,这将有助于我们将提供商从 alpha 阶段移出。
  • 如果您熟悉某个提供商,而它恰好是少数几个处于 dev 阶段的提供商之一。您可以帮助我们以自动化方式进行实际的测试部署。

请在 社区论坛 中告知我们。

重大变更

由于这是一个新的主要版本,它也是(相当罕见地)让我们纠正早期决策的机会,这些决策后来被证明并不那么好。

Dpl v2 包含两个重大变更,至少从技术角度来看是重大的。我们预计这不会真正影响许多部署,但有时事物可能表现略有不同,因此我们称它们为“重大变更”。

它们是

  • 如果您需要在构建后清理 Git 工作目录,请添加 cleanup: true
  • 如果您需要在使用 GitHub Pages 提供商时擦除 Git 历史记录,请添加 keep_history: false

清理 Git 工作目录

skip_cleanup 现在已弃用,cleanup 默认值为 false。默认值曾经是 true,因此您必须使用 skip_cleanup 选择退出...并且已经被 大量 使用。从任何剩余的构建工件中清理工作目录,只对少数提供商有意义,因此我们改变了此默认值。

如果您需要在构建后清理 Git 工作目录,您现在需要使用以下内容来选择加入

deploy:
  - provider: [your-provider]
    cleanup: true

使用 GitHub Pages 提供商保留 Git 历史记录

此外,对于 GitHub Pages 提供商,原始的默认行为是将新的孤儿分支 git push --force 到您的目标存储库和分支(例如 gh-pages),从而擦除该分支上的 Git 历史记录。

由于这通常不是期望的行为,因此后来添加了一个选项 keep_history,以避免破坏该默认行为。

我们借此机会改变了此默认值:提供商 pages 现在默认情况下将保留目标存储库和分支的现有历史记录。

如果您出于任何原因需要您的部署擦除该历史记录,从 dpl v2 开始,您将需要选择加入

deploy:
  - provider: pages
    keep_history: false

功能变更

我们重写代码的目标是保留现有功能,而不是改变它。但仍有一些值得一提的功能变更。

  • 在使用 dpl v2 时,部署失败现在始终会使构建失败。
  • npm 提供商现在支持指定自定义注册表,例如 MyGetGitHub
  • OpenShift 提供商已经过时一段时间了,现在已恢复。Open Shift 的 API 已经改变,我们已经与 OpenShift 团队合作,用全新的实现来替换它,该实现适用于 OpenShift v3。
  • 添加了一种新的策略,用于通过他们的新 HTTP API 部署到 GitHub Pages

部署失败现在始终会使构建失败

到目前为止,在使用某些提供商时,部署失败并不总是会使构建失败或出错。这意味着,如果您的部署失败,您可能不会收到通知。

从 dpl v2 开始,部署失败始终会使构建失败。

在少数几种情况下,您 确实 希望静默忽略部署失败,您可以使用以下命令选择退出使构建失败。

deploy
  - provider: [your-provider]
    allow_failure: true

维护 dpl 的乐趣和挑战

Dpl 是一个用 Ruby 编写的开源项目,始于 Travis CI 的早期阶段。它是社区驱动的,但由 Travis CI 开发人员维护,并且已被许多其他平台(例如 GitLab)改编和使用。

Dpl 支持 40(四十)个部署提供商,其中许多是我们是在过去的 6 年中您贡献时才了解到的。

所有这些累积的领域知识都物超所值。它使您能够部署到任何这些服务,而无需学习太多关于底层工具的信息,也无需经历在 Travis CI 上手动设置事物的麻烦。

Hiro 在处理这种持续涌入的知识和变化方面做出了出色的工作。我们喜欢将他的职位视为多年来一直坐在独角兽仙尘混乱的接收端。

但是,我们并非总是能够在保持代码质量高、测试一致性和完整性以及所有功能与相应服务的变化保持同步方面做得最好。

在多元化的社区环境中维护集中式代码非常有教育意义且有趣,但也可能具有挑战性。贡献有时来自不太熟悉 Ruby 的开发者,而且经常来自具有不同风格和方法的开发者。当然,如果它们能添加到现有功能或新功能中,我们仍然会接受它们。

我们经常会急于接受 pull request,而且并非总是能够抽出时间和资源来帮助重构、清理代码并消除一致性问题。

因此,我们决定是时候重写代码了。

技术亮点

由于这是宣布开发者预览版的公告,我们认为向您提供一些更详细的技术信息会很有趣。

我们重写代码的目标是保留现有功能,但提高代码质量、可维护性和一致性。

以下是简而言之的底层变化。

  • Dpl 现在使用丰富的 命令行解析器,该解析器提供了一个强大的 DSL 来指定选项,并生成美观的帮助输出(以 Rubygem 的帮助输出为模型)。
  • 使用此帮助输出自动生成自述文件,现在保证始终与工具实际接受的选项完全一致,无需人工监督或手动编辑。
  • 显式声明所有选项(如解析器所要求的)已发现代码使用的大约 25 个选项(总共约 300 个),这些选项在自述文件或文档中未提及。甚至有更多选项,我们的代码会接受并传递给底层库(例如 Octokit),而我们对此并不知情,代码也不会报错。
  • 统一、一致的代码风格,并且单个提供商类中的实现代码大大减少。丰富的 DSL 用于指定运行时要求、shell 命令、日志消息等,将 shell 命令和日志消息与实现分离。
  • 在单元测试中统一、一致的测试风格,尽可能在输入/输出接受级别进行测试,而不是使用大量存根和模拟来对单个方法进行单元测试。(此外,还为迄今为止尚未测试的提供商添加测试)。现在测试所有给定提供商支持的选项(到目前为止覆盖率相当不完整)。这样一来,单元测试的数量增加了一倍多。
  • 现在拥有三个不同的测试级别:使用 RSpec 的单元测试套件,几乎所有我们的工具都使用这种测试套件。一个运行时依赖项安装测试套件,它会练习安装通常在运行时安装的各种依赖项(例如 Ruby gem、Node.js、Python 或 Go 命令行工具等)。这些测试会在 Travis CI 上的第二个 构建阶段 运行。最后,一个端到端的集成测试套件,它实际上会将代码部署到几乎所有服务提供商,以确保我们的集成稳定,并且可以快速捕获对相应服务的任何重大变更(过去我们错过了一些变更)。这些测试会定期使用 cron 构建 运行。
  • 现有的传递上下文对象的理念现在通过拥有 Bash 上下文和测试上下文得到充分利用。这会阻止测试套件执行可能对开发机器造成破坏的 shell 命令(在所有地方安装东西、更改现有配置文件等)。
  • 大型的 Bash 命令(例如,用于通过 shell 脚本手动安装 CLI 工具)现在位于单独的文件(“assets”)中,由于适当的语法高亮显示等,使其更具可读性。(目前只有 4 个)。
  • 改变了我们处理运行时 Ruby gem 依赖关系的方式。所有代码现在都位于主 dpl gem 中,并且由给定提供者类所需的 Ruby gem 现在使用 Bundler 的 内联 策略在运行时(而不是加载时)安装和加载。这简化了很多事情,并且消除了我们构建子 gem 的需求,这是我们之前处理不同提供者实现需求之间的不兼容性的策略。
  • 这也使得能够再次在单个 Ruby 进程中运行所有单元测试,这极大地帮助了开发:Travis CI 上的测试运行时间从大约 10 分钟下降到不到 1 分钟(大部分时间花在安装 Ruby 和捆绑 gem 上,测试套件本身在约 15 秒内通过)。

所有这些都很棒,因为

要求指定所有选项使我们能够以编程方式了解我们实际支持的选项。这意味着我们现在可以自动生成 README,并自动验证 deploy 部分在 构建配置格式规范中,以及文档。

使用丰富的命令行解析器可以显着减少实现代码,并强制执行在处理未知选项、缺少选项、格式错误的值等方面的一致行为。

将 shell 命令和面向用户的日志消息与实现代码分离,可以实现一些小的改进。它可以轻松地概述给定提供者类使用的命令,比较消息并发现措辞中的不一致之处。它还使实现更加专注于逻辑,这有助于模式识别。

提供有意义的 DSL 意味着实现者不必过分担心我们的特定实现需求,而可以更多地关注他们需要提供的逻辑和行为。这对我们很重要,因为它在非常多样化且有些混乱的社区环境中强制执行一致性,从而通过强制执行标准来降低沟通的复杂性和工作量。(它还需要为贡献者提供更好的文档,我们希望通过投入大量工作来解决 README、 CONTRIBUTING 指南和 rubydocs。)

感谢我们出色的贡献者

我们想向那些投入时间和精力与我们一起改进 dpl 的人表示衷心的感谢。

衷心感谢

  • Ahmad Nassri (npm)
  • Alex Foran (Catalyze)
  • Alex Jurkiewicz
  • Alexander Borsuk
  • Andrew Z Allen
  • Ashen Gunaratne
  • Austin Siford
  • Ben Abrams
  • Ben Parees, Parag Dave, Chris Morgan (OpenShift)
  • Charles Milette
  • Christian Elsen, Vinicius Kiatkoski Neves (AWS)
  • Coury Richards
  • Darko Meszaros, Csaba Tamas, Sophia Kuhl (AWS)
  • Dennis Walters, Kevin Johnson, Daniel Valfre (Engine Yard)
  • Diego Búrigo Zacarão (Transifex)
  • Domenic Denicola
  • Dustin Ingram
  • Dwayne Forde
  • Étienne Michon (Scalingo)
  • Filip Š
  • Gershom B (Hackage)
  • Gil Tselenchuk, Vijay Sharma (TestFairy)
  • Jacek Juraszek
  • Jannis Leidel
  • Jeff Waugh
  • Jeffrey Yasskin
  • jgollhardt
  • Karol Danko
  • Karthik Balaji
  • kewubenduben
  • Kingdon Barrett, Anton O (Hephy)
  • Leo Unbekandt (Scalingo)
  • Loïc Albertin
  • Mads Marquart
  • Martin Junkern
  • Michael Francis
  • Nicco Kunzmann
  • Patrique Legault
  • Peter Newman
  • Radek Lisowski
  • Sarah Dayan
  • Simon Hengel
  • Sviatoslav Sydorenko
  • Szczepan Faber
  • Valeria Tran
  • Yoran Brondsema
© 版权所有 2024,保留所有权利
© 版权所有 2024,保留所有权利
© 版权所有 2024,保留所有权利