GitLab(持续更新)

GitLab

第一节 介绍

  GitLab是由GitLab Inc.开发,使用MIT许可证的基于网络的Git仓库管理工具。它由 Ruby 写成。后来一些部分用 Go 语言重写。

1.1 GitLab和GitHub区别

  GitLab和GitHub都是基于git的web代码仓库管理软件。

  区别主要在于github上的仓库基本上都是开源的,当然也可以创建私有的代码仓库,但是费用比较昂贵。而gitlab是可以在企业内部搭建的开源工具,可以创建私有的代码仓库,除此之外,gitlab还有一些其他的高级特性。

  相同之处是他们都是基于版本管理系统git,都使用git的命令进行操作。

1.2 为什么要使用GitLab?

  GitLab是集中服务器上管理git存储库的一个好方法。 GitLab让您可以完全控制您的存储库或项目,并允许您自己决定是公共还是私有。


第二节 安装

2.1 选择版本

  GitLab是建立在开放核心模型之上的。这意味着GitLab有两个版本: 社区版企业版

  社区版是开放源码的,拥有MIT的外籍许可证。企业版构建在社区版之上,使用相同的核心,但在此基础上添加了其他特性和功能,这是在专有许可下进行的。

  对于这两个版本: GitLab中的所有javascript代码都是开源的。所有由GitLab编写的javascript代码都在同一个MIT许可下。

  社区版升级到企业版的过程中需要停机,如果没有许可证企业版不会和社区版有明显差异。

Install GitLab Enterprise Edition.

Install GitLab Community Edition.

2.2 过程

  此次安装的环境是 CentOS ,首先键入以下命令调整防火墙。

1
2
3
4
5
6
sudo yum install -y curl policycoreutils-python openssh-server
sudo systemctl enable sshd
sudo systemctl start sshd
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo systemctl reload firewalld

  此时可能会提示 FirewallD is not running ,通过 systemctl status firewalld 查看firewalld状态,发现当前是 dead 状态,即防火墙未开启。

sudo systemctl status firewalld

  通过 systemctl start firewalld 开启防火墙,没有任何提示即开启成功。

sudo systemctl start firewalld

  再重新键入之前执行失败的指令,然后安装 curl(系统一般默认会安装)

yum -y install curl

  安装 postfix 来发送通知邮件(系统默认安装)。

1
2
3
sudo yum install postfix
sudo systemctl enable postfix
sudo systemctl start postfix

  启动 postfix 服务失败,查看日志

sudo journalctl -xe

  提示:postfix[5181]: fatal: parameter inet_interfaces: no local interface found for ::1

  修改 /etc/postfix/main.cf 文件中 inet_interfaces = localhostinet_interfaces = all

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cd /etc/postfix/

vi main.cf

# 查询关键字
/inet_interfaces

# 进入编辑模式
i

# 修改后恢复命令模式
[ESC]

# 保存并退出
:wq

  再次启动postfix服务正常。

  然后添加 GitLab package repository

1
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh | sudo bash

  接下来安装GitLab包,将 https://gitlab.example.com 更改为要访问gitlab实例的URL。安装将自动配置并在该URL启动GitLab。

  对于 https://URLs ,GitLab将自动请求一个带有 Let's Encrypt 的证书,该证书需要入站HTTP访问和有效的主机名。您也可以使用自己的证书或只使用 http://

1
sudo EXTERNAL_URL="https://gitlab.example.com<替换>" yum install -y gitlab-ee

  修改 EXTERNAL_URL ,修改文件 gitlab.rbexternal_url'http://xx:xx' ,然后更新配置并重启gitlab,尝试访问 external_url 发现对应地址不能访问。

1
2
3
4
5
vi  /etc/gitlab/gitlab.rb
--重置配置
sudo gitlab-ctl reconfigure
--重启gitlab服务
sudo gitlab-ctl restart

  排查问题,尝试开放端口号 6725 ,(阿里云还要在控制台安全组开放端口),再次测试访问成功。

1
2
3
sudo firewall-cmd --add-port=6725/tcp --permanent
sudo firewall-cmd --reload
sudo firewall-cmd --list-ports

  后续使用时,笔者服务器无法正常发送邮件,所以这里可以先配置好邮件信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
vi /etc/gitlab/gitlab.rb

gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.aliyun.com"
# 可以使用25/80/465端口,目前ECS的25端口都已被封,465端口为SSL专用
gitlab_rails['smtp_port'] = 80
gitlab_rails['smtp_user_name'] = "xxx@xxx.com"
gitlab_rails['smtp_password'] = "yourpassword"
gitlab_rails['smtp_domain'] = "smtp.aliyun.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
# smtp_tls默认为false,465端口时可以设置为true
gitlab_rails['smtp_tls'] = false

gitlab_rails['gitlab_email_enabled'] = true
gitlab_rails['gitlab_email_from'] = 'xxx@xxx.com'
gitlab_rails['gitlab_email_display_name'] = 'Gitlab'

  重配置使修改生效。

1
sudo gitlab-ctl reconfigure

  测试是否可以发送邮件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
sudo gitlab-rails console

# 进入控制台,然后发送邮件,quit退出irb
irb(main):005:0> Notify.test_email('xxx@qq.com','','').deliver_now
Notify#test_email: processed outbound mail in 0.7ms
Delivered mail 5e670eee3cec5_3bdd3f8a371cf9c04373b@iZ8vbg7nvxmv212e2psv0wZ.mail (322.6ms)
Date: Tue, 10 Mar 2020 11:52:14 +0800
From: GitLab <quxue01@mail.qxamoy.com>
Reply-To: GitLab <noreply@39.101.219.146>
To: 306488962@qq.com
Message-ID: <5e670eee3cec5_3bdd3f8a371cf9c04373b@iZ8vbg7nvxmv212e2psv0wZ.mail>
Mime-Version: 1.0
Content-Type: text/html;
charset=UTF-8
Content-Transfer-Encoding: 7bit
Auto-Submitted: auto-generated
X-Auto-Response-Suppress: All

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">

