技术背景

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

基于Docker配置本地Gitlab的更多相关文章

  1. 搭建并配置本地GitLab服务器教程

    由于工作单位不一定能够方便使用外部网络,现以下载rpm包来搭建一套本地GitLab服务器. 1. 系统准备 系统:redhat 7.3 2. 下载所需安装包 去官网下rpm包,下载地址,ce是免费的社 ...

  2. 上穷碧落下凡尘:Win10系统下基于Docker配置Elasticsearch7配合Python3进行全文检索交互

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_166 基于文档式的全文检索引擎大家都不陌生,之前一篇文章:使用Redisearch实现的全文检索功能服务,曾经使用Rediseac ...

  3. Docker配置本地镜像与容器的存储位置

    默认情况下Docker的存放位置为:/var/lib/docker 可以通过下面命令查看具体位置: sudo docker info | grep "Docker Root Dir" ...

  4. 基于docker搭建Jenkins+Gitlab+Harbor+Rancher架构实现CI/CD操作(续)---Harbor的安装

    前期安装文档:https://www.cnblogs.com/lq-93/p/11828626.html Harbor的作用:     开发提交代码至gitlab容器中,Jenkins拉取代码构建镜像 ...

  5. 基于docker搭建Jenkins+Gitlab+Harbor+Rancher架构实现CI/CD操作(续)

    说明:前期的安装,请转向https://www.cnblogs.com/lq-93/p/11824039.html (4).查看gitlab镜像是否启动成功 docker inspect  容器id  ...

  6. 基于docker搭建Jenkins+Gitlab+Harbor+Rancher架构实现CI/CD操作

    一.各个组件的功能描述: Docker 是一个开源的应用容器引擎. Jenkis 是一个开源自动化服务器. (1).负责监控gitlab代码.gitlab中配置文件的变动: (2).负责执行镜像文件的 ...

  7. ubunt 基于deb 配置本地apt 源 分成仅本机使用,局域网使用2种

    dpkg-scanpackages /software /dev/null | gzip>/software/Packages.gz

  8. 基于Docker在Win10平台搭建Ruby on Rails 6.0框架开发环境

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_170 2020年,"非著名Web框架"–Ruby on Rails已经15岁了.在今年,Rails 6.0趋于 ...

  9. 如何搭建基于Docker的gitlab服务器集成CI/CD实现DEVOPS(完整版)

    From this lesson you will learn about 1,How to install and configure a docker based gitlab server 2, ...

随机推荐

  1. 关于GitHub 搭建 Hexo 总结

    问题描述 在更新上传了一篇新博客后,本地运行http://localhost:4001正常,而连接到Github仓库便爆出404错误. 更新博客后,依次执行: 1 hexo clean 2 hexo ...

  2. 微信小程序警告设置 enable-flex 属性以使 flexbox 布局生效的解决办法

    微信小程序警告设置 enable-flex 属性以使 flexbox 布局生效的解决办法 具体情况: scroll-view 滚动,设置 display:flex 不生效并警告设置 enable-fl ...

  3. ACM STU week3

    STU ACM训练week3(2.5-2.15) By@Xiezeju 训练计划的CP4配套资源库 训练时间安排 定期任务 任务 每日 进行1小时的盲打训练锻练手速 打字网站,最好注册账号以保存进度 ...

  4. java 基础语法学习

    kuangstudy 注释 单行注释 多行注释 文档注释 public class HelloWorld { public static void main(String[] args) { //单行 ...

  5. Distributed Cache(分布式缓存)-SqlServer

    分布式缓存是由多个应用服务器共享的缓存,通常作为外部服务存储在单个应用服务器上,常用的有SqlServer,Redis,NCache. 分布式缓存可以提高ASP.NET Core应用程序的性能和可伸缩 ...

  6. android分析之消息处理

    前序:每个APP对应一个进程,该进程内有一个ActivityThread的线程,称为主线程(即UI主线程),此外,还有其他线程,这个再论. android的消息系统分析. 每个Thread只对应一个L ...

  7. EF Core 原理从源码出发(二)

    紧接着我的上一篇博客,上回分析到ef 一个重要的对象,changetracker这个对象,当我们向DbContext添加对象的时候我们会调用如下代码. 1 private EntityEntry< ...

  8. ElasticSearch实战系列十: ElasticSearch冷热分离架构

    前言 本文主要介绍ElasticSearch冷热分离架构以及实现. 冷热分离架构介绍 冷热分离是目前ES非常火的一个架构,它充分的利用的集群机器的优劣来实现资源的调度分配.ES集群的索引写入及查询速度 ...

  9. AttributeError: 'str' object has no attribute 'lowerr' Python常见错误

    方法名拼写错误 检查方法名拼写,如有错误改正即可 特别注意m和n

  10. elasticsearch 7.7 配置文件:elasticsearch.yml

    # ======================== Elasticsearch Configuration ========================= # # NOTE: Elasticse ...