与Git LFS一起使用的Jenkins Git插件失败了,其中包含了糟糕的证书和#39;在Mac奴隶上

时间:2016-03-05 03:30:06

标签: git macos jenkins git-lfs

在我的公司,我们使用Jenkins Git插件(2.4.2)和Git LFS(1.1.2)针对我们的内部GitHub Enterprise实例建立了Jenkins CI系统。尽管存储在Jenkins中的有效凭证使用全局配置的凭证存储在Mac从属设备上,但检查存储库始终以此失败结束:

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.

或:

Bad Credentials

当我登录到奴隶并直接运行命令时,一切正常;只有Jenkins从属进程才会触发错误。这也似乎只影响我们的Mac奴隶,Windows奴隶使用存储的凭据并正确运行Git LFS。如何配置Git插件以在Mac从站上正确运行Git LFS?

2 个答案:

答案 0 :(得分:6)

Mac奴隶的问题涉及很多方面。

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

我们使用Homebrew安装了Git LFS,修改了/ etc / paths以添加/ 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

如果没有这个,checkout会成功,但是Git LFS会默默运行而不会将其存根保留在存储库中。

还需要向全局git配置添加凭据帮助程序(有关详细信息,请参阅此link)。

[credential]
    helper = "osxkeychain "

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

答案 1 :(得分:0)

您可以使用最新的Jenkins Git plugin再次尝试该设置,其3.1.0刚刚发布:

  

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

允许您添加" Git LFS Pull After Checkout"作为附加行为