当存储库是 AWS CodeCommit 时,如何在 Windows 上从 Chef 配方执行 GIT 命令?
How to execute GIT commands from Chef recipe on Windows when repository is AWS CodeCommit?
我的存储库位于 AWS CodeCommit 上。我有 运行 配置 aws cli 的命令:
aws configure --profile test
我已将策略“AWSCodeCommitPowerUser”分配给我的 IAM 用户。
我已将我的 GIT 凭证管理器指向我的 AWS 配置文件:
git config --global credential.helper '!aws --profile test codecommit credential-helper $@'
git config --global credential.UseHttpPath true
我已验证 .aws
目录和 .gitconfig
文件已在 C:\Users\[my_user]\
中为我的用户正确创建
我已验证我能够从我的 powershell 控制台在所需的 git 受控目录中执行 git pull
命令。
但是,当我从 Chef 食谱中 运行 执行相同的命令时,它无法更新 git 目录。我不断收到 git 超时错误,并注意到任务管理器中有一个 Git 凭据管理器任务 运行ning;之后我的食谱失败了。我的厨师客户的版本是:12.14.89
如何让它工作?
首先总结失败的努力:
powershell_script 'git-sync' do
cwd "#{ENV['HOME']}']}"
code <<-EOH
git pull
EOH
end
不起作用,因为该资源运行带有 -NoProfile 标记的 powershell,并且未加载用户设置
ruby_block 'git-sync' do
block do
script <<-EOH
git pull
EOH
end
result = powershell_out(script)
if (!result.stdout.to_s.empty?)
Chef::Log.info("GIT command output::\n#{result.stdout.to_s}")
end
end
同样的问题,不起作用。
伊瑟尔
git "#{node.run_state['git_directory']}" do
repository "#{node.run_state['git_repo']}"
revision "#{node.run_state['git_branch']}"
action :sync
user "#{ENV['USER']}"
end
上面的那个不起作用,因为必须指定 user
属性并且由于抱怨某些 nil 目录的荒谬错误而失败。经过检查,我意识到该资源只能与 linux 一起使用,底层 ruby 文件使用 Etc.getpwnam(..)
现在,解决方案:
食谱git_sync.rb:
ruby_block 'git-sync' do
block do
psFile = "#{Chef::Config[:file_cache_path]}/cookbooks/#{cookbook_name}/files/git_align.ps1"
node.run_state['git_directories'].each { |location|
scriptOutput = `powershell.exe -NoLogo -NonInteractive -File #{psFile} #{location} #{node.run_state['git_branch']}`
Chef::Log.info("Git Sync Output::\n#{scriptOutput}")
}
end
end
powershell 脚本 git_align.ps1:
Param(
[string]$location,
[string]$branch_name
)
Try{
$output = ""
$loc = Resolve-Path -path $location
if ($loc -eq $null) {throw "$location not found"}
Set-Location $loc
$output+= "At location $loc`n"
$curr_branch = git rev-parse --abbrev-ref HEAD
if ($curr_branch -ne $branch_name){
$output+= git checkout $branch_name
$output+= "`n"
}
if ($? -eq $false) {throw "GIT checkout failed"}
$output+= git reset --hard origin/$branch_name
$output+= "`n"
if ($? -eq $false) {throw "GIT reset failed"}
$output+= git pull
$output+= "`n"
if ($? -eq $false) {throw "GIT pull failed"}
Write-Output $output
}
Catch{
$exc = $_.Exception | format-list -force
Write-Output $exc
Throw $exc
}
希望对您有所帮助!大厨有时就像一片大海,没有人应该独自游泳!
我的存储库位于 AWS CodeCommit 上。我有 运行 配置 aws cli 的命令:
aws configure --profile test
我已将策略“AWSCodeCommitPowerUser”分配给我的 IAM 用户。 我已将我的 GIT 凭证管理器指向我的 AWS 配置文件:
git config --global credential.helper '!aws --profile test codecommit credential-helper $@'
git config --global credential.UseHttpPath true
我已验证 .aws
目录和 .gitconfig
文件已在 C:\Users\[my_user]\
我已验证我能够从我的 powershell 控制台在所需的 git 受控目录中执行 git pull
命令。
但是,当我从 Chef 食谱中 运行 执行相同的命令时,它无法更新 git 目录。我不断收到 git 超时错误,并注意到任务管理器中有一个 Git 凭据管理器任务 运行ning;之后我的食谱失败了。我的厨师客户的版本是:12.14.89
如何让它工作?
首先总结失败的努力:
powershell_script 'git-sync' do
cwd "#{ENV['HOME']}']}"
code <<-EOH
git pull
EOH
end
不起作用,因为该资源运行带有 -NoProfile 标记的 powershell,并且未加载用户设置
ruby_block 'git-sync' do
block do
script <<-EOH
git pull
EOH
end
result = powershell_out(script)
if (!result.stdout.to_s.empty?)
Chef::Log.info("GIT command output::\n#{result.stdout.to_s}")
end
end
同样的问题,不起作用。 伊瑟尔
git "#{node.run_state['git_directory']}" do
repository "#{node.run_state['git_repo']}"
revision "#{node.run_state['git_branch']}"
action :sync
user "#{ENV['USER']}"
end
上面的那个不起作用,因为必须指定 user
属性并且由于抱怨某些 nil 目录的荒谬错误而失败。经过检查,我意识到该资源只能与 linux 一起使用,底层 ruby 文件使用 Etc.getpwnam(..)
现在,解决方案:
食谱git_sync.rb:
ruby_block 'git-sync' do
block do
psFile = "#{Chef::Config[:file_cache_path]}/cookbooks/#{cookbook_name}/files/git_align.ps1"
node.run_state['git_directories'].each { |location|
scriptOutput = `powershell.exe -NoLogo -NonInteractive -File #{psFile} #{location} #{node.run_state['git_branch']}`
Chef::Log.info("Git Sync Output::\n#{scriptOutput}")
}
end
end
powershell 脚本 git_align.ps1:
Param(
[string]$location,
[string]$branch_name
)
Try{
$output = ""
$loc = Resolve-Path -path $location
if ($loc -eq $null) {throw "$location not found"}
Set-Location $loc
$output+= "At location $loc`n"
$curr_branch = git rev-parse --abbrev-ref HEAD
if ($curr_branch -ne $branch_name){
$output+= git checkout $branch_name
$output+= "`n"
}
if ($? -eq $false) {throw "GIT checkout failed"}
$output+= git reset --hard origin/$branch_name
$output+= "`n"
if ($? -eq $false) {throw "GIT reset failed"}
$output+= git pull
$output+= "`n"
if ($? -eq $false) {throw "GIT pull failed"}
Write-Output $output
}
Catch{
$exc = $_.Exception | format-list -force
Write-Output $exc
Throw $exc
}
希望对您有所帮助!大厨有时就像一片大海,没有人应该独自游泳!