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
- Guest:可以创建issue、发表评论,不能读写版本库。
- Reporter:可以克隆代码,不能提交,QA、PM可以赋予这个权限。
- Developer:可以克隆代码、开发、提交、push,RD可以赋予这个权限。
- Maintainer:可以创建项目、添加tag、保护分支、添加项目成员、编辑项目,核心RD负责人可以赋予这个权限。
- 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。