厨师 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
我在 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