Jenkins git 结帐冻结 LFS 凭据

Jenkins git checkout freezing on credentials for LFS

我有一个基于 Jenkins 文件的多分支管道,该文件明确克隆了参数提供的另一个存储库。在尝试为 git-lfs 作为 git checkout -f <HASH> 命令的一部分请求凭据后,我发现它正在冻结并超时。

我如何检出具有认证 git lfs 访问权限的存储库?

詹金斯文件:

stages {
    stage('Fetch Source Code') {
        steps{
            dir('repo') {
                git branch: "${params.Branch}", credentialsId: 'git-creds', url: "${params.RepoURL}"
            }
        }
    }

詹金斯控制台:

 > git init /home/jenkins/agent/workspace/<PIPELINE_NAME>/repo # timeout=10
Fetching upstream changes from <HTTPS_PRIVATE_GITLAB_URL>
 > git --version # timeout=10
 > git --version # 'git version 2.30.2'
using GIT_ASKPASS to set credentials Credentials to access git resources
 > git fetch --tags --force --progress -- <HTTPS_PRIVATE_GITLAB_URL> +refs/heads/*:refs/remotes/origin/* # timeout=10
Avoid second fetch
Checking out Revision HASH (refs/remotes/origin/master)
 > git config remote.origin.url <HTTPS_PRIVATE_GITLAB_URL> # timeout=10
 > git config --add remote.origin.fetch +refs/heads/*:refs/remotes/origin/* # timeout=10
 > git rev-parse refs/remotes/origin/master^{commit} # timeout=10
 > git config core.sparsecheckout # timeout=10
 > git checkout -f <HASH> # timeout=10
Times out 

经过足够的调试。我知道是怎么回事了。

默认情况下,Git 插件不会为大多数 git 命令提供凭据(只会出现 fetch),因此当它执行 checkout 时,它会冻结等待访问 LFS 的凭据。

通过良好的设计,尽管令我沮丧的是,git/jenkins 不会将密码保存在机器上的任何位置,并且 LFS 对象是作为提取的一部分下载的。将 Jenkins 设置为在结帐后进行 LFS 拉取并不能解决问题,因为它试图在结帐期间进行 LFS 拉取。

解决办法是在全局环境变量中设置GIT_LFS_SKIP_SMUDGE=1,在checkout步骤中加入LFS拉取,显式拉取LFS对象。