在我的公司,我们使用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?
答案 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-30318,JENKINS-35687,JENKINS-38708,JENKINS-40174)
允许您添加" Git LFS Pull After Checkout
"作为附加行为