Berkshelf 无法从 Git 标签解析食谱版本

Berkshelf unable to resolve cookbook version from Git tag

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

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

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

中使用了以下助手
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 中使用以下行:

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

原因是当 Berkshelf 尝试解析依赖关系时,.git 文件夹在元信息被读取之前从 cookbook 的暂存目录中删除。因此,我的辅助方法无法从 git 标记获得正确的版本,Berkshelf 会抛出异常。

鉴于以下限制条件:

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

是否有处理此问题的推荐工作流程?管理说明书版本和依赖项的 "Berkshelf Way" 是什么。

非常感谢任何帮助 - 非常感谢!

您需要某种工件存储库,用于 "released" 已经内置元数据的食谱。这通常是一个 Chef Server 组织,除了保存食谱外不用于任何其他用途,然后是指向它的 berks-api 服务。不过,这仍然会使您无法使用预发布版本。

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