Ansible 开发周期

Ansible 开发人员(包括社区贡献者)在许多不同的存储库中添加新功能、修复错误和更新代码。ansible/ansible 存储库包含基本功能和函数的代码,例如将模块代码复制到受管节点。此代码也称为 ansible-core。其他存储库包含使 Ansible 能够执行特定任务的插件和模块,例如向特定数据库添加用户或配置特定网络设备。这些存储库包含集合的源代码。

ansible-core 上的开发在两个级别上进行。在宏观层面,ansible-core 开发人员和维护人员规划发布,并通过路线图和项目跟踪进度。在微观层面,每个 PR 都有自己的生命周期。

集合的开发也在宏观和微观层面进行。每个集合都有自己的宏观开发周期。有关集合开发周期的更多信息,请参阅为 Ansible 维护的集合做贡献。PR 的微观层面生命周期在集合和 ansible-core 中是相似的。

宏观开发:ansible-core 路线图、发布和项目

如果您想关注有关将添加到即将发布的 ansible-core 的功能以及正在修复的错误的讨论,您可以查看以下资源

微观开发:PR 的生命周期

如果您想贡献功能或修复 ansible-core 或集合中的错误,您必须打开一个**拉取请求**(简称“PR”)。GitHub 提供了有关拉取请求过程如何运作的总体概述。任何拉取请求的最终目标是获得合并并成为集合或 ansible-core 的一部分。以下是 PR 生命周期概述

  • 贡献者打开一个 PR(始终针对 devel 分支)

  • ansible-core 使用Ansibot来分类 PR。一些集合存储库使用Ansibullbot来分类 PR。对于大多数集合,这是手动完成的或其他方式完成的。

  • Azure Pipelines 运行测试套件

  • 开发人员、维护人员、社区审查 PR

  • 贡献者解决来自审查人员的任何反馈

  • 开发人员、维护人员、社区重新审查

  • PR 合并或关闭

  • PR 回溯到一个或多个 stable-X.Y 分支(可选,仅限错误修复)

使您的 PR 值得合并

我们不会合并每个 PR。以下是一些使您的 PR 有用、有吸引力和值得合并的提示。

创建变更日志片段

变更日志帮助用户和开发人员及时了解 ansible-core 和 Ansible 集合的变化。Ansible 和许多集合从片段为每次发布构建变更日志。对于使用此模型的 ansible-core 和集合,您**必须**向任何更改功能或修复错误的 PR 添加变更日志片段。

您不需要为以下 PR 提供变更日志片段

  • 添加新的模块和插件,因为 Ansible 工具会自动执行此操作;

  • 仅包含文档更改。

注意

某些集合要求每个拉取请求都有一个变更日志片段。它们使用 trivial: 部分来处理上面提到的在构建发布变更日志时将被跳过的条目。

更准确地说

  • 每个错误修复 PR 都必须有一个变更日志片段。唯一的例外是修复尚未包含在发布中的更改。

  • 每个功能 PR 都必须有一个变更日志片段。

  • 新的模块和插件(包括 jinja2 过滤器和测试插件)必须在其文档中正确设置 version_added 条目,并且不需要变更日志片段。该工具通过它们的 version_added 值检测新的模块和插件,并在下一次发布的变更日志中自动宣布它们。

我们为次要版本以及主要版本构建简短的摘要变更日志。如果您回溯错误修复,请将变更日志片段与回溯 PR 一起包含。

创建变更日志片段

基本的变更日志片段是一个放置在 changelogs/fragments/ 目录中的 .yaml.yml 文件。每个文件都包含一个 yaml 字典,其中包含诸如 bugfixesmajor_changes 之类的键,后跟 bugfixes 或功能变更日志条目的列表。每个变更日志条目都嵌入在 yaml 文件中的 rst 中,这意味着某些构造需要转义,以便它们可以由 rst 解释,而不是由 yaml 解释(或者如果您喜欢,可以为 yaml 和 rst 转义)。每个 PR **必须**使用一个新的片段文件,而不是添加到现有的片段文件中,这样我们就可以将更改追溯到引入它的 PR。

添加新模块或插件的 PR 不一定需要变更日志片段。请参阅上一节创建变更日志片段。另请参阅下一节变更日志片段条目格式,了解变更日志片段应具有的精确格式。

