Continuous integration 无法从Git标记解析cookbook版本

Continuous integration 无法从Git标记解析cookbook版本,continuous-integration,chef-infra,versioning,cookbook,berkshelf,Continuous Integration,Chef Infra,Versioning,Cookbook,Berkshelf,我用Berkshelf管理我的厨师烹饪书,并在持续集成管道中努力完成上传部分 根据互联网上的一些最佳实践,我使用thor scmversion管理我的烹饪书版本。因此,我将VERSION文件添加到.gitignore中,并将cookbook版本仅作为git存储库中的标记 为了在元数据中获取我的烹饪书的当前版本,我在metadata.rb中使用了以下帮助程序 require 'thor-scmversion' def current_version version = IO.read(Fil

我用Berkshelf管理我的厨师烹饪书,并在持续集成管道中努力完成上传部分

根据互联网上的一些最佳实践,我使用thor scmversion管理我的烹饪书版本。因此,我将
VERSION
文件添加到
.gitignore
中,并将cookbook版本仅作为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
安装cookbook依赖项,我的问题就出现了

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

cookbook 'app_apache', git: '...', branch: '1.0.1'
这是因为当Berkself试图解析依赖项时,在读取元信息之前,
.git
文件夹会从cookbook的scratch目录中删除。因此,我的helper方法无法从git标记获得正确的版本,并且Berkshellf会抛出一个异常

鉴于以下限制:

  • 我希望我的CI服务器(而不是其他服务器)管理我的烹饪书版本

  • 我不能把我的食谱上传到公共超市,我也不想自己建立一个

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

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

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

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

是否有处理此问题的推荐工作流程?管理烹饪书版本和依赖项的“方法”是什么


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

您将需要某种工件存储库来存储“已发布”的烹饪书,这些烹饪书的元数据已经烘焙好了。这通常是一个Chef服务器组织,除了保存烹饪书之外,它不用于其他任何用途,然后一个BerksAPI服务就指向了这一点。但这仍然会使您无法使用预发布版本


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

有一个刀子插件,可以帮助清理厨师服务器上未使用的烹饪书。请特别参阅和。也许也有一些用处