使用Git LFS的Jenkins Git插件在Mac从机上的'Bad Credentials'失败

问题描述:

在我的公司,我们一直在使用Jenkins Git Plugin(2.4.2)和Git LFS( 1.1.2)。使用Git LFS的Jenkins Git插件在Mac从机上的'Bad Credentials'失败

Caused by: hudson.plugins.git.GitException: Command "git checkout -f ___my_commit_hash___ returned status code 128: 
stdout: 
stderr: Downloading ___my_lfs_file___ (754 B) 
Error accessing media: ___my_lfs_file___ (___my_lfs_file_hash___) 

Errors logged to .git\lfs\objects\logs\___my_lfs_log___.log 
Use `git lfs logs last` to view the log. 
error: external filter git-lfs smudge %f failed 2 
error: external filter git-lfs smudge %f failed 
fatal: ___my_lfs_file___: smudge filter lfs failed 

而且git的日志显示:

Git credentials for https://git.mycompany.com/myrepository.git not found. 

尽管具有存储在詹金斯还使用全局配置的凭据存储在Mac上从有效凭据,总是检查出库与此失败告终或:

Bad Credentials 

当我登录到slave并直接运行命令时,一切正常;只有詹金斯从属进程触发错误。这也只会影响我们的Mac从机,Windows从机使用存储的凭证并正确运行Git LFS。我怎样才能配置Git插件在Mac从机上正常运行Git LFS?

Mac从机的问题涉及很多方面。

首先,我们通过启动slave,通过SSH在Unix机器上启动slave代理。这将启动一个非交互式shell来启动Jenkins slave.jar java进程。事实上,这不是一个登录外壳,这意味着它没有一些额外的设置就无法访问存储在钥匙串中的凭证。这也意味着它将不会从/ etc /路径(在安装git-lfs时用于Homebrew)接收任何路径而没有一些bash配置文件配置。如果我们使用通过Java Web Start(这是我们的Windows从设备的配置)启动slave代理,可能我们可能没有受到访问问题的影响(但未经测试) 。

我们使用Homebrew安装了Git LFS,它修改/ etc /路径以添加/ usr/local/bin。该文件中的路径由.profile加载,仅用于登录shell。要将/ usr/local/bin添加到路径中(以便Jenkins从属进程可以找到git-lfs),我们添加了具有修改路径的〜/ .bashrc文件。

要启用的Git LFS,但也有必要使用下面的值修改〜/的.gitconfig(使用git config --global):

[filter "lfs"] 
    clean = git-lfs clean %f 
    smudge = git-lfs smudge %f 
    required = true 

没有这一点,结账会成功,但Git的LFS将默默不能运行其留下存根库中的存根。

还需要向全局git配置中添加凭证助手(有关更多详细信息,请参阅此link)。

[credential] 
    helper = "osxkeychain " 

Git的插件使用的init的稍显怪异的方法+取,而不是克隆下载库(见JENKINS-30318有详细介绍)。这被添加到解决凭证问题(应该不再需要)。该插件使用本地git配置文件(这就是为什么需要init +获取)来临时存储随后被删除的凭证。特定的命令用这个凭证设置进行包装(取一个)。不幸的是,git checkout命令未包含凭据。这意味着当调用git-lfs时,它必须从Jenkins中存储的地方以外的地方获取凭证。从Git LFS API,它显示Git LFS可以使用gitcredentials访问服务器(GitHub)。在我们的Windows奴隶,这只是工作。然而,在Mac从机上,因为Jenkins进程没有在登录shell中运行,所以Git LFS没有访问用户钥匙链的权限并且会失败。打开“钥匙串访问”并将钥匙从“登录”类别移至“系统”类别(请参见此comment),并允许所有应用程序访问密钥(请参见此answer),我们终于可以使用Git LFS工作结账。

你可以再次尝试安装了最新的Jenkins Git plugin,其3.1.0刚刚发布了:

添加命令行的git large file support (LFS)JENKINS-30318JENKINS-35687JENKINS-38708JENKINS-40174

这使您可以添加“Git LFS Pull After Checkout”作为附加行为