技术背景

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. MySQL深入研究--学习总结(1)

    前言 本文是笔者学习"林晓斌"老师的<MySQL实战45讲>过程中的,对知识点的总结归纳以及对问题的思考记录,课程18年11月就出了,当时连载形式,我就上班途中一边开车 ...

  2. 2020年Python最新面试题(一):Python基础

    转: 2020年Python最新面试题(一):Python基础 目录 1. 什么是 Python?使用 Python 有什么好处? 2. Python中常用的关键字有哪些? 3. Python 2.x ...

  3. 怎样将大批量文件进行循环分组(reduce)?

    背景   当有时候一个文件夹下有几万个几十万个文件时,我们的桌面终端打开这个文件夹可能会卡.或者将文件进行批量上传时,如果是在文件夹下全选,那么基本上浏览器就卡死了,当然也不能这样子操作滴~   题主 ...

  4. 追溯 MySQL Statement Cancellation Timer

    原文 1. 背景 在 jstack 的内容中可以看到以下的 MySQL Statement Cancellation Timer 守护线程, 在业务高峰期的时候会出现大量的这类守护线程, 由此追溯该线 ...

  5. Why系列:谨慎使用delete

    题外话 这里大家可能要笑了,这不就一个操作符吗,还用单独来讲. 有这时间,还不如去看看react源码,vue源码. 我说:react源码会去看的,但是这个也很重要. delete你了解多少 这里提几个 ...

  6. 使用jhipster 加速java web开发

    jhipster,中文释义: Java 热爱者! JHipster is a development platform to quickly generate, develop, & depl ...

  7. c语言链表从本地文件中读取和写入数据

    1 typedef struct Data{ 2 40 char *name; 3 41 char *IDCARD; 4 42 char *job_id; 5 43 char *length; 6 4 ...

  8. 在C#中使用 CancellationToken 处理异步任务

    在 .NET Core 中使用异步编程已经很普遍了, 你在项目中随处可见 async 和 await,它简化了异步操作,允许开发人员,使用同步的方式编写异步代码,你会发现在大部分的异步方法中,都提供了 ...

  9. Balanced Diet Gym - 102220B

    题目链接:https://vjudge.net/problem/Gym-102220B 题意:每组数据 给了 N和M表示有M种类型的糖果,这些糖果一共N个.接下了是 M 组数据,表示如果你选第 i 中 ...

  10. 攻防世界 reverse Mysterious

    Mysterious  BUUCTF-2019 int __stdcall sub_401090(HWND hWnd, int a2, int a3, int a4) { char v5; // [e ...