GitLab系列1 基础功能及架构简介

5,727 阅读5分钟

本文将介绍 GitLab 的基础及架构的简介,这里假设读者已经使用过代码托管平台,并使用过 git 版本控制工具

基础功能

GitLab 是目前最炙手可热的代码托管类型的开源项目(严格来说现在应该是 devops 类型的开源项目了,但最广为人知的功能还是代码托管),拥有相对庞大的社区。本小节将介绍 GitLab 提供的最基础的代码托管功能

代码托管,顾名思义就是将我们本地的代码托管至远程仓库进行管理,这样方便团队开发与协作,也有利于用户及时同步远程仓库来自其他同事更新的代码至本地,所以最最基础的业务场景即: git clone or git pull or git fetchgit push ,前者是将远程仓库代码克隆或更新至本地,后者是将本地的代码变动推送至远程仓库

访问 gitlab 首页,注册一个 gitlab 账号,填写基本的用户名、邮箱及密码信息即可注册,这里要注意邮箱很重要,GitLab 是用邮箱认用户的


注册成功后登录,将看到如下页面,显示的是当前登录用户的项目列表


GitLab 的项目是一个很大的概念,它包揽了项目管理、wiki 文档、代码托管、持续集成/交付等功能,但一个项目只能与一个仓库关联,并且创建项目时必须初始化仓库


这样,我们就能进入到刚刚创建的项目中,从左侧菜单项可以看到项目提供了很多功能,这里就不一一介绍了,因为重点是在代码托管这个功能


到目前为止,我们相当于在远程服务器创建了一个代码仓库,但是它如何与本地进行关联呢,或者说,我本地执行 git clone 或 git push 操作,远程服务器怎么认得我呢?注意上图的橙色提示就明白,远程服务器需要用户上传本地的 SSH 公钥来识别用户是谁

这里先插入一段对 SSH 公钥登录原理的介绍,其实整个过程主要使用了公钥加密、私钥解密的对称加密算法:用户将自己本机的 SSH 公钥上传至远程服务器上,登录的时候远程服务器向用户发送一段随机序列,用户用自己本机的 SSH 私钥加密后发回远程服务器,远程服务器用事先储存的公钥进行解密,如果成功就证明用户是可信的,允许你登录并且不再要求密码



我们得新建 SSH 公钥才能通过 SSH 拉取代码,本地生成 ssh 密钥对的方法请自行搜索


只有将自己本地密钥上传后,我们才能通过 ssh 密钥的方式克隆或更新远程仓库的代码

除了 ssh 密钥以外,我们也能使用 https 的方式克隆或更新代码,区别在于 https 的方式需要输入 GitLab 的账号名和密码

# ssh 方式
git clone git@gitlab.com:BradeHyj/ToyProject.git
# https 方式
git clone https://gitlab.com/BradeHyj/ToyProject.git

至此,我们已经将代码托管最最基础的功能给介绍完毕:新建代码仓库以及本地仓库的关联。可以发现,对于 GitLab 而言,其访问入口不仅仅是只有 http/https ,还应该有 ssh

架构简介

本小节将简单介绍 GitLab 的单机部署架构图及其相应组件


上图是官网贴出的 GitLab 架构图,官网将 GitLab 类比为一个公司办公室:

  1. The repositories(代码仓库)是 GitLab 管理的货物,它们被存储于仓库中,此仓库可以是硬盘,也可能是更复杂的 NFS 文件系统


  2. Nginx类似 GitLab 的前台。用户来到前台发起请求,此请求交由给办公室的工作人员处理


  3. The database(数据库)是放置各种元数据文件的橱柜,其内容包含仓库货物的元数据信息(如合并请求、议题等);访问前台的用户的信息及权限;等等


  4. Redis是带有“小洞”(cubby holes,看下图应该秒懂了吧,只可意会不可言传系列)的通讯板,它包含了办公室工作人员需要执行的任务


  5. Sidekiq是一类主要处理发送邮件任务的工作人员,他们从 Redis 通讯板中获取任务执行
  6. A Unicorn worker是一类处理耗时短的普通任务请求的工作人员。他们的工作职责:通过检测存储在 Redis “小洞”的用户会话来校验用户权限;指定任务交由 Sidekiq 工作人员执行;从货物仓库中获取或移动元件;等等
  7. GitLab-shell是办公室的第三类工作人员,它不是从前台(HTTP)接受命令,而是从传真机(SSH)。GitLab-shell 工作人员借由 Redis 通讯板与 Sidekiq 工作人员交流,有时也会直接或者通过前台询问 Unicorn 工作者的问题


  8. Gitaly相当于办公室的后台,它擅长访问磁盘并高效执行 git 操作,并缓存耗时操作的结果。所有的 git 操作都经由 Gitaly 处理

以上组件的相互协同及关联如下图所示,它们共同组成了 GitLab 的软件架构,可以看到此架构的两个关键入口:HTTP/HTTPS(TCP 80,443)SSH(TCP 22)


架构不会是完美的设计,而更应该是可迭代的进化,每个组件的存在必然有想要解决的问题,后续 GitLab 系列将逐一介绍各个组件“存在”的意义

附录

参考链接

GitLab 官方文档

阮一峰 SSH 原理与运用