Berkshelf无法从Git标签解析cookbook版本

时间:2015-08-25 12:36:56

标签: continuous-integration chef versioning cookbook berkshelf

我使用Berkshelf管理我的厨师烹饪书,并在持续集成管道中与上传部分斗争。

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

要在我的元数据中获取当前版本的cookbook,我在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安装cookbook依赖项,我的问题就出现了。

假设我有一本食谱env_lampstack,它与食谱书app_apache ~> 1.0.1有依赖关系。因此,我在env_lampstack的Berksfile中使用以下行:

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

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

考虑到以下限制:

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

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

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

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

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

  • 我将每个食谱的每个版本(每次提交)上传到Chef服务器,无论我是否“需要” - 问题:厨师服务器可能充斥着烹饪书,或者我必须离开“基于主干”开发和使用功能分支,我必须再次处理菜谱的上传顺序。

是否有任何推荐的工作流程来处理此问题?什么是管理食谱版本和依赖项的“Berkshelf方式”。

任何帮助都将受到高度赞赏 - 非常感谢!

1 个答案:

答案 0 :(得分:1)

您需要某种工件存储库才能发布"已发布"已经有了元数据的烹饪书。这通常是一个厨师服务器组织,除了拿着食谱之外没有其他任何东西,然后berks-api服务指向那个。这仍然会让您无法使用预发布版本。

就我个人而言,我只是手工策划我的version.rb而不是依赖scm数据,并且不允许CI修改它。版本通常应该是由人为启动的过程。