2016-03-05 153 views
3

在我的公司,我們一直在使用Jenkins Git Plugin(2.4.2)和Git LFS( 1.1.2)。使用Git LFS的Jenkins Git插件在Mac從機上的'Bad Credentials'失敗

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. 

儘管具有存儲在詹金斯還使用全局配置的憑據存儲在Mac上從有效憑據,總是檢查出庫與此失敗告終或:

Bad Credentials 

當我登錄到slave並直接運行命令時,一切正常;只有詹金斯從屬進程觸發錯誤。這也只會影響我們的Mac從機,Windows從機使用存儲的憑證並正確運行Git LFS。我怎樣才能配置Git插件在Mac從機上正常運行Git LFS?

回答

4

Mac從機的問題涉及很多方面。

首先,我們通過啓動slave,通過SSH在Unix機器上啓動slave代理。這將啓動一個非交互式shell來啓動Jenkins slave.jar java進程。事實上,這不是一個登錄外殼,這意味着它沒有一些額外的設置就無法訪問存儲在鑰匙串中的憑證。這也意味着它將不會從/ etc /路徑(在安裝git-lfs時用於Homebrew)接收任何路徑而沒有一些bash配置文件配置。如果我們使用通過Java Web Start(這是我們的Windows從設備的配置)啓動slave代理,可能我們可能沒有受到訪問問題的影響(但未經測試) 。

我們使用Homebrew安裝了Git LFS,它修改/ etc /路徑以添加/ 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 

沒有這一點,結賬會成功,但Git的LFS將默默不能運行其留下存根庫中的存根。

還需要向全局git配置中添加憑證助手(有關更多詳細信息,請參閱此link)。

[credential] 
    helper = "osxkeychain " 

Git的插件使用的init的稍顯怪異的方法+取,而不是克隆下載庫(見JENKINS-30318有詳細介紹)。這被添加到解決憑證問題(應該不再需要)。該插件使用本地git配置文件(這就是爲什麼需要init +獲取)來臨時存儲隨後被刪除的憑證。特定的命令用這個憑證設置進行包裝(取一個)。不幸的是,git checkout命令未包含憑據。這意味着當調用git-lfs時,它必須從Jenkins中存儲的地方以外的地方獲取憑證。從Git LFS API,它顯示Git LFS可以使用gitcredentials訪問服務器(GitHub)。在我們的Windows奴隸,這只是工作。然而,在Mac從機上,因爲Jenkins進程沒有在登錄shell中運行,所以Git LFS沒有訪問用戶鑰匙鏈的權限並且會失敗。打開「鑰匙串訪問」並將鑰匙從「登錄」類別移至「系統」類別(請參見此comment),並允許所有應用程序訪問密鑰(請參見此answer),我們終於可以使用Git LFS工作結賬。