为什么 git clone
仓库代码会有几十MB
前言
碰到 Jenkins流水线 报错,发现是拉取代码超时
,很是郁闷。经过查询,发现拉取的git仓库代码至少20MB,因而本文聊聊下载仓库代码过于庞大的原因 ,以及如何在 Jenkinsfile 中配置代码的拉取操作
> git fetch --tags --force --progress -- https://gitee.com/charlesdengng/qlcgl.git +refs/heads/*:refs/remotes/origin/* # timeout=10
ERROR: Timeout after 10 minutes
ERROR: Error fetching remote repo 'origin'
1. 出错的原因
- 服务器拉取代码的网速低,只有30kb左右
- 拉取的代码仓库过大。因为图中
Receiving objects
达到了69%
,拉取了19.6MiB
。而我的代码仓库并不会有 19MB 之多,通过https下载代码仓库只有大概 4MB 左右
2. 解决思路
- 提升网速
网速差是偶发现象,因为我会使用插件Workspace Cleanup
在 pipeline 执行后清空workspace。每次拉取代码都是重新克隆仓库,但偶尔会出现拉取时间超时。
- 减少拉取代码的大小,所以我们要知道为什么我们拉取的代码这么大
3. 先了解 git clone
3.1 git clone 做了什么
$ git clone https://github.com/libgit2/libgit2
这会在当前目录下创建一个名为 “libgit2” 的目录,并在这个目录下初始化一个 .git
文件夹, 从远程仓库拉取下所有数据放入 .git
文件夹,然后从中读取最新版本的文件的拷贝。
git 默认会进行全部克隆
这个.git
文件夹包含我们所有commit的历史版本,以及所有分支。假如仓库有master和dev两个分支,且每个分支占有4MB空间,那么我们下载的仓库代码大小为8MB。再加上 commit 的历史版本,所以下载的仓库代码不止8MB。
3.2 如何更快克隆仓库
gi官方文档 已经给出了答案。添加参数 depth <深度>
- 创建一个历史记录被截断为指定提交次数的“浅”克隆。暗含
--single-branch
选项,除非给出--no-single-branch
来获取所有分支顶端附近的历史记录。
推荐 git clone XXXXXX.git --depth 1
。表示拉取一个默认的主分支,并且只有最新的commit信息。
注意 正常开发不需要浅克隆,因为你需要协同开发,历史commit和其他分支还是需要拉取到本地的
4 正确配置 Jenkinsfile 中的代码拉取
Jenkins使用git fetch 拉取代码到.git
文件夹下,然后通过 git checkout 检出最新代码。
我们只要在 chenckout步骤
中增加 CloneOption
扩展即可。
environment {
// git仓库地址
git_web_url = 'https://gitee.com/charlesdengng/qlcgl.git'
//连接git所需的凭据
git_auth = 'xxxxx-xxxx-xxxx-xxxx-xxxxxxx'
//部署到服务器的具体位置
baseDir = '/home/devops/WebApp'
}
stages {
// 拉取代码
stage('拉取代码') {
steps {
// 拉取前端代码到/var/lib/jenkins/workspace/${JOB_NAME}/web下(具体可在Jenkins web页面的配置页里看见)
checkout([$class: 'GitSCM', branches: [[name: '*/master']],
extensions: [
// 指定 git 仓库检出后所放位置,相对于/var/lib/jenkins/workspace/${JOB_NAME}
[$class: 'RelativeTargetDirectory', relativeTargetDir: 'web'],
//克隆选项
[$class: 'CloneOption', depth: 1, noTags: false, reference: '', shallow: true]
],
//告诉git拉取的仓库地址以及对应仓库的凭据
userRemoteConfigs: [[credentialsId: "${env.git_auth}" , url: "${env.git_web_url}" ]]])
}
}
}
© 版权声明
文章版权归作者所有,未经允许请勿转载,侵权请联系 admin@trc20.tw 删除。
THE END