当存储库是 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
}

希望对您有所帮助!大厨有时就像一片大海,没有人应该独自游泳!