Fuel/Library 和上游模块
Fuel Library 和上游模块
fuel-library 项目利用上游 puppet 模块作为依赖项,为 Fuel 安装的软件提供配置管理。为了更紧密地与上游 OpenStack puppet 社区和其他当前正在使用的开源 puppet 模块保持一致,我们决定利用 librarian-puppet-simple 来管理将上游模块包含到 fuel-library 中,用于测试和构建 fuel-library 包。这项工作是在 fuel-puppet-librarian 蓝图下添加的。
选择利用 Puppetfile 和 librarian-puppet-simple 来管理上游模块的包含,我们特别要求在 Puppetfile 中仅使用 *标签*,以便将我们固定到上游模块的特定版本。这确保了我们仅包含给定 Puppetfile 版本中固定的版本。对 Puppetfile 的所有更改都将触发 Fuel CI 测试模块的上游版本,以确保我们在从一个版本升级到下一个版本时不会破坏任何内容(例如 1.1.0 -> 1.1.1)。
librarian-puppet-simple 集成
作为 fuel-library 代码库的一部分,我们添加了一个 Puppetfile,它将用于指定包含上游 puppet 模块。有关所做的集成 librarian-puppet-simple 的具体更改,请参阅变更 I5e628f159d2d11121af741bcc1218f292cd2b96e。Librarian-puppet-simple 仅支持 git 引用,并且不执行任何依赖关系解析。因此,包含或更新模块的开发人员负责确保正确捕获所有依赖项。Librarian-puppet-simple 将在 noop 测试运行期间以及作为 fuel-library 包构建过程的一部分,用于下载我们部署所需的上游模块。
Puppetfile
添加到 fuel-library/deployment 的 Puppetfile 包含上游模块、git 存储库和应用于填充 fuel-library/deployment/puppet 文件夹以进行开发、测试和构建的特定引用。应注意的是,使用的引用应是特定的 git 标签引用。我们不允许使用分支,因为它会允许上游模块的版本在相同 fuel-library 代码的构建之间发生变化。我们将根据此页面中设置的指南验证 Puppetfile(等待合并 I623929df3a309110d26e166ac9067c715b14188b)。
Puppetfile 示例
以下是 librarian-puppet-simple 的 puppet 文件示例。应注意的是,此格式与常规 librarian-puppet 格式略有不同,因为 mod 名称不是供应商名称,而是我们将模块放入的文件夹名称。例如 'puppetlabs-stdlib' 应为 'stdlib'。
#!/usr/bin/env ruby #^syntax detection # See https://github.com/bodepd/librarian-puppet-simple for additional docs # # Important information for fuel-library: # With librarian-puppet-simple you *must* remove the existing folder from the # repo prior to trying to run librarian-puppet as it will not remove the folder # for you and you may run into some errors. # ############ # Examples # ############ # From git repo # mod "stdlib", # :git => 'https://github.com/puppetlabs/puppetlabs-stdlib.git', # :ref => '4.6.x' # # From tarbal # mod "stdlib", # :tarbal => 'https://forgeapi.puppetlabs.com/v3/files/puppetlabs-stdlib-4.6.0.tar.gz' # mod 'stdlib', :git => 'https://review.fuel-infra.org/p/puppet-modules/puppetlabs-stdlib.git', :ref => '4.6.0' mod 'concat', :git => 'https://review.fuel-infra.org/p/puppet-modules/puppetlabs-concat.git', :ref => '1.2.4'
update_modules.sh
一个名为 update_modules.sh 的脚本已添加到 fuel-library/deployment 文件夹,可用于通过 librarian-puppet-simple 下载所有必需的模块。此脚本还可以传递参数以利用 bundler 进行 librarian-puppet-simple 的安装,以满足开发需求。应使用此脚本来确保开发环境与所需的上游模块保持最新。
remove_modules.sh
一个名为 remove_updates.sh 的脚本已添加到 fuel-library/deployment 文件夹,可用于从当前工作目录中删除由 librarian 管理的模块。或者,您也可以在 fuel-library 的工作副本中执行 'git clean -d -x -f' 以删除任何未管理的 文件。
librarian-puppet-simple 的 Noop 修改
为了能够运行我们的 noop 测试,我们需要按照指定的版本下载上游模块。noop 测试运行程序已更新为在执行测试之前可选地调用 librarian-puppet,以填充所需的 puppet 模块。fuel_noop_tests.rb 已使用 -u 选项更新,该选项将调用 librarian-puppet 以下载上游模块。fuel_noop_tests.rb 调用我们创建的 update_modules.sh 脚本来管理 librarian-puppet-simple 任务。
fuel-library rpm 构建变更
作为 fuel-library RPM 构建过程的一部分,我们已更新 RPM 规范,以利用 update_modules.sh 脚本下载上游模块,以便将它们包含在 fuel-library RPM 中。此更改是 I5e628f159d2d11121af741bcc1218f292cd2b96e 的一部分,并将尝试在 RPM 构建期间运行 update_modules.sh(如果存在),以便将上游模块捆绑到 rpm 中进行部署。应注意的是,此 update_modules.sh 运行不使用 bundler,因此 ruby21-rubygem-librarian-puppet-simple 已被添加为 fuel-library 包的 BuildRequires。
最佳实践
Puppetfile 模块定义
Puppetfile 中的模块定义 *必须*
- 引用 :ref 的标签
- 引用官方 fuel-infra.org 镜像(review.fuel-infra.org 或 github.com/fuel-infra)
- 如果使用 fuel-infra 镜像是不可能的(并且有很好的理由,例如 bug 1479017),则引用官方上游存储库
Puppetfile 中的模块定义 *不得*
- 引用 :ref 的 sha1 哈希
- 引用 :ref 的分支
- 引用个人 fork git 存储库
示例
良好
mod 'stdlib', :git => 'https://review.fuel-infra.org/p/puppet-modules/puppetlabs-stdlib.git', :ref => '4.6.0'
mod 'concat', :git => 'https://github.com/fuel-infra/puppetlabs-concat.git', :ref => '1.2.4'
错误
mod 'stdlib', :git => 'https://github.com/Yelp/puppetlabs-stdlib.git', :ref => 'master'
mod 'concat', :git => 'https://github.com/puppetlabs/puppetlabs-concat.git', :ref => '1.2.x'
工作流程
新模块
要将新的上游 puppet 模块添加到系统中,您需要经过几个步骤。变更 I4198b56e843d5b4d5f43b4c990c8af07de14524b 是将新模块添加到 fuel-library 代码库中的示例。
- 为新的上游模块(及其任何必需的依赖项)请求 fuel-infra 存储库镜像,以便 CI 可以使用此镜像进行构建和测试。请参阅 bug 1477320 作为此类型请求的示例。
- 使用所需的模块信息更新 Puppetfile。您需要添加模块名称、git 存储库和要使用的特定标签引用。
- 将 "puppet/<modulename>" 添加到 fuel-library/deployment/.gitignore 文件中,以确保它不会被签入
- 提交以供审核
现有模块迁移
对于现有模块,我们需要在迁移过程中将其从代码库中删除。变更 I16fd42f666cf142c5efc7362ed0a3b9bbcded249 提供了 fuel-library 代码库中迁移现有模块的示例。
- 请求要迁移的模块的 fuel-infra 存储库镜像。
- 使用所需的模块信息更新 Puppetfile。
- 删除 fuel-library/deployment/puppet/ 中的现有 <modulename>
- 将 "puppet/<modulename>" 添加到 fuel-library/deployment/.gitignore
- 提交以供审核
更新现有模块
更新模块应该只是 Puppetfile 中引用的更新。
- 更新 Puppetfile 中的 git 标签引用
- 提交以供审核
自定义上游模块变更
所有上游模块变更应发生在 upstream,我们应该通过更新 Puppetfile 中的 git 标签引用来下载它们。
使用自定义上游模块变更的规则如下
- 修复 *关键* 错误,该错误在上游审核中花费了超过 7 天(自第一个补丁集以来),放松到 SCF 和 RTM 之间 24 小时。
- 修复 *高* 或 *关键* 错误,该错误在上游审核中收到了 -2,但收到了 2 个 fuel-library 核心审核者的 +2。
如果您的更改不属于这些类别,您应该寻找解决该问题的替代方法,而无需进行上游修改。如果与 fuel-library 的技术决策相关,请查看是否有可以在 fuel-library 中利用的替代方案来解决该问题或修复上游问题。
如果您的更改符合上述规则,您可以按照以下工作流程进行操作。
- 提交上游模块的补丁
- 必须满足上述自定义补丁的标准
- 将提交 cherry-pick 到 review-infra 上的 fuel-custom 分支(例如 6.0.0-MOS)
- 让 fuel-infra 模块的核心审核者(例如 fuel-library 和 MOS-Puppet 人员)审核并批准更改
- 一旦审核获得批准,就应该有一个自定义标签来引用该更改,该更改不是标准上游版本。例如 6.0.0 -> 6.0.0-MOS-1
- 使用更新的 Puppetfile(例如 6.0.0-MOS-1)创建 fuel-library 补丁
- 提交 fuel-library 以供审核
预计当上游补丁最终落地时,fuel-infra 中的自定义补丁将被还原,并使用着陆的补丁。