要创建变更日志条目,请在相应存储库的 changelogs/fragments/ 目录中创建一个具有唯一名称的新文件。文件名应包括 PR 编号和更改的描述。它必须以文件扩展名 .yaml.yml 结尾。例如:40696-user-backup-shadow-file.yaml

单个变更日志片段可能包含多个部分,但大多数只会包含一个部分。顶级键(bugfixes、major_changes 等)在我们的配置文件中定义,用于我们的发布说明工具。以下是有效的部分以及每个部分的描述

breaking_changes

必须包含会破坏现有 playbook 或角色的更改。 这包括任何强制用户更新任务的现有行为的更改。 破坏性更改意味着用户在更新时必须进行更改。 破坏性更改必须仅在集合的主要版本中发生。 使用现在时书写,并清楚地描述最终用户现在必须遵循的新行为。 将显示在更改日志和 移植指南 中。

breaking_changes:
  - ansible-test - automatic installation of requirements for cloud test plugins no longer occurs. The affected test plugins are ``aws``, ``azure``, ``cs``, ``hcloud``, ``nios``, ``opennebula``, ``openshift`` and ``vcenter``. Collections should instead use one of the supported integration test requirements files, such as the ``tests/integration/requirements.txt`` file (https://github.com/ansible/ansible/pull/75605).
major_changes

对 ansible-core 或集合的重大更改。 不应包含单独的模块或插件更改。 必须包含影响集合全部或大部分的非破坏性更改(例如,更新以支持集合中的新 SDK 版本)。 重大更改意味着用户可以选择在更新时进行更改,但不是必须的。 可用于宣布未来版本中即将到来的重要 EOL 或破坏性更改(理想情况下提前 6 个月,如果已知。请参阅 此示例)。 使用现在时书写并描述新增内容。 可选地,包括一个“以前...”的句子,以帮助用户识别旧行为现在应该更改的位置。 将显示在更改日志和 移植指南 中。

major_changes:
  - ansible-test - all cloud plugins which use containers can now be used with all POSIX and Windows hosts. Previously the plugins did not work with Windows at all, and support for hosts created with the ``--remote`` option was inconsistent (https://github.com/ansible/ansible/pull/74216).
minor_changes

对 ansible-core、模块或插件的次要更改。 这包括添加到模块的新参数,或对现有参数的非破坏性行为更改,例如向 choices[] 添加附加值。次要更改是增强功能,而不是错误修复。 使用现在时书写。

minor_changes:
  - lineinfile - add warning when using an empty regexp (https://github.com/ansible/ansible/issues/29443).
deprecated_features

已弃用并计划在未来版本中删除的功能。 使用过去时,并在可用时提供替代方案,以替代正在弃用的功能。 将显示在更改日志和 移植指南 中。

deprecated_features:
  - include action - is deprecated in favor of ``include_tasks``, ``import_tasks`` and ``import_playbook`` (https://github.com/ansible/ansible/pull/71262).
removed_features

以前已弃用且现在已删除的功能。 使用过去时,并在可用时提供替代方案,以替代正在弃用的功能。 将显示在更改日志和 移植指南 中。

removed_features:
  - _get_item() alias - removed from callback plugin base class which had been deprecated in favor of ``_get_item_label()`` (https://github.com/ansible/ansible/pull/70233).
security_fixes

解决 CVE 或解决安全问题的修复。 必须对任何 CVE 使用 security_fixes。 使用现在时。 包括指向 CVE 信息的链接。

security_fixes:
  - set_options -do not include params in exception when a call to ``set_options`` fails. Additionally, block the exception that is returned from being displayed to stdout. (CVE-2021-3620).
bugfixes

解决问题的修复。 不应用于次要增强功能(请改用 minor_change)。 使用过去时描述问题,使用现在时描述修复。

bugfixes:
  - ansible_play_batch - variable included unreachable hosts. Fix now saves unreachable hosts between plays by adding them to the PlayIterator's ``_play._removed_hosts`` (https://github.com/ansible/ansible/issues/66945).
known_issues

当前未修复或将不会修复的已知问题。 使用现在时,并在可用时使用祈使语气进行解决方法。

known_issues:
  - ansible-test - tab completion anywhere other than the end of the command with the new composite options provides incorrect results (https://github.com/kislyuk/argcomplete/issues/351).

每个更改日志条目都必须包含指向其问题(括号内)的链接。 如果没有相应的问题,则该条目必须包含指向 PR 本身的链接。

大多数更改日志条目都是 bugfixesminor_changes。 更改日志工具还支持 trivial,这些条目不会列在实际的更改日志输出中,但会被每个 PR 都需要更改日志片段的集合存储库使用。

更改日志片段条目格式

编写更改日志条目时,请使用以下格式

- scope - description starting with a lowercase letter and ending with a period at the very end. Multiple sentences are allowed (https://github.com/reference/to/an/issue or, if there is no issue, reference to a pull request itself).

范围通常是模块或插件名称或一组模块或插件,例如,lookup plugins。 虽然可以直接(并且应该)提及模块名称(foo_module),但插件名称后应始终跟上类型(foo inventory plugin)。

对于并非真正限定范围的更改(例如,影响整个集合的更改),请使用以下格式

- Description starting with an uppercase letter and ending with a dot at the very end. Multiple sentences are allowed (https://github.com/reference/to/an/issue or, if there is no issue, reference to a pull request itself).

以下是一些示例

bugfixes:
  - apt_repository - fix crash caused by ``cache.update()`` raising an ``IOError``
    due to a timeout in ``apt update`` (https://github.com/ansible/ansible/issues/51995).
minor_changes:
  - lineinfile - add warning when using an empty regexp (https://github.com/ansible/ansible/issues/29443).
bugfixes:
  - copy - the module was attempting to change the mode of files for
    remote_src=True even if mode was not set as a parameter.  This failed on
    filesystems which do not have permission bits (https://github.com/ansible/ansible/issues/29444).

您可以在 2.18 版本的 更改日志目录中找到更多示例更改日志片段。

在为您的 PR 编写更改日志片段后,请提交该文件并将其包含在 pull 请求中。

新 playbook 的更改日志片段条目格式

虽然新模块、插件和角色会自动在生成的更改日志中提及,但 playbook 不会。 要确保它们被提及,需要使用特定格式的更改日志片段

# A new playbook:
add object.playbook:
  - # This should be the short (non-FQCN) name of the playbook.
    name: wipe_server
    # The description should be in the same format as short_description for
    # plugins and modules: it should start with an upper-case letter and
    # not have a period at the end.
    description: Wipes a server

ansible-core 中反向移植合并的 PR

所有 ansible-core PR 必须首先合并到 devel 分支。 在 pull 请求被接受并合并到 devel 分支后,以下说明将帮助您创建 pull 请求以将更改反向移植到之前的稳定分支。

我们反向移植功能。

注意

这些说明假设

  • stable-2.18 是反向移植的目标发布分支

  • https://github.com/ansible/ansible.git 被配置为名为 upstreamgit remote。 如果您不使用名为 upstreamgit remote,请相应地调整说明。

  • https://github.com/<yourgithubaccount>/ansible.git 被配置为名为 origingit remote。 如果您不使用名为 origingit remote,请相应地调整说明。

  1. 准备您的 devel、stable 和 feature 分支

git fetch upstream
git checkout -b backport/2.18/[PR_NUMBER_FROM_DEVEL] upstream/stable-2.18
  1. 将 devel 分支中的相关提交 SHA 代码 cherry pick 到您的 feature 分支中,并根据需要处理合并冲突

git cherry-pick -x [SHA_FROM_DEVEL]
  1. 为更改添加一个 更改日志片段,并提交它。

  2. 将您的 feature 分支推送到您在 GitHub 上的 fork

git push origin backport/2.18/[PR_NUMBER_FROM_DEVEL]
  1. 针对 stable-2.18 分支提交 backport/2.18/[PR_NUMBER_FROM_DEVEL] 的 pull 请求

  2. 发布管理器将决定是否在下一个次要版本之前合并反向移植 PR。 没有必要跟进。 只需确保自动化测试 (CI) 为绿色即可。

注意

分支名称 backport/2.18/[PR_NUMBER_FROM_DEVEL] 有点随意,但传达了分支目的的含义。 此分支名称格式不是必需的,但它可能很有帮助,尤其是在为多个稳定分支进行多个反向移植 PR 时。

注意

如果您愿意,可以使用 CPython 的 cherry-picker 工具(pip install --user 'cherry-picker >= 1.3.2')将提交从 devel 反向移植到 Ansible 的稳定分支。 请查看 cherry-picker 文档,了解有关安装、配置和使用的详细信息。