我们的项目存储库非常大(2.5GB(。因此,在脚本管道中的签出 (scm( 步骤中,代码需要更长的时间才能从 GIT 克隆。由于 GIT 试图获取整个历史记录,我们面临以下错误。
到目前为止,我已经尝试过结帐(scm(,我读了 https://jenkins.io/doc/pipeline/steps/workflow-scm-step/有一个名为深度的选项,通过它我们只能下载最近的提交。
但我不知道它的语法。
node(nodeName) {
try {
deleteDir()
checkout(scm)
....
....
}
catch(Exception ex) {
throw ex
}
}
如果克隆时间减少,那将是非常有益的。 执行行结帐(scm(时,
我们有时会收到以下错误。
using credential Servicejenkins_build
Cloning the remote Git repository
Cloning with configured refspecs honoured and without tags
Cloning repository
hudson.plugins.git.GitException: Command "C:Gitcmdgit fetch --no-tags --progress https://gitlab.com/../../supportforpc.git +refs/heads/*:refs/remotes/origin/*" returned status code 128:
stdout:
stderr: remote: Enumerating objects: 1
remote: Enumerating objects: 24671, done.
remote: Counting objects: 0% (1/24671)
remote: Counting objects: 1% (247/24671)
remote: Counting objects: 2% (494/24671)
remote: Counting objects: 3% (741/24671)
remote: Counting objects: 4% (987/24671)
remote: Counting objects: 5% (1234/24671)
remote: Counting objects: 6% (1481/24671)
.....
....
Counting objects: 100% (24671/24671)
remote: Compressing objects: 0% (1/10279)
remote: Compressing objects: 1% (103/10279)
remote: Compressing objects: 2% (206/10279)
remote: Compressing objects: 3% (309/10279)
remote: Compressing objects: 4% (412/10279)
remote: Compressing objects: 5% (514/10279)
remote: Compressing objects: 6% (617/10279)
remote: Compressing objects: 7% (720/10279)
remote: Compressing objects: 8% (823/10279)
remote: Compressing objects: 9% (926/10279)
remote: Compressing objects: 10% (1028/10279)
....
....
remote: Compressing objects: 100% (10279/10279)
Receiving objects: 0% (1/24671)
Receiving objects: 1% (247/24671)
Receiving objects: 2% (494/24671)
Receiving objects: 3% (741/24671)
Receiving objects: 4% (987/24671)
Receiving objects: 5% (1234/24671)
Receiving objects: 6% (1481/24671)
....
....
Receiving objects: 43%
fatal: index-pack failed
error: RPC failed; curl 56 SSL read:
error:00000000:lib(0):func(0):reason(0), errno 10054
因此,我认为在结帐(scm(中使用深度1可能会解决问题。但我不知道脚本管道中的语法。
您可以在签出之前在scm
对象中启用浅层克隆(无历史记录,仅获取最近的提交(:
node(nodeName) {
try {
deleteDir()
scm.extensions << [$class: 'CloneOption', shallow: true]
checkout(scm)
....
....
}
catch(Exception ex) {
throw ex
}
}
但是,我建议您设置和维护一个参考存储库,它的速度要快一个数量级:
在终端窗口中,将存储库克隆到镜像中。此存储库将仅包含 git 对象:
$ git clone --mirror https://gitlab.com/../../supportforpc.git Cloning into bare repository 'supportforpc.git'... remote: Enumerating objects: 6578, done. remote: Counting objects: 100% (6578/6578), done. remote: Compressing objects: 100% (1561/1561), done. remote: Total 739260 (delta 5791), reused 5046 (delta 5013), pack-reused 732682 Receiving objects: 100% (739260/739260), 3.49 GiB | 3.78 MiB/s, done. Resolving deltas: 100% (562236/562236), done.
在 Jenkins 中创建一个新作业以定期更新镜像存储库。更新镜像时仅使用
fetch
命令:sh "git fetch --all --prune"
告诉
scm
对象使用镜像存储库作为引用。读取引用后,会查询远程存储库以获取新提交,因此您不必担心始终使镜像保持最新:node(nodeName) { try { deleteDir() scm.extensions << [$class: 'CloneOption', reference: "<your-server>:git/<where-you-put-the-mirror-repo>"] checkout(scm) .... .... } catch(Exception ex) { throw ex } }
完成设置后,您将看到整个存储库在几秒钟内被克隆,此外,您还可以保留所有存储库的历史记录。如果从步骤 1 中创建的镜像存储库手动克隆,则可以自行测试克隆:
$ git clone <mirror-repository-directory> <some-dir>`
Cloning into '<some-dir>'...
done.
Checking out files: 100% (15055/15055), done.
关于修改默认scm
对象的注意事项:如果您不想更改它,您可以为签出创建一个新对象,如以下答案所示:
checkout([
$class: 'GitSCM',
branches: scm.branches,
doGenerateSubmoduleConfigurations: scm.doGenerateSubmoduleConfigurations,
extensions: scm.extensions + [$class: 'CloneOption', reference: "<your-server>:git/<where-you-put-the-mirror-repo>"],
userRemoteConfigs: scm.userRemoteConfigs
])
checkout changelog: false, poll: false, scm: [$class: 'GitSCM', branches: [[name: '*/branchname'], [$class: 'CloneOption', depth: 1, noTags: true, reference: '', shallow: true]], userRemoteConfigs: [[credentialsId: 'credentialId', url: 'git@repourl']]]
credentialId
可以通过点击 http://yourjenkinsinstall/credentials
根据毛巾的回答,您还可以通过在扩展中添加CloneOption参数noTags来避免 git 存储库中的所有标签,以下是结帐对象的外观:
checkout([
$class: 'GitSCM',
branches: [[name: '*/master']],
extensions: [[$class: 'CloneOption', noTags: true, shallow: true, depth: 1, timeout: 30]],
userRemoteConfigs: [[credentialsId: 'your-credentials', url: 'your-repository']]
])
以下是文档:
noTags : 布尔值 取消选择此选项可执行不带标签的克隆,从而在只想访问 refspec 指定的内容时节省时间和磁盘空间。
友情链接 : https://www.jenkins.io/doc/pipeline/steps/params/gitscm/