基于Docker配置本地Gitlab

技术背景

GithubGitee(码云)是最常见的基于git的代码托管平台,现在基于svn的代码管理仓库已经相对比较少见了,大部分还都是企业内部的代码仓。但是基于开源的Gitlab,我们在企业内网也可以立马搭建一个代码托管平台,并且自带集成有各种代码自动化测试工具,实现持续集成和持续测试。

关于Docker容器的使用,这里我们主要是为了规避不同的OS发行版所带来的安装困扰,而Gitlab官方也提供了Docker的支持。也就是说,只要本地环境中有Docker,就可以很方便的去构造一个本地的Gitlab环境。本文也是基于Docker,讲解和展示本地Gitlab的配置和使用方法。

基于Docker的Gitlab环境部署

关于更多的docker的使用和操作方法和使用案例,读者可以参考这些博客(博客1博客2博客3博客4),这里我们就直接使用docker的一些功能。比如首先我们要做的是从dockerhub中拉取Gitlab官方提供的镜像:

[dechin-manjaro gitlab]# docker pull gitlab/gitlab-ce

这个下载的速度还是不错的,下载完成后可以在使用docker images查看相关镜像是否在本地仓库列表中。需要注意的是,这些基本的docker操作都需要root权限来执行。下载完镜像后,在本地找一个空的目录,创建几个文件夹用于绑定容器内的相关目录,使得容器中所生成的配置文件和日志文件数据文件等可以同步到本地的目录(而不仅仅是保存在容器内部的目录)。

[dechin-manjaro gitlab]# ll
总用量 0
[dechin-manjaro gitlab]# mkdir -p config
[dechin-manjaro gitlab]# mkdir -p logs
[dechin-manjaro gitlab]# mkdir -p data

这里创建了configlogsdata目录,分别用-v指令绑定到容器内的/etc/gitlab/var/log/gitlab/var/opt/gitlab目录,具体的运行指令如下所示(参考了参考链接1):

[dechin-manjaro gitlab]# docker run -d -p 5443:443 -p 82:82 -p 2222:22 --name gitlab -v /home/dechin/projects/2021-softwares/gitlab/config:/etc/gitlab -v /home/dechin/projects/2021-softwares/gitlab/logs:/var/log/gitlab -v /home/dechin/projects/2021-softwares/gitlab/data:/var/opt/gitlab gitlab/gitlab-ce
c12732a4acfb4835b8d1353b62cf85868edc2466eb0669bbabc2059f7932c309

执行之后容器开始进入后台运行,我们可以看到当前的运行状态是health: starting

[dechin-manjaro gitlab]# docker ps -n 3
CONTAINER ID   IMAGE              COMMAND             CREATED          STATUS                            PORTS                                                                                                                       NAMES
c12732a4acfb   gitlab/gitlab-ce   "/assets/wrapper"   6 seconds ago    Up 5 seconds (health: starting)   80/tcp, 0.0.0.0:82->82/tcp, :::82->82/tcp, 0.0.0.0:2222->22/tcp, :::2222->22/tcp, 0.0.0.0:5443->443/tcp, :::5443->443/tcp   gitlab
36fc44248800   gitlab/gitlab-ce   "/assets/wrapper"   45 minutes ago   Exited (137) 5 minutes ago                                                                                                                                    hardcore_poitras
d9e431790dfa   gitlab/gitlab-ce   "--help"            45 minutes ago   Created                           22/tcp, 80/tcp, 443/tcp                                                                                                     intelligent_hopper

接下来我们要做的事情就是等待,一段时间(大约2~3分钟)之后,可以重新查看刚才的容器镜像的运行状态,此时我们可以发现状态变成了healthy

[dechin-manjaro gitlab]# docker ps -n 3
CONTAINER ID   IMAGE              COMMAND             CREATED          STATUS                        PORTS                                                                                                                       NAMES
c12732a4acfb   gitlab/gitlab-ce   "/assets/wrapper"   4 minutes ago    Up 4 minutes (healthy)
36fc44248800   gitlab/gitlab-ce   "/assets/wrapper"   49 minutes ago   Exited (137) 10 minuteitras
d9e431790dfa   gitlab/gitlab-ce   "--help"            49 minutes ago   Created               _hopper

这表示Gitlab容器的初始化已经完成了,接下来我们可以在本地的目录下(而不是容器内部的目录)找到名为gitlab.rb的配置文件,需要对其进行修改:

[dechin-manjaro gitlab]# vi config/gitlab.rb 

要修改的地方主要有以下几点:

external_url 'http://192.168.0.105:82' # 大约在32行,注意替换本地ip地址
gitlab_rails['gitlab_shell_ssh_port'] = 2222 # 大约在631行
# nginx['redirect_http_to_https_port'] = 82 # 大约在1312行
nginx['listen_port'] = 82 # 大约在1354行