Traceback (most recent call last):
2: from (irb):5
1: from (irb):5:in `rescue in irb_binding'
Net::SMTPAuthenticationError (526 Authentication failure[0])

如果提示异常:Gitlab: Can not set relay address for email (state=SSLv2/v3 read server hello A: unknown protocol”),则需要开启 smtp_tls 选项,即:gitlab_rails[‘smtp_tls’] = false

  提示异常:Net::SMTPAuthenticationError: 535 Error: authentication failed

  首先我使用了 465 端口,但未升级SSL,所以先排查是否是这个原因。

  修改端口为 80 ,然后重配置使修改生效。

1
sudo gitlab-ctl reconfigure

  再次测试邮件,仍未收到。

1
2
3
Traceback (most recent call last):
1: from (irb):1
Net::OpenTimeout (execution expired)

  认真检查了一下,对比阿里云SMTP帮助文档,发现SMTP配置有问题,修改如下。

1
2
3
vi /etc/gitlab/gitlab.rb

gitlab_rails['smtp_address'] = "smtpdm.aliyun.com"

  重配置,测试,成功收到邮件(垃圾箱)。

CI/CD

2.3 扩展

  使用一段时间后发现偶尔会有卡顿情况,所以抽时间看一下是什么原因。

  首先远程服务器,通过 free -m 查看内存占用情况。

  通过 top -d 3 查看系统情况。

  Shift + m 按内存排序,结果如下。

2.3.1 unicorn

  首先尝试 unicorn 改小进程数和内存占用。

  通过ps aux|grep unicorn|wc -l 查看unicorn进程数。

  通过 vim /etc/gitlab/gitlab.rb 修改如下内容。

1
2
3
4
unicorn['worker_processes'] = 2

unicorn['worker_memory_limit_min'] = "512 * 1 << 20"
unicorn['worker_memory_limit_max'] = "640 * 1 << 20"

  重启GitLab gitlab-ctl reconfigure + gitlab-ctl restart

2.3.2 swap

  阿里云服务器默认是没有swap的,理由似乎是这样的:swap主要是内存不够用的时候,将内存中不使用的一些内容放到swap中,内存会和swap频繁交换数据,这个可能会引起io的问题。如果内存够用,除非有特殊情况,比如安装oracle,因此建议不使用swap。

  但似乎现在内存不够用。

  通过cat /proc/swaps 确认是否启用swap。

  通过 df -h 查看磁盘使用情况。

  通过 dd if=/dev/zero of=/var/swap bs=1M count=2048 创建 swap 分区。

  创建swap大小为:bs * count = 2147483648 bytes (2.1 GB)/data/swap 目录若无则找 /mnt/swap

  通过 mkswap /var/swap 将上面新建出的文件做成swap分区。

  通过 swapon /var/swap 启用 swap 分区。

  通过 free -m 确认是否开启成功。

  此时虽然可以使用swap,但重启后仍不能自动挂载。

  通过 vim /etc/fstab 添加如下内容,或直接 echo "/data/swap swap swap defaults 0 0" >> /etc/fstab 将swap加入到fstab文件中使其自动挂载。

1
/var/swap swap swap defaults 0 0

  阿里云默认是不让用户使用swap的,我们需要编辑/etc/rc.d/rc.local文件,将文件中的swapoff行注释或删掉

  vim /etc/rc.d/rc.local ,我的服务器此文件并未有如下配置,遂跳过。

1
#swapoff -a

  接下来将 linux kernal swap 调整到适当比例。

  可以通过配置文件:/etc/sysctl.conf ,修改: vm.swappiness = 10 ,使其一直生效,然后重启。

  或者通过 sysctl -w vm.swappiness=10 使其运行时生效。

  cat /proc/sys/vm/swappiness + sysctl -w vm.swappiness=10


第三节 使用

3.1 SSH 密钥

  SSH密钥用于管理网络、操作系统和配置的Secure Shell或Secure Socket Shell,通过HTTP和SSH可以去做克隆和提交代码,HTTP需要每次提交的时候输入邮箱号和密码,SSH则比较方便,通过生成一个密钥和一个公钥,这个公钥可以使用在GitHub,GItLab,内网GitLab中。

  大多数 Git 服务器都会选择使用 SSH 公钥来进行授权。系统中的每个用户都必须提供一个公钥用于授权,没有的话就要生成一个。

  您可以设置SSH密钥以提供计算机与GitLab之间的可靠连接。 在生成ssh keygen之前,您需要在系统中安装Git。

  生成公钥的过程在所有操作系统上都差不多。首先你要确认一下本机是否已经有一个公钥。

  SSH 公钥默认储存在账户的主目录下的 ~/.ssh 目录。

  id_rsa和id_rsa.pub(或者是id_dsa和id_dsa.pub之类成对的文件),有 .pub 后缀的文件就是公钥,另一个文件则是密钥。

  假如没有这些文件,甚至连 .ssh 目录都没有,可以用 ssh-keygen 来创建。在 Linux/Mac 系统上由 SSH 包提供,而在 Windows 上则包含在 GitBash 里面里:

  打开 Git Bash ,通过 ssh-keygen 生成SSH密钥。

1
2
3
4
5
6
$ ssh-keygen
# OR
$ ssh-keygen -t rsa -C "xxx@xxx.com"

--查看生成的公钥
vim id_rsa.pub

  登录GitLab,点击右上角头像 -> Settings -> 左栏 SSH Keys -> 复制之前生成的.pub文件中的SSH密钥 -> save / add key

3.2 新增用户

  管理员身份登录GitLab,扳手图标 Admin Area -> users -> 填写基本信息

3.3 管理工作组

  新增工作组:管理员身份登录GitLab,Groups -> new group -> 填写基本信息

  为工作组配置成员Admin Area -> Groups -> 点击工作组 -> 选择用户和身份 -> add users to group

3.4 成员权限

  用户具有不同的能力,具体取决于他们在特定组或项目中的访问级别。如果用户同时在组的项目和项目本身中,则使用最高权限级别。在公共和内部项目中,不会强制实施Guest角色。所有用户都可以创建问题,发表评论,克隆或下载项目代码。当成员离开团队时, 将自动取消分配所有分配的问题和合并请求。GitLab 管理员获得所有权限。

项目成员角色

  • Guest - 游客,可以创建issue、发表评论,不能读写版本库
  • Reporter - 产品经理,可以克隆代码,不能提交,可以赋予测试
  • Developer - 开发者,可以克隆代码、开发、提交、push
  • Master (11.0版本中已重命名为 Maintainer) - 维护者,可以创建项目、添加tag、保护分支、添加项目成员、编辑项目,一般GitLab管理员或者CTO才有此权限
  • Owner - 所有者

  项目成员权限。

Action Guest Reporter Developer Maintainer Owner
创建新问题
创建机密问题
查看机密问题
留言
查看相关问题
查看工作列表
查看工作日志
下载并浏览作业工件
查看维基页面
查看许可证管理报告
查看安全报告
查看项目代码
拉项目代码
下载项目
分配问题
分配合并请求
标签问题
标签合并请求
创建代码段
管理问题跟踪器
管理标签
查看提交状态
查看容器注册表
查看环境
查看合并请求列表
管理相关问题
锁定问题讨论
从漏洞创建问题
查看错误跟踪列表
锁定合并请求讨论
创建新环境
停止环境
管理/接受合并请求
创建新的合并请求
创建新分支
推送到未受保护的分支机构
强制推送到不受保护的分支机构
删除未受保护的分支
添加标签
写一个维基
取消并重试作业
创建或更新提交状态
更新容器注册表
删除容器注册表图像
创建/编辑/删除项目里程碑
查看已批准/列入黑名单的许可
使用安全仪表板
解除漏洞
应用代码更改建议
使用环境终端
运行Web IDE的交互式Web终端
添加新的团队成员
推送到受保护的分支
启用/禁用分支保护
为开发人员打开/关闭受保护的分支推送
启用/禁用标签保护
重写/删除Git标签
将部署密钥添加到项目中
配置项目挂钩
管理跑步者
管理工作触发器
管理变量
管理GitLab页面
管理GitLab Pages域和证书
删除GitLab页面
查看受访问控制保护的GitLab页面
管理集群
管理许可证政策
编辑评论(由任何用户发布)
管理错误跟踪
切换可见性级别
将项目转移到另一个名称空
删除项目
删除问题
删除页面
强行推动受保护的分支机构
删除受保护的分支
查看项目审核事件

  组成员权限

Action Guest Reporter Developer Maintainer Owner
浏览组
编辑组
创建子组
在组中创建项目
管理小组成员
删除组
管理组标签
创建/编辑/删除组里程碑
查看组史诗
创建/编辑组史诗
删除组史诗
查看组审核事件

  GitLab CI / CD权限

Action Guest,Reporter Developer Maintainer Admin
查看提交和工作
重试或取消工作
擦除作业工件和跟踪
删除项目
创建项目
更改项目配置
添加特定的跑步者
添加共享的运行者
查看系统中的事件
管理界面

  工作权限

Action Guest, Reporter Developer Maintainer Admin
运行CI作业
从当前项目克隆源和LFS
从公共项目克隆源和LFS
从内部项目克隆源和LFS
私有项目的克隆源和LFS
推送源和LFS
从当前项目中提取容器图像
从公共项目中提取容器图像
从内部项目中提取容器图像
从私人项目中提取容器图像
将容器图像推送到当前项目
将容器图像推送到其他项目

3.5 项目管理

  新建项目New Project -> 填写项目基本信息。

  分别填写 项目名项目路径 (BaseUrl + Group + ProjectName/Slug)、项目描述可见性级别是否初始化ReadMe文档

  还可以 根据模板生成项目导入项目

  配置项目成员项目 -> Settings -> Members -> 添加成员或添加小组

3.6 Fork

  Fork分叉,表示克隆一份原库的副本,是服务端的代码库克隆,包含了原库所有内容,并且与原库相互隔离。

  在项目内 点击Fork

  选择 命名空间 (namespace),如果提示没有命名空间权限,可以先创建一个分组。

  可以看到会创建一份新的 Demo 项目。

  通过 Pull Request 可以合并回原仓库。

  在GitHub中 Fork 比较常见,大部分的作者都愿意看到有人Fork自己的仓库,并作出贡献和提高知名度。

3.7 分支管理

  新增分支项目 -> Repository -> Branches -> 新增分支

  一般情况下,一个项目会包含以下四种分支:

  • master:主分支,有且只有一个,主干
  • release:线上分支,一般为线上版本,当线上版本发布后会将release分支合并到master
  • develop:开发分支,通产给测试部署环境或者打包的分支,每个人在自己的分支上开发完成后,向develop分支合并
  • feature:通常是一个功能分支或者个人分支,每个公司的用法不一样,feature分支一般会有很多个,通常merge完成后会删除

Git分支图

3.8 CI/CD管理

  CI/CD-持续集成和持续交付

  GitLab配置CI持续集成

  gitlab-ci.yml语法

3.9 BUG管理

  GitLab可以使用 issue 功能来进行BUG管理

3.9.1 issue

  issue如其字母意思,可以理解为问题事务,表示一项待完成的工作。

使用场景

  • 接受功能建议、问题,支持请求或错误报告
  • 跟踪任务和工作状态
  • 讨论新想法的实施
  • 详细说明新的代码实现

  issue最初是解决问题追踪工单管理,经过发展,逐渐演变为功能齐全的项目管理工具,可以用于制定和实施软件开发计划。

Issue应具备的功能:

  • 项目管理
      - 指定 Issue 的优先级
      - 指定 Issue 所在的阶段
        - 分配负责 Issue 的处理人员
            - 制定日程
          - 监控进度,提供统计
    
  • 团队合作
      - 讨论
      - 邮件通知
  • 代码管理
      - 将 Issue 关联源码
      - 将 Issue 关联代码提交与合并

3.9.2 GitLab Issues

  项目内点击 Issues -> New issue

  分别填写标题、描述、分配用户、设置里程碑、标签等。

  提交后创建了一个新的issue。

  本地处理问题,首先拉取最新代码。

  新建分支 issue-fix

1
$ git checkout -b issue-fix

  添加内容到 README.md 文件中,表示工作内容,并提交。

1
$ echo "fix this bug" >> README.md

  提交命令打开如下内容,可以通过 insert 添加提交信息。

  将分支推送到远程仓库。

3.10 Merge Request

  项目 -> Merge Request -> New

  分别选择源分支目标分支

  分别填写标题、说明、分配用户、设置里程碑、标签等。

  提交后进入合并请求详情界面。

3.11 Labels

  未完待续……

3.12 Milestones

  未完待续……

3.13 备份

  未完待续……


第四节 开发案例

  我们首先使用管理员身份,登陆GitLab创建项目,把服务器上的文件克隆下来。

1
git clone git@xxx

  新建feature分支,并切换到新的分支。

1
git checkout -b branch/20190911

  新建文件hello.txt,随意填写内容,将所有有改动的全部添加到要提交的本地库中。

1
2
3
cd xxx

git add .

  将修改提交到本地库。

1
git commit -a -m "add hello.txt"

  项目切换owner到master,然后执行merge,合并分支到本地master,将本地库的commit推送到远程服务器,此处因为我们是管理员身份,所以可以直接修改源码。

1
2
3
git checkout master  
git merge --no-ff branch/0111 -m 'xxx'//显示Already up-to-date.说明合并成功
git push origin master//上传主干

  但大部分情况下,我们参与一些团队项目,是作为一名开发者工作,所以要先Fork项目的代码,新建一个feature分支,在本地开发自测完成后,再合并到develop分支(测试环境)

  假设我们目前是开发者用户,前面步骤相同,不同在一直使用开发分支,并推送到远程仓库的开发分支。

1
2
3
4
5
6
7
8
--第一种方式,我们直接
git checkout develop
git merge --no-ff <分支名> -m 'xxx' up-to-date.说明合并成功
git push origin develop

--
git push origin <分支名>

  发起一个pull request请求合并分支,经过审核后代码合并到develop中,经过测试稳定后合并到master分支。


第五节 常用指令

1
2
3
4
5
6
7
8
9
git init

git add .

git commit -m ""

git remote add origin XXX

git push origin master

  拉取服务器上最新资源:

1
git pull    

  在不同的分支之间切换,注意事项:切换分支的时候,如果当前分支有改动没有提交,是不能切换分支的,需要先把改动的内容提交或者放入缓存区

1
2
3
git checkout <分支名>

git checkout release/v1.0.0

  合并分支,从当前分支merge feature/login分支的内容,如果有两个人修改了同一个文件的同一行,则会有冲突,可以在IDE工具上先解决当前冲突然后再提交。

1
2
3
git merge <分支名>

git merge feature/login

  查看本次修改了哪些内容。

1
git diff 

  此处不再更新,详细请参考:Git常用指令


参考博客和文章书籍等:

gitlab社区版和企业版

GitLab官网安装文档

Gitlab Docs - Permissions

Gitlab Docs - Issues

安装 Docker 和 Docker Compose (Ubuntu)

使用 Docker 搭建 GitLab

搭建gitlab仓库

服务器上的 Git - GitLab

Gitlab详细操作

Gitlab服务搭建

gitlab内存消耗大,频繁出现502错误的解决办法

Rebase 代替合并

因博客主等未标明不可引用,若部分内容涉及侵权请及时告知,我会尽快修改和删除相关内容