使用Git LFS的Jenkins Git插件在Mac奴隶上失败并显示"Bad Credentials"

jin*_*008 4 git macos jenkins git-lfs

在我的公司,我们使用Jenkins Git Plugin(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
Run Code Online (Sandbox Code Playgroud)

并且git日志显示:

Git credentials for https://git.mycompany.com/myrepository.git not found.
Run Code Online (Sandbox Code Playgroud)

要么:

Bad Credentials
Run Code Online (Sandbox Code Playgroud)

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

jin*_*008 6

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

首先,我们通过SSH在Unix机器上使用Launch slave代理启动slave.这将启动一个非交互式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,还需要使用git config --global以下值修改〜/ .gitconfig(using ):

[filter "lfs"]
    clean = git-lfs clean %f
    smudge = git-lfs smudge %f
    required = true
Run Code Online (Sandbox Code Playgroud)

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

还需要向全局git配置添加凭证帮助程序(有关更多详细信息,请参阅此链接).

[credential]
    helper = "osxkeychain "
Run Code Online (Sandbox Code Playgroud)

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没有访问用户密钥链的权限而且会失败.打开Keychain访问并将密钥从"登录"类别移动到"系统"类别(请参阅此注释)并允许所有应用程序访问密钥(请参阅此答案),我们终于可以通过Git LFS工作结账了.


归档时间:

查看次数:

3290 次

最近记录:

8 年,7 月 前