修改完成后,重启gitlab的容器镜像(在上一次的run中,我们将其命名为gitlab):

[dechin-manjaro gitlab]# docker restart gitlab
gitlab

跟刚才一样的,需要看容器状态以确定是否启动成功:

[dechin-manjaro gitlab]# docker ps -n 3
CONTAINER ID   IMAGE              COMMAND             CREATED          STATUS                
c12732a4acfb   gitlab/gitlab-ce   "/assets/wrapper"   13 minutes ago   Up 12 seconds (health:
36fc44248800   gitlab/gitlab-ce   "/assets/wrapper"   57 minutes ago   Exited (137) 18 minutere_poitras
d9e431790dfa   gitlab/gitlab-ce   "--help"            58 minutes ago   Created               igent_hopper

当状态变成了healthy之后,就可以进入下一步的工作:

[dechin-manjaro gitlab]# docker ps -n 3
CONTAINER ID   IMAGE              COMMAND             CREATED             STATUS             
c12732a4acfb   gitlab/gitlab-ce   "/assets/wrapper"   15 minutes ago      Up 2 minutes (healt
36fc44248800   gitlab/gitlab-ce   "/assets/wrapper"   About an hour ago   Exited (137) 20 min_poitras
d9e431790dfa   gitlab/gitlab-ce   "--help"            About an hour ago   Created            ent_hopper

Gitlab配置

在前面的步骤都执行成功后,我们应该可以在浏览器中输入http://192.168.0.105:82/(这里注意替换本地ip地址,Linux系统可以通过ifconfig获取)打开Gitlab的管理界面如下:

首次登录会被要求重设密码,帐号是root。重设完密码之后,就可以进入Gitlab的登录页面:

输入root帐号和刚才设定的密码之后,就可以登录进入Gitlab主页:

在主页上点击创建项目,可以新建一个本地的项目:

创建好项目后的项目主页如下:

这里因为我们略过了一个步骤,在第一次使用Gitlab平台的时候,需要使用RSA加密生成密钥对,点击刚才界面上的添加ssh key进入添加密钥对的界面:

此时我们需要在本地终端窗口中执行如下的指令来产生密钥对:

[dechin@dechin-manjaro projects]$ ssh-keygen -t rsa -b 2048
Generating public/private rsa key pair.
Enter file in which to save the key (/home/dechin/.ssh/id_rsa): private_gitlab.pub # 文件名,可以不加pub
Enter passphrase (empty for no passphrase):  # 输入自定义密码
Enter same passphrase again:  # 再次输入自定义密码
Your identification has been saved in private_gitlab.pub
Your public key has been saved in private_gitlab.pub.pub
The key fingerprint is:
SHA256:Xr3DhNi+8ZMJ×××××××××××××××××××0w dechin@dechin-manjaro
The key's randomart image is:
+---[RSA 2048]----+
|o..              |
|.. o. . .        |
|..+o + *         |
|   . E o.oo++o   |
|    o   . .++.   |
|     o..  . ..   |
+----[SHA256]-----+

执行完该指令会在当前目录下产生两个密钥文件:

[dechin@dechin-manjaro projects]$ ll
总用量 8
-rw------- 1 dechin dechin 1876  5月  5 16:43 private_gitlab.pub
-rw-r--r-- 1 dechin dechin  403  5月  5 16:43 private_gitlab.pub.pub

其中少一个pub的文件是私钥,不应该暴露出来,而多一个pub的文件是公钥,需要复制这个文件中的字符串,输入到刚才Gitlab的配置中:

[dechin@dechin-manjaro projects]$ cat private_gitlab.pub.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDt6VXrvTPhWr5iUy3KpIzRryX3SGBUAYietTMSqEOuZjRXr1u14lFk1cT5jwAHw7BtnfBOrwptTIYaWztoWR94gG1W1KFc6HRY0SWrUHtwXwOypWcqMv7Z2AT6TFIgNf/2ZZAlYisC0G9xTO5qTcYDyJe/88zcIm/5B6NQ7safAkGkGYY+WrFxBpnNU2bEdSbx4Sem2v2TD9GRxSg9RpLSXQaULi1bpDgGfxLJZBxj2Eeo11j9ayjipWFqJ43pJ dechin@dechin-manjaro

一般是以ssh-rsa开头的字符串,输入完成后点击Add Key,即可完成密钥对的配置:

代码仓基本操作

在完成前面章节的基本配置之后,就可以使用https的方式将需要托管的代码仓库clone下来同步操作,首先复制仓库链接:

到本地终端窗口执行git clone指令:

[dechin@dechin-manjaro projects]$ git clone http://192.168.0.105:82/root/myfirstproject.git
正克隆到 'myfirstproject'...
Username for 'http://192.168.0.105:82': root
Password for 'http://root@192.168.0.105:82': 
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
接收对象中: 100% (3/3), 完成.

完成克隆操作后,可以在当前目录下看到一个新生成的与仓库同名的文件夹,里面仅有一个项目初始化的readme文件,这也是创建项目时候所选择的配置:

[dechin@dechin-manjaro projects]$ ll
总用量 12
drwxr-xr-x 3 dechin dechin 4096  5月  5 16:50 myfirstproject
-rw------- 1 dechin dechin 1876  5月  5 16:43 private_gitlab.pub
-rw-r--r-- 1 dechin dechin  403  5月  5 16:43 private_gitlab.pub.pub
[dechin@dechin-manjaro projects]$ cd myfirstproject/
[dechin@dechin-manjaro myfirstproject]$ ll
总用量 4
-rw-r--r-- 1 dechin dechin 44  5月  5 16:50 README.md

关于更多的git相关操作,读者可以参考这一篇博客,这里我们仅为了展示本地部署的gitlab的使用场景演示:

[dechin@dechin-manjaro myfirstproject]$ mkdir src # 创建一个src目录
[dechin@dechin-manjaro myfirstproject]$ cd src/
[dechin@dechin-manjaro src]$ touch .gitkeep # 创建一个gitkeep文件,可以使得目录不被简化,空目录无法被git识别
[dechin@dechin-manjaro src]$ git status # 查看修改状态
位于分支 master
您的分支与上游分支 'origin/master' 一致。

未跟踪的文件:
  (使用 "git add <文件>..." 以包含要提交的内容)
        ./

提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)
[dechin@dechin-manjaro src]$ git add ./ # 添加当前目录下的所有修改
[dechin@dechin-manjaro src]$ git commit -m 'Create a folder from localhost' 提交修改说明
[master 211278b] Create a folder from localhost
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 src/.gitkeep
[dechin@dechin-manjaro src]$ git push # 推送修改
Username for 'http://192.168.0.105:82': root # 输入gitlab的用户名
Password for 'http://root@192.168.0.105:82': # 输入gitlab的密码
枚举对象中: 5, 完成.
对象计数中: 100% (5/5), 完成.
使用 8 个线程进行压缩
压缩对象中: 100% (2/2), 完成.
写入对象中: 100% (4/4), 327 字节 | 327.00 KiB/s, 完成.
总共 4(差异 0),复用 0(差异 0),包复用 0
To http://192.168.0.105:82/root/myfirstproject.git
   5ee2b12..211278b  master -> master

提交修改前后对比:


我们可以看到push完成后,Gitlab项目界面上多了一个src目录出来,这就说明变更提交成功了,而且每一次变更的说明信息都会被保存,最近一次的变更说明会在主页上显示出来。接下来再试试Gitlab的分支管理,新建一个分支,然后直接提交:

[dechin@dechin-manjaro myfirstproject]$ git checkout -b dev
切换到一个新分支 'dev'
[dechin@dechin-manjaro myfirstproject]$ git push
fatal: 当前分支 dev 没有对应的上游分支。
为推送当前分支并建立与远程上游的跟踪,使用

    git push --set-upstream origin dev

[dechin@dechin-manjaro myfirstproject]$ git push --set-upstream origin dev
Username for 'http://192.168.0.105:82': root
Password for 'http://root@192.168.0.105:82': 
总共 0(差异 0),复用 0(差异 0),包复用 0
remote: 
remote: To create a merge request for dev, visit:
remote:   http://192.168.0.105:82/root/myfirstproject/-/merge_requests/new?merge_request%5Bsource_branch%5D=dev
remote: 
To http://192.168.0.105:82/root/myfirstproject.git
 * [new branch]      dev -> dev
分支 'dev' 设置为跟踪来自 'origin' 的远程分支 'dev'。


上传新的分支之后,就会在分支列表中看到不同的分支。那么除了这些提交修改同步的功能之外,Gitlab也有类似于Github的工作管理界面,比如个人活跃度:

比如基于Merge Request和Issue的任务提交与下发系统:

在同一个无线网络的局域网下,使用手机等终端设备也可以访问该私有的Gitlab仓库:

基本上功能还是比较完善的。而关于自动化集成的方案,会在后续介绍Jenkins的博客中再展开说明。

总结概要

本文按照操作流程的时间顺序,分别介绍了Gitlab的Docker容器部署、Gitlab平台的基本配置以及基于Git的代码仓基本管理与同步方法。通过掌握这一套的流程,就可以实现在本地构建一个类似于Github的代码托管系统,在企业内网更好的管理私有代码仓库,避免因为在Github上进行代码开发而被其他企业窃取核心技术。

版权声明

本文首发链接为:https://www.cnblogs.com/dechinphy/p/gitlab.html
作者ID:DechinPhy
更多原著文章请参考:https://www.cnblogs.com/dechinphy/

参考链接

  1. https://blog.csdn.net/shan165310175/article/details/92797199#commentBox
posted @ 2021-05-05 19:48  DECHIN  阅读(1565)  评论(5编辑  收藏  举报