关于持续集成:Berkshelf 无法从 Git 标签解析食谱版本

Berkshelf unable to resolve cookbook version from Git tag

我使用 Berkshelf 管理我的 Chef 食谱,并在持续集成管道中处理上传部分。

遵循互联网上的一些最佳实践,我使用 thor-scmversion 来管理我的食谱版本。因此,我将 VERSION 文件添加到 .gitignore 并仅将食谱版本作为 git 存储库中的标签。

为了在元数据中获取我的食谱的当前版本,我在 metadata.rb

中使用了以下帮助程序

1
2
3
4
5
6
7
8
9
10
11
12
require 'thor-scmversion'

def current_version
  version = IO.read(File.join(File.dirname(__FILE__), 'VERSION')) rescue nil
  version ||= ThorSCMVersion.versioner.from_path rescue nil
  version ||= '0.1.0'
  version
end

# ...
version          current_version
# ...

我的问题出现了,如果我想用 berks install.

安装说明书依赖项

假设我有一个食谱 env_lampstack,它依赖于一个食谱 app_apache ~> 1.0.1。因此,我在 env_lampstack 的 Berksfile:

中使用以下行

1
cookbook 'app_apache', git: '...', branch: '1.0.1'

原因是当 Berkshelf 尝试解决依赖关系时,.git 文件夹会在读取元信息之前从说明书的暂存目录中删除。因此,我的辅助方法不会从 git 标记中获取正确的版本,并且 Berkshelf 会引发异常。

鉴于以下约束:

  • 我希望我的 CI 服务器(而不是其他人)来管理我的食谱版本

  • 我无法将我的食谱上传到公共超市,我也不想自己设置一本

我可以想出以下解决方案:

  • 我将 VERSION 文件保存在 git 存储库中 - 问题:我需要让我的 CI 服务器推送到容易出错的存储库中

  • 我在 CI 服务器上创建了一个 metadata.json 并将其推送到我的存储库中 - 问题:再次 - 容易出错

  • 无论我是否"需要"它,我都会将每本食谱(每次提交)的每个版本上传到 Chef 服务器 - 问题:Chef 服务器可能会被食谱淹没,或者我必须远离"基于主干的"" 开发和使用功能分支,我必须再次处理食谱的上传顺序。

是否有任何推荐的工作流程来处理这个问题?什么是管理说明书版本和依赖项的"Berkshelf 方式"。

任何帮助将不胜感激 - 非常感谢!


您将需要某种"已发布"食谱的工件存储库,其中已经包含了元数据。这通常是一个 Chef Server 组织,它只用于保存食谱,然后是一个指向该位置的 berks-api 服务。不过,这仍然会让您无法使用预发布版本。

就我个人而言,我只是手动整理我的 metadata.rb 而不是依赖 scm 数据,并且不允许 CI 修改它。发布通常应该是人为启动的过程。