• 为什么git clone 仓库代码会有几十MB
  • 发布于 2个月前
  • 214 热度
    0 评论
前言
碰到 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左右
2.拉取的代码仓库过大。因为图中Receiving objects 达到了69%,拉取了19.6MiB。而我的代码仓库并不会有 19MB 之多,通过https下载代码仓库只有大概 4MB 左右

二. 解决思路
1.提升网速
网速差是偶发现象,因为我会使用插件Workspace Cleanup 在 pipeline 执行后清空workspace。每次拉取代码都是重新克隆仓库,但偶尔会出现拉取时间超时。
2.减少拉取代码的大小,所以我们要知道为什么我们拉取的代码这么大

三. 先了解 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和其他分支还是需要拉取到本地的

四. 正确配置 Jenkinsfile 中的代码拉取
Jenkins使用git fetch 拉取代码到.git文件夹下,然后通过 git checkout 检出最新代码。我们只要在 chenckout步骤中增加 CloneOption 扩展即可。
environment {
        // 堆代码 duidaima.com
        // 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}" ]]])
                   }
          }
     }


用户评论