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 会抛出异常。
鉴于以下限制条件:
我希望我的 CI 服务器(而不是其他人)管理我的食谱版本
我无法将我的食谱上传到 public 超市,我也不想自己开一个
我可以想出以下解决方案:
我将 VERSION
文件保存在 git 存储库中 - 问题:我需要让我的 CI 服务器推送到容易出错的存储库中
我在 CI 服务器上创建了一个 metadata.json
并将其推送到我的存储库中 - 问题:再次 - 容易出错
我将每本食谱(每次提交)的每个版本都上传到 Chef 服务器,无论我是否 "need" 它 - 问题:Chef 服务器可能会被食谱淹没或我必须离开 "trunk based" 开发并使用功能分支,我必须再次处理食谱的上传顺序。
是否有处理此问题的推荐工作流程?管理说明书版本和依赖项的 "Berkshelf Way" 是什么。
非常感谢任何帮助 - 非常感谢!
您需要某种工件存储库,用于 "released" 已经内置元数据的食谱。这通常是一个 Chef Server 组织,除了保存食谱外不用于任何其他用途,然后是指向它的 berks-api 服务。不过,这仍然会使您无法使用预发布版本。
就我个人而言,我只是手动管理我的 metadata.rb
而不是依赖 scm 数据,并且不允许 CI 修改它。发布通常应该是一个人为启动的过程。
我使用 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 会抛出异常。
鉴于以下限制条件:
我希望我的 CI 服务器(而不是其他人)管理我的食谱版本
我无法将我的食谱上传到 public 超市,我也不想自己开一个
我可以想出以下解决方案:
我将
VERSION
文件保存在 git 存储库中 - 问题:我需要让我的 CI 服务器推送到容易出错的存储库中我在 CI 服务器上创建了一个
metadata.json
并将其推送到我的存储库中 - 问题:再次 - 容易出错我将每本食谱(每次提交)的每个版本都上传到 Chef 服务器,无论我是否 "need" 它 - 问题:Chef 服务器可能会被食谱淹没或我必须离开 "trunk based" 开发并使用功能分支,我必须再次处理食谱的上传顺序。
是否有处理此问题的推荐工作流程?管理说明书版本和依赖项的 "Berkshelf Way" 是什么。
非常感谢任何帮助 - 非常感谢!
您需要某种工件存储库,用于 "released" 已经内置元数据的食谱。这通常是一个 Chef Server 组织,除了保存食谱外不用于任何其他用途,然后是指向它的 berks-api 服务。不过,这仍然会使您无法使用预发布版本。
就我个人而言,我只是手动管理我的 metadata.rb
而不是依赖 scm 数据,并且不允许 CI 修改它。发布通常应该是一个人为启动的过程。