厨师 git :sync UnresolvableGitReference

chef git :sync UnresolvableGitReference

我在 Chef 中遇到 git 资源的奇怪问题。我收到 UnresolvableGitReference 错误,即使存储库和标签存在。

配方中的编译资源: git("/opt/some-repo") do action [:sync] retries 0 retry_delay 2 default_guard_interpreter :default destination "/opt/some-repo" enable_checkout true revision "tags/v3.0.4" remote "origin" checkout_branch "deploy" declared_type :git cookbook_name :"some-cookbook" recipe_name "install" user "ubuntu" repository "git@github.com:someUser/some-repo.git" end

该实例可以访问 git 存储库和引用。

git ls-remote 'git@github.com:someUser/some-repo.git' 'tags/v3.0.4*' returns 我的提交 ID。

食谱在 chef v11.8.2 中运行良好,但在 chef v12.5.1 中运行失败

所以,我试了一下,发现了问题所在。 git 属性 revision 的 git 仓库的 tag 不需要在 tags/ 前面。我不知道它在哪个版本的 chef 中发生了变化,但我确认它在 chef 版本 11.8.2.

中有效

因此revision "tags/v3.0.4"变为revision "v3.0.4"

对于 git 资源,您只能使用标签名称 'v3.0.4'。如果需要指定是标签,也可以使用全路径:'refs/tags/v3.0.4'.

这之前有效,因为 Chef 11 checks against the reference sufix:

found = refs.find { |m| m[1].end_with?(@new_resource.revision) }

但这可能会像您想象的那样出现问题。我认为 'tags/v3.0.4' 工作从来都不是预期的行为。

无论如何,in Chef 12 the implementation has changed,现在按前缀搜索,附加'ref/tags/''refs/heads/'分别搜索标签和分支:

def find_revision(refs, revision, suffix="")
  found = refs_search(refs, rev_match_pattern('refs/tags/', revision) + suffix)
  found = refs_search(refs, rev_match_pattern('refs/heads/', revision) + suffix) if found.empty?
  found = refs_search(refs, revision + suffix) if found.empty?
  found
end

def rev_match_pattern(prefix, revision)
  if revision.start_with?(prefix)
    revision
  else
    prefix + revision
  end
end