目录
gitlab
gerrit
gitlab 实操作
一:project
二:group
三:MR(merge request, 合代码请求)
四:ci, Pipelines (自动化测试管道)
五:实际操作:(这里全是本地测试,所以用户名,密码,邮箱等等都随意)
5.1建group
5.2 注册/创建 普通用户
5.3 往group里面添加普通用户成员
5.4 group下建 project
5.5 在Linux上下载代码
5.6 普通用户提代码
总览原理
git 用来管理代码仓库,不同与svn ,采用的分布式,每个用户有本地的仓库,在离线的仓库里面就可以创建分支,打tag, 在不同的分支之间切换, 查看每一笔提交,回溯,或是将某一个提交cherry pick 到另外的分支,merge 合入其他分支, 完事之后可以和远程仓库进行同步。
然而所有这些操作都是类似于linux 命令行的形式,(浓浓的linux风格,毕竟git本身就是Linux内核的发明人Linus Benedict Torvalds 捣鼓出来的)实际使用中还是需要一些更直接容易上手的wind 界面方式操作, 于是就有了 gitlab和gerrit 这样的软件,他们都是基于git作为基础,在远程仓库上对代码的提交和合入作为了其他的包装(内部还是用git 来管理代码),并架设一个web服务器提供网页web访问,可以在真正合入代码的时候提供代码审查,甚至接入 部分的自动化测试,通过这些审查和测试之后再 合入(使用git操作)到远程仓库。
gitlab就是这样一个 开源免费的软件套件, 和gerrit 最大的不同,gitlab提交代码,一般是某一个用户在要修复的release基础分支上再new 一个fix分支,提交代码到自己的fix分支,把本地的fix分支也push到远程服务器上,然后去gitlab上做一个merge请求,请求将自己这个fix分支merge到要修复的release基础分支上, 管理员可以对这个merge请求做代码审核,做自动化的编译测试等,确认无误,同意merge请求,就可以将fix分支的修改真正合入到release分支,然后这个fix分支如果没用的话一般可以在合入之后就删除了,作为merge的一个临时分支产物。 这些代码审核,merge请求, 都是可以在web上操作查看的。 当然,一般会设置普通用户不能直接往远程仓库的release分支上合入代码,设置了权限,避免代码没有经过审核就入了库。
而gerrit, (Android 源码审核一般都是用的gerrit), 是在远程仓库和用户仓库之间设置了一个缓存库,普通用户提交代码,不需要自己手动new一个临时分支,而是直接往要提代码的分支上修改,不过再同步 push到远程仓库的时候,不能直接同步到远程实际仓库中(报权限错误),必须往这个中间仓库推送同步,然后gerrit经过review,把中间仓库同步到实际的远程仓库。 所以有gerrit管理的仓库一般推送代码不是直接git push,是 git pus HEAD:refs/for/xxreleasebranchxx .有 HEAD:refs/for/这个头
作为本地gitlab服务器的管理员,有哪些操作?基本的肯定是管理其他用户,权限等等。
gitlab通过 group 管理用户,通过 project管理仓库。
所有的说明文档,官网:Use GitLab | GitLab
同样是可以通过gitlab官网主界面的底部的标签找到相关页面入口的,docs
基本看看官方原文档也能看懂(英文),csdn博客也有各式各样的翻译了,不过还是从官方文档入手感觉比较放心。
Projects can be available publicly, internally, or privately. GitLab does not limit the number of private projects you can create
1. project 有三种属性:public internal private
public: public projects can be cloned without any authenticaton over HTTPS.
They are listed in the public access directory (/public) for all users
公共的,无需任任何权限验证就可以clone, 所有用户都可在列表中看到这个project
internal:Internal projects can be cloned by any signed-in user except external users.
They are also listed in the public access directory (/public
), but only for signed-in users. 内部的,可以被已经注册的用户clone(在本服务器上注册过的用户,并没有提到grop的限制)
private:Private projects can only be cloned and viewed by project members (except for guests).
They appear in the public access directory (/public
) for project members only
私有: 只能是本组的。
2. 创建projcet
原文档也有详细的说明,软件都是在跟新变化的,就不自己再翻译了,还是瞅瞅官方文档吧。基本也是傻瓜式下一步下一步的操作。
(待补充)
gitlab 和 gerrit ,都
(待补充)
注意,创建group 有一个属性: Require all users in this grop to set up two-factor authentication,默认是勾着的,要把它 去掉,不然成员用户登陆操作的时候,总是弹出个 双因子验证身份的界面(类似于qq安全,动态密码等等这样的功能,加强身份验证的,本地测试全去掉。)如果创建的时候没有修改,后续点击 grop,页面的第一条就有 edit 编辑按钮可以进去修改group的属性。
在登陆界面直接注册普通用户:(也可以在管理员里面直接创建用户),自己注册的用户需要管理员的批准,在 Admin Area->users_pending approval.
下面注册了两个用户:
suolong [email protected] password:12345678
shanzhi [email protected] password:12345678
(这些用户信息,头像,邮箱信息,密码等后续都可以通过管理员账号登陆进去进行修改,邮箱只要符合格式即可,至于是否真实存在可用,本地测试不重要)
可以选择角色,默认为guest访客,切换为developer开发者角色
注意,每个用户都可以建project,管理员用户也可以直接建project,有三个属性,但是这个project不是和grop关联的,这种个人建的 private project需要自己手动去邀请成员,我们这里希望整个group都自动有这个project的权限,所以是先建group,然后去group下面再建属于这个group的project.
在群组里面创建project,群组成员都可以在自己的project列表里面看到这个project
(为了在同一太电脑上登陆多个普通用户,做了个蠢的操作,装了多浏览器,一个浏览器等一个账户。没办法浏览器的什么缓存机制总是自动登上第一个账户上去了 。。。。。。)
Linux下生产ssh-key ,公钥
#ssh-keygen
#cat ~/.ssh/id_rsa.pub
将输出的公钥 添加到gitlab 普通用户的sshkey配置页里面去。(这一步主要是添加下载代码的权限)
就可以下代码:
从gitlab ,project 下面复制这个地址 XX 过来,在Ubuntu上:
#git clone XX
默认这个地址是个域名,如果我们的虚拟机无法解析域名,直接换成gitlab服务器的ip地址就行了,如下图:
gitlab 以MR作为一次提交,merge request
用自己的话概括,就是, 1.0 开发都是自己先 git checkout out -b 创建一个自己私人临时的分支,2.0然后你往自己的分支上修改提代码, commit到本地,3.0然后push到服务器上这个你的临时分支,(第一次push 之前可以手动和远程仓库关联,因为远程仓库没有你这个个人临时分支,不执行关联操作也没有关系,直接push, 会报错有提示你添加xxx选项,用建议的命令再push一次即可,push成功服务器上的仓库也会对等地新建好个人的这个临时分支。)在自己的临时分支上提代码就比较放松不会影响其他人,万一提错了把这个分支干掉重新来也是没问题的 4.0在gitlib 上就可以看到自己的临时分支和自己的提交,等确认这个OK, 就去Gitlib上创建一个MR, mege request, 请求把你这个临时分支merge到指定的正式分支上去,比如develop分支。 这个MR,就是合码请求。 然后等人review你这个MR, 批准,5.0合入到正式分支
到上面这个过程,只是把pubkey 添加到了一个 gitlab个人账号上,直接push的时候会有错误提示:
提示已经很明确,可以通过 git config 设置用户身份,--global参数是全局的缺省值,我们只是想在这个目录的这个仓库里面使用这个身份,换一个目录使用其他身份,所以不添加global参数,一般公司是开发的话个人肯定是只有自己一个用户,都使用 --global
所以,下载代码的时候在gitlab账号上绑定了ssh-key ,应该已经明确gitlab账号和本机的关系了,但是这里git commit 不知道用户,思考一下,这里git commit操作知识git的本地操作,和gitlab服务器是没有关系的,所以这里 git config, 配置的是git. 表面这个仓库里面对git命令操作的用户
直接在这个目录下修改提交代码,是不允许的(这是gitlab对git做的配置,git本身是可以设置允许直接提交的),如下:
我们提代码,需要自己在开创一个个人的或者是用于修改某一个bug/功能的分支,在新的分支上修改提交代码,然后把这个新分支也推送到gitlab服务端,再发起一个合并代码的请求,请求把新分支的修改合并到主干分支。
#git branch personal/suolong //从当前分支节点新建一个 personal/suolong分支
#git checkout personal/suolong //切换到 personal/suolong分支
上面两条命令可以合成一条,git checkout -b personla/suolong
然后在新的分支上commit,push
新的分支只是在本地,所以第一次push的时候,需要 --set-upstream ,这样服务器上的仓库也有我们创建的新分支 personal/suolong 这个仓库使用的是 suolong账号,登录这个账号可以看到刚才的提交:
直接在上面 create merge request 来个合码请求,MR,从个人分支 personal/suolong合并到 main