1

我有一个基于 Jenkins 文件的 MultiBranch Pipeline,它显式地克隆了由参数提供的另一个存储库。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 
4

1 回答 1

0

经过足够的调试。我发现发生了什么事。

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

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

解决方案是GIT_LFS_SKIP_SMUDGE=1在全局环境变量中设置,并在结帐步骤中添加 LFS 拉取,以显式拉入 LFS 对象。

于 2022-01-05T11:59:34.127 回答