【问题标题】:Jenkins Git Plugin with Git LFS fails with 'Bad Credentials' on Mac slave带有 Git LFS 的 Jenkins Git 插件在 Mac 从站上因“错误凭据”而失败
【发布时间】:2016-03-05 03:30:05
【问题描述】:

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

【问题讨论】:

    标签: git macos jenkins git-lfs


    【解决方案1】:

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

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

    我们使用 Homebrew 安装了 Git LFS,它修改了 /etc/paths 以添加 /usr/local/bin。此文件中的路径由仅用于登录 shell 的 .profile 加载。为了将 /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+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 没有访问用户钥匙串的权限并且会失败。打开钥匙串访问并将密钥从“登录”类别移动到“系统”类别(参见comment)并允许所有应用程序访问密钥(参见answer),我们终于能够结帐了Git LFS 工作。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2021-10-29
        • 1970-01-01
        • 2014-09-22
        • 1970-01-01
        • 1970-01-01
        • 2019-08-16
        • 2023-03-10
        • 2018-06-06
        • 2014-10-29
        相关资源
        最近更新 更多