GitLab

Gitlab 代码仓库

1. 简介概述

与 GitHub 一样,GitLab 是一个基于Web的资源库管理器,可让团队协作处理代码,复制代码以安全地创建和编辑新项目,然后将完成的代码合并到现有项目中。

GitLab 是用Ruby编程语言编写的,包含Wiki 和问题跟踪功能。它有不同的版本:GitLab 社区版(CE),企业版(EE) 和 GitLab托管版本GitLab.com。

它拥有超过1400名贡献者,并被阿里巴巴,美国宇航局,欧洲核子研究中心等主要组织使用。

2. 什么是 Gitlab

  • GitLab 是一个开源分布式版本控制系统

  • 开发语言: Ruby

  • 功能:管理项目源代码、版本控制、代码复用与查找

3. GitLab 与 GitHub 的不同

  • Github 分布式在线代码托管仓库,个人版本可直接在线免费使用,企业版本收费且需要服务器安装。
  • Gitlab 分布式在线代码仓库托管软件,分社区免费版本与企业收费版本,都需要服务器安装。

4. Gitlab 的优势和应用场景

  • 开源免费,适合中小型公司将代码放置在该系统中

  • 品差异化的版本管理,离线同步以及强大分支管理功能

  • 便捷的GUI操作界面以及强大账户权限管理功能

  • 集成度很高,能够集成绝大多数的开发工具,支持内置HA,保证在高并发下仍旧实现高可用性

5. GitLab 主要服务构成

  • Nginx 静态Web服务器
  • Gitlab-workhorse 轻量级的反向代理服务器
  • Gitlab-shell 用于处理Git命令和修改authorized keys列表
  • Logrotate 日志文件管理工具
  • Postgresql 数据库
  • Redis 缓存服务器

6. GitLab 的工作流程

  • 创建并克隆项目
  • 创建项目某Feature分支
  • 编写代码并提交至该分支
  • 推送改项目分支至远程Gitlab 服务器
  • 进行代码检查并提交Master主分支合并申请
  • 项目领导审查代码并确认合并申请

7. 安装 Gitlab 仓库系统

打开一台虚拟机:192.168.2.1

添加hosts解析文件

[root@gitlab ~]# cat <<END>> /etc/hosts
192.168.2.1 gitlab.lemon.com
192.168.2.2 jenkins.lemon.com
192.168.2.3 lb.lemon.com
END

安装 Gitlab 依赖

[root@gitlab ~]# yum install -y policycoreutils openssh-server openssh-clients postfix lsof
[root@gitlab ~]# systemctl start postfix;systemctl enable postfix     #开启邮箱服务

安装 Gitlab-12.0.3 版本

由于国内网络偏慢,这里使用清华大学的镜像源进行安装gitlab-ce

[root@gitlab ~]# cat <<END>> /etc/yum.repos.d/gitlab-ce.repo
[gitlab-ce]
name=gitlab-ce
baseurl=http://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7
repo_gpgcheck=0
gpgcheck=0
enabled=1
#gpgkey=
END

[root@gitlab ~]# yum clean all && yum makecache

[root@gitlab ~]# yum -y install gitlab-ce-12.0.3-ce.0.el7

Gitlab 管理命令

[root@gitlab ~]# gitlab-ctl stop           #关闭gitlab

[root@gitlab ~]# gitlab-ctl start          #启动gitlab

[root@gitlab ~]# gitlab-ctl restart        #重启gitlab

[root@gitlab ~]# gitlab-ctl status         #状态gitlab

[root@gitlab ~]# gitlab-ctl reconfigure    #重载配置文件并启动glitlab

修改配置文件并启动 Gitlab

[root@gitlab ~]# vim /etc/gitlab/gitlab.rb
#配置gitlab的URL或IP地址
external_url 'http://gitlab.lemon.com'
#配置邮箱
### Email Settings
gitlab_rails['gitlab_email_enabled'] = true
gitlab_rails['gitlab_email_from'] = 'lemon_row@163.com'       #邮箱账号
gitlab_rails['gitlab_email_display_name'] = 'Gitlab-lemon'    #发送人显示名称
### GitLab email server settings
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtp.163.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "lemon_row@163.com"
gitlab_rails['smtp_password'] = "TZVLGNYMVOEWCIHR"            #授权码
gitlab_rails['smtp_domain'] = "163.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = true
gitlab_rails['smtp_tls'] = true
:wq
[root@gitlab ~]# gitlab-ctl reconfigure          #初始化gitlab,第一次会很慢

注意:重新配置应用程序。修改了 gitlab 服务配置文件后,都需要执行一下这个命令。让各个服务的配置文件,重新加载一下配置文件。这里等个4分钟左右。

[root@gitlab ~]# gitlab-ctl status                   #查看gitlab状态

提示:gitlab 需要使用到80端口,所以得保证80端口不被占用,或者改端口

[root@gitlab ~]# lsof -i:80

汉化 Gitlab

汉化包下载地址 ==> https://gitlab.com/xhang/gitlab.git

//查看gitlab的版本
[root@gitlab ~]# cat /opt/gitlab/embedded/service/gitlab-rails/VERSION
11.2.3

//下载对应版本的汉化包,解压汉化包,查看汉化包的版本
[root@gitlab ~]# cd /usr/local/src/
[root@gitlab src]# tar xf gitlab-v12.0.3-zh.tar.gz 
[root@gitlab src]# rm -rf gitlab-v12.0.3-zh.tar.gz 
[root@gitlab src]# cat gitlab-v12.0.3-zh/VERSION 
12.0.3

//先备份,避免汉化失败后gitlab瘫痪
[root@gitlab src]# mkdir gitlab.bak
[root@gitlab src]# cp -r /opt/gitlab/embedded/service/gitlab-rails/* /usr/local/src/gitlab.bak

//将下载好的汉化包覆盖拷贝过去
[root@gitlab src]# \cp -rf gitlab-v12.0.3-zh/* /opt/gitlab/embedded/service/gitlab-rails/
cp: 无法以目录"gitlab-v12.0.3-zh/log" 来覆盖非目录"/opt/gitlab/embedded/service/gitlab-rails/log"
cp: 无法以目录"gitlab-v12.0.3-zh/tmp" 来覆盖非目录"/opt/gitlab/embedded/service/gitlab-rails/tmp"

//重新配置gitlab
[root@gitlab src]# gitlab-ctl reconfigure

//重启gitlab
[root@gitlab src]# gitlab-ctl restart

//检查是否启动成功
[root@gitlab src]# gitlab-ctl status  
[root@gitlab src]# lsof -i:80

访问浏览器测试

注释:如果后期 web 界面访问时,总报 502的话,就把防火墙清空规则,另外内存要大于4G,不然以后内存不足,也报 502!

** Gitlab 默认用户是root,拥有最高权限,密码我设置的是“abc123..”,最少八位数。**

登陆 Gitlab

至此gitlab安装完成!

8. Gitlab 权限管理

创建Group,User,Project

  • 三者层级关系如下图:

创建一个组,组名为java

#Gitlab中的组和项目有三种访问权限:Private、Internal、Public

- Private:只有组成员才能看到
- Internal:只要登录的用户就能看到,开源项目和组设置的是Internal
- Public:所有人都能看到

创建一个PM的用户作为项目管理者并加入到java组内

  • 注意:这里的邮箱在公司里一定要写上真实的,我这里为了方便,就随便写上了一个

修改pm用户秘密: abc123..

将pm管理用户加入到java组内

Gitlab 权限管理:

Gitlab 用户在组中有五种权限:Guest、Reporter、Developer、Master、Owner

  1. Guest:可以创建issue、发表评论,不能读写版本库。
  2. Reporter:可以克隆代码,不能提交,QA、PM可以赋予这个权限。
  3. Developer:可以克隆代码、开发、提交、push,RD可以赋予这个权限。
  4. Maintainer:可以创建项目、添加tag、保护分支、添加项目成员、编辑项目,核心RD负责人可以赋予这个权限。
  5. Owner:可以设置项目访问权限 Visibility Level、删除项目、迁移项目、管理组成员,开发组leader能赋予这个权限。

用PM用户创建一个项目app1

在 gitlab 登陆页面下创建 dev1 dev2 用户,并作为开发者加入到 app1 项目中

  • 创建完了之后这两个用户很明显是看不到 app1 这个项目的

  • 所以需要登陆pm或root用户将其创建的用户添加到 java 组里面中或者 app1 项目中(授权)

  • 组成员添加完了之后 看一下 app1 项目中有没有添加这两个用户

  • 随便登陆这两个其中一个账号验证是否能够看到app1项目

9. gitlab 的基本使用

将 dev1 持有人的公钥放到 dev1 账号下

  • 开启一台虚拟机,192.168.2.6
#添加hosts解析文件
[root@dev1 ~]# cat <<END>> /etc/hosts
192.168.2.1 gitlab.lemon.com
192.168.2.2 jenkins.lemon.com
192.168.2.3 lb.lemon.com
END
[root@dev1 ~]# ssh-keygen 
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:R5PUO4f4FLhExQ6YaD6B20GMn1Fdgzw98YXtEX/jfMo root@dev1
The key's randomart image is:
+---[RSA 2048]----+
|     =.o.*oO=. +o|
|    o B o.O.*o.oo|
|     * = .+* =.o+|
|    . *  .o.* + +|
|       .S .o o o.|
|         .  .. ..|
|              E  |
|                 |
|                 |
+----[SHA256]-----+
[root@dev1 ~]# cat .ssh/id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDDzzBDqVPZ9H0nVKucS3B3QNx318tAan06c17dZ0npQpsoAZaMUFxneMH+zoEjd+cG5Ee7f2D2n+iqV0wLGYDs9CY/8RqsSZ9SSx9K2aM9I1XFP6AUpuM5ddI/b3nhBVcbFjzpEckXPMz3O4C0twO1/aRD4byFtyivfdrry/KDNrYEMGojzv7PuktIvC/Qp0vKpvNG7msD6ePg4eHKCunHNGIboojL/vckpJZkvDt0MuDbeHdIE8Gj1XNkoudyWrCVwNTj8TEUkZE6pE7fYfBOzC1gOWv/+evROmwYLioprRJx+ZklRe4YmJzHw7Qiia4CluidQyUquMT5geGIme/3 root@dev1

以ssh协议推送代码至远程仓库

[root@dev1 ~]# git config --global user.name "dev1"
[root@dev1 ~]# git config --global user.email "dev1@163.com"

[root@dev1 ~]# git clone git@gitlab.lemon.com:java/app1.git
正克隆到 'app1'...
warning: 您似乎克隆了一个空版本库。

[root@dev1 ~]# cd app1
[root@dev1 app1]# echo '# 第一次提交 测试' >> README.md
[root@dev1 app1]# git add .
[root@dev1 app1]# git commit -m "NOW 1 add README.md"
[master(根提交) e4c5af0] NOW 1 add README.md
 1 file changed, 1 insertion(+)
 create mode 100644 README.md

[root@dev1 app1]# git tag -a 'v1.0' -m '版本 1'
[root@dev1 app1]# git show --oneline v1.0
tag v1.0

版本 1
e4c5af0 NOW 1 add README.md
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..e4460ab
--- /dev/null
+++ b/README.md
@@ -0,0 +1 @@
+# 第一次提交 测试

[root@dev1 app1]# git push -u origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 241 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@gitlab.lemon.com:java/app1.git
 * [new branch]      master -> master
分支 master 设置为跟踪来自 origin 的远程分支 master。

[root@dev1 app1]# git push -u origin v1.0
Counting objects: 1, done.
Writing objects: 100% (1/1), 157 bytes | 0 bytes/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To git@gitlab.lemon.com:java/app1.git
 * [new tag]         v1.0 -> v1.0

下面以PM用户进行创建开发计划分配给dev2

  • 开启一台虚拟机,192.168.2.7
#添加hosts解析文件
[root@dev2 ~]# cat <<END>> /etc/hosts
192.168.2.1 gitlab.lemon.com
192.168.2.2 jenkins.lemon.com
192.168.2.3 lb.lemon.com
END
开发一个 官网 V1.0 版本,包含首页和新闻

(1)创建里程碑(Milestone)

(2)依次把任务首页,新闻添加到里程碑,并进行任务分配给dev2开发者

使用dev2用户登录查看,会有任务提示

dev2 开发者收到任务,进行开发
  • 将 dev2 持有人的公钥放到 dev2 账号下
[root@dev2 ~]# ssh-keygen 
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:WC/AYWsXe0QwQDQtL7wlTJUzjGvAtyqAWd17tNwYZvk root@dev2
The key's randomart image is:
+---[RSA 2048]----+
|   o +B*==o      |
|  . +o*+%=       |
|.o   *=@+O.      |
|+    .X=BoE      |
| .   o.*S .      |
|  . . .  .       |
|   .             |
|                 |
|                 |
+----[SHA256]-----+
[root@dev2 ~]# cat .ssh/id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDE1Wu54a56ryKqGRf5ctaJ71ZcApTV2KNxuG03ykSzZkcp7JSwUNxNRxrWu+XtbjKyCjkJnnBJ+Op18ixN17r69WY5edRxz3c50trNma2PDGm62fdzC0cdZLHnIKCRyizen5UrPxiPMkeJ6Gi2Z6ZmEZhxWhv6ePn3XE53lJg5PMyeSctMTZcikJ9qV0v3l3cZ8XD/fNaJnVQnYUswCxxg+JDEah5G8+sR5sKTJntTKxEjdJOd5/rsZFDGWzlMgieVzYYhPUWejLc2Fw+xQJRmGSQ5+TaKcNNwND/UYlJvzce+AkstgMiocXLN1pW9AFdX4dNo1+LjnjIHfbHobZlP root@dev2
将客户端公钥(id_rsa.pub)放进 dev2 账户中

进行开发
[root@dev2 ~]# git config --global user.name "dev2"
[root@dev2 ~]# git config --global user.email "dev2@163.com"
[root@dev2 ~]# git clone git@192.168.2.1:java/app1.git
正克隆到 'app1'...
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 4 (delta 0), reused 0 (delta 0)
接收对象中: 100% (4/4), done.
[root@dev2 ~]# cd app1/ && ls
README.md
[root@dev2 app1]# git checkout -b shouye
切换到一个新分支 'shouye'
[root@dev2 app1]# echo "<h1> www.lemon.com" > index.html
[root@dev2 app1]# git add .
[root@dev2 app1]# git commit -m "shouye"    #创建并切换首页分支
[shouye aa7b19c] shouye
 1 file changed, 1 insertion(+)
 create mode 100644 index.html
[root@dev2 app1]# git push origin shouye
Counting objects: 4, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 282 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: 
remote: To create a merge request for shouye, visit:
remote:   http://gitlab.lemon.com/java/app1/merge_requests/new?merge_request%5Bsource_branch%5D=shouye
remote: 
To git@192.168.2.1:java/app1.git
 * [new branch]      shouye -> shouye
回到 gitlab 上可以看到有刚才创建的分支,点击"Merge request"合并分支请求,之后PM用户登录处理合并请求。此时,一个功能的开发流程就完成。

登陆PM用户合并请求

验证分支是否合并

10. Gitlab 的备份和恢复

创建备份目录,并授权
[root@gitlab ~]# mkdir /data/backups/gitlab -p
[root@gitlab ~]# chown -R git.git /data/
修改 gitlab 配置
[root@gitlab ~]# vim /etc/gitlab/gitlab.rb 
299 gitlab_rails['backup_path'] = "/data/backups/gitlab"  #备份路径
307 gitlab_rails['backup_keep_time'] = 604800             #备份7天

[root@gitlab ~]# gitlab-ctl reconfigure
备份
[root@gitlab ~]# gitlab-rake gitlab:backup:create

11. 整体总结

  • PM在 gitlab 创建任务,分配给开发人员

  • 开发人员领取任务后,在本地使用git clone拉取代码库

  • 开发人员创建开发分支(git checkout -b dev),并进行开发

  • 开发人员完成之后,提交到本地仓库(git commit )

  • 开发人员在gitlab界面上申请分支合并请求(Merge request)

  • PM在gitlab上查看提交和代码修改情况,确认无误后,确认将开发人员的分支合并到主分支(master)

  • 开发人员在gitlab上Mark done确认开发完成,并关闭issue。这一步在提交合并请求时可以通过描述中填写"close #1"等字样,可以直接关闭issue。

posted @ 2023-05-24 15:39  ArMinLi  阅读(139)  评论(0编辑  收藏  举报