4

在我的公司,我们一直在使用 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?

4

2 回答 2

7

Mac slave 的问题涉及很多方面。

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

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

要启用 Git LFS,还需要使用git config --global以下值修改 ~/.gitconfig(使用 ):

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

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

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

[credential]
    helper = "osxkeychain "

Git 插件使用有点奇怪的 init+fetch 方法而不是 clone 来下载存储库(有关更多详细信息,请参阅JENKINS-30318)。添加此功能是为了解决凭据问题(不再需要)。该插件使用本地 git 配置文件(这就是为什么需要 init+fetch)来临时存储随后被删除的凭据。此凭据设置包含特定命令(获取是其中之一)。不幸的是, git checkout 命令没有用凭据包装。这意味着当调用 git-lfs 时,它必须从存储在 Jenkins 上的其他地方获取其凭据。从Git LFS API可以看出 Git LFS 可以使用gitcredentials访问服务器(GitHub)。在我们的 Windows slave 上,这很有效。然而,在 Mac 从站上,由于 Jenkins 进程没有在登录 shell 中运行,Git LFS 没有访问用户钥匙串的权限并且会失败。打开 Keychain Access 并将密钥从“登录”类别移动到“系统”类别(请参阅此评论)并允许所有应用程序访问密钥(请参阅此答案),我们终于能够使用 Git LFS 进行结帐。

于 2016-03-05T03:30:05.583 回答
0

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

添加命令行 git大文件支持 (LFS) ( JENKINS-30318 , JENKINS-35687 , JENKINS-38708 , JENKINS-40174 )

这允许您添加“ Git LFS Pull After Checkout”作为附加行为

于 2017-03-06T22:12:28.640 回答