1 常用代码托管软件对比
svn和git的对比:
- svn是集中式、git是分布式
- svn的分支是复制整套代码,操作繁琐,git是移动了一个指针,操作简单,使用分支的开销小
- svn对文件进行权限控制,gitlab对项目或成员进行权限控制
- svn功能简单,也适合行政、美工使用
1.1 GIT系列
代码仓库托管软件 | 特性 |
---|---|
GitLab-CE | 大而全的解决方案整合,将 Git 托管、持续集成/部署等功能做在了一起,相当于开源,可私有部署的GitHub。功能完善,易使用。 |
Gerrit | google为android系统研发制作一套免费开源的代码审核系统,可对每次提交review。专注代码审核,但使用较复杂。 |
Gitea | 功能较为单一的 Git 托管服务器,所有功能都围绕着 Git 托管而来。功能简单,易使用。 |
1.2 SVN系列
代码仓库托管软件 | 特性 |
---|---|
VisualSVN Server | 基于Subversion 的GUI服务端,VisualSVN Server集成了Apache HTTP Server和Apache Subversion ,支持浏览器访问。 |
2 搭建GitLab服务器
2.1 安装docker
sudo apt install docker.io
2.2 设置日志大小
全局设置,新建/etc/docker/daemon.json,若有就不用新建了。添加log-dirver和log-opts参数,样例如下:
vim /etc/docker/daemon.json
{
"insecure-registries" : [
"registry.docker-cn.com",
"docker.mirrors.ustc.edu.cn"
],
"debug" : true,
"experimental" : true,
"storage-driver": "overlay2"
}
{
"log-driver":"json-file",
"log-opts":{
"max-size" :"50m","max-file":"1"
}
}
{
"registry-mirrors": ["https://c64zf1n6.mirror.aliyuncs.com"]
}
max-size=50m,意味着一个容器日志大小上限是50M
max-file=1,意味着一个容器有1个日志
registry-mirrors,设置国内镜像加速
重启docker守护进程
systemctl daemon-reload
systemctl restart docker
2.3 创建GitLab容器
docker pull gitlab/gitlab-ce
docker run \
--restart always \
--name gitlab \
-itd \
-p 8080:80 \
-p 222:22 \
-v /root/gitlab/gitlab_config:/etc/gitlab \
-v /root/gitlab/gitlab_log:/var/log/gitlab \
-v /root/gitlab/gitlab_data:/var/opt/gitlab \
gitlab/gitlab-ce
将本地文件夹挂载到容器文件夹,使关键文件存储在主机上,做到删容不删库
2.4 修改配置文件
需要一个固定的URL访问地址,配置gitlab.rb(宿主机路径:/home/gitlab/config/gitlab.rb)
vi /root/gitlab/gitlab_config/gitlab.rb
# 配置http协议所使用的访问地址
external_url 'http://youpeng.info'
gitlab_rails['gitlab_ssh_host'] = '139.224.30.179'
gitlab_rails['gitlab_shell_ssh_port'] = 222 # ssh连接端口
2.5 创建管理员账户
docker exec -it gitlab /bin/bash
[root@web1 ~]# gitlab-rails console -e production
-------------------------------------------------------------------------------------
Gitlab: 13.0.5 (2268d0cdfcds) FOSS
Gitlab Shell: 13.2.0
postgresql: 11.7
-------------------------------------------------------------------------------------
Loading production environment (Rails 6.0.3)
irb(main):001:0> user = User.where(id: 1).first
=> #<User id:1 @admin>
irb(main):002:0> user.password="xxxxxxxx"
=> "xxxxxxxx"
irb(main):003:0> user.password_confirmation="xxxxxxxx"
=> "xxxxxxxx"
irb(main):004:0> user.save!
Enqueued ActionMailer::DeliveryJob (Job ID: 3ef37c47-4b3f-49e5-aa53-904e725bd1a8) to Sidekiq(mailers) with arguments: "DeviseMailer", "password_change", "deliver_now", gid://gitlab/User/1
=> true
irb(main):005:0> quit
docker restart gitlab
3 GitLab权限管理
3.1 项目权限
项目类型 | 项目访问权限 |
---|---|
Private | 私有。只有组成员才能看到 |
Internal | 内部。只要登录的用户就能看到 |
Public | 公开。所有人都能看到 |
3.2 项目成员权限
邀请成员加入项目时,可设置成员权限
成员角色 | 用户权限 |
---|---|
Guest | 访客。可以创建issue、发表评论,不能读写版本库(就是看不了代码…) |
Reporter | Git项目测试人员。可以克隆代码,不能提交。QA、PM可以赋予这个权限 |
Developer | 项目开发人员。可以克隆代码、开发、提交、push。RD可以赋予这个权限 |
Maintainer | Git项目管理员。可以创建项目、添加tag、保护分支、添加项目成员、编辑项目。核心RD负责人可以赋予这个权限 |
Owner | Git系统管理员即Administrator。拥有至高无上的权限。开发组leader可以赋予这个权限 |
示例
4 提交规范和分支工作流
4.1 代码提交规范
- 单项修改进行一次提交,不要多个功能揉在一起提交
提交类型 | 描述 |
---|---|
feat | 新增的功能,如某个芯片驱动,某个接口,测试代码 |
fix | 修补bug |
docs | 文档 |
style | 格式 |
- 建议示例
fix: 修复SPI时序问题
- 复杂示例
feat:完成xxx功能
详述...................
详述...................
详述...................
第一行进行简单描述,不能太长。如果不能描述清楚,换行写详细描述
4.2 分支工作流
对于驱动开发不需要建立很多分支,使用如下分支工作流比较合适
______+_________________-___doc:readme__+____________-___ main
|__+feat:at24c04__| | | feat-at24c04
|__+fix:i2c__| fix-i2c
- 整个项目长期存在一个main分支,main分支设定为受保护的分支,不允许删除
- 对于功能开发,必须基于main分支创建一个feat分支,如
feat-at24c02
,功能开发完毕后,合并该分支到main分支,并删除此feat分支 - 对于bug修复,必须基于main分支创建一个fix分支,如
fix-i2c
,bug修复完毕后,合并该分支到main分支,并删除此fix分支 - 对于提交文档、代码风格修改,直接在main分支提交,不必另建分支
- 分支合并时必须指定指派人和审核者,只有现审核后,指派人才能批准合并,提高代码质量
- main分支每次合并后,服务器会自动对代码进行编译,开发人员需关注编译日志
- 不管是在本地合并,还是在GitLab合并分支,都应该发起议会,对此此合并进行讨论、审核
4.3 解决合并冲突
______+__________________+___-____doc:readme____-________ main
|__+feat:at24c04___|___| | feat-at24c04
|________+fix:i2c______| fix-i2c
在GitLab将源分支合并到目标分支时,如果都对同一处代码进行了修改,就会产生合并冲突,无法合并。需在本地解决冲突。
注意!:千万不要不解决冲突,直接add commit push
5 GitLab代码评审
对比两种开源代码管理系统
- gitlab:GitLab社区版,对每次merge进行review,满足使用要求,工作思维和GitHub相似,易上手
- gerrit:google开发android时的代码评审工具,可对每次commit进行review,但此工具使用难度很大
5.1 评价单个提交
进入项目仓库->点击提交
点击某次提交,添加评价
5.2 对Merge进行review
发起合并请求时,会指定指派人和审核者对代码审核,记录review意见,决定是否合并
由于使用的GitLab社区版,只能邀请一位审核者
5.3 issue(议会)
对需要讨论的功能需求或代码实现,可发起议会,邀请议会参与者
6 GitLab持续集成
持续集成指的是只要代码有变更,就自动运行构建和测试,反馈运行结果
持续集成的好处在于,每次代码的小幅变更,就能看到构建及运行结果
gitlab-ci由两部分组成:
- gitlab server :负责调度、触发 Runner,以及获取返回的结果,无需用户配置。
- gitlab runner :负责执行自动化 CI 的宿主,需要用户自己配置,Runner 可以存在多个
6.1 gitlab runner
命令安装
基于ubuntu镜像安装
docker run -it \
--name runner \
--hostname runner \
ubuntu \
/bin/bash
–name:容器名
–hostname :容器主机名
–network: 指定容器的网络, 启动容器默认使用bridge网络,这里直接使用主机的网络
更新gitlab-runner源
apt update
apt install curl
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | bash
apt update
安装
apt install gitlab-runner
注册runner
root@ubuntu-runner:/# gitlab-runner register
Runtime platform arch=amd64 os=linux pid=4607 revision=c6e7e194 version=14.8.2
Running in system-mode.
Enter the GitLab instance URL (for example, https://gitlab.com/):
http://172.18.92.251:8080
Enter the registration token:
xE4YaEm9NdMCyZsYnTzr
Enter a description for the runner:
[ubuntu-runner]: build
Enter tags for the runner (comma-separated):
build
Enter optional maintenance note for the runner:
build
Registering runner... succeeded runner=xE4YaEm9
Enter an executor: virtualbox, docker+machine, docker, docker-ssh, shell, ssh, custom, parallels, docker-ssh+machine, kubernetes:
shell
如果显示runner不在线,重启runner
gitlab-ci-multi-runner restart
注意:
当提交代码后没有触发,一直停留在pending;原因,没有标记tag的代码提交是不会触发gitlab runner的,勾选运行未标记的作业
移除runner
gitlab-runner list
gitlab-runner verify --delete --name=h3
移除不了的话,在gitlab里删除此runner,再移除
如果还移除不了,手动删除runner部分
gitlab-runner stop
vim /etc/gitlab-runner/config.toml
gitlab-runner start
创建ubuntu-build容器
基于ubuntu/runner镜像创建ubuntu-build容器
挂载/root/project目录用于编译调试
docker run -it \
--name build-zynq \
--hostname build-zynq \
-p 5002:22 \
-v "/root/workspaces:/root/workspaces" \
ubuntu \
/bin/bash
安装openssh-server
方便调试时远程登陆编译
apt install openssh-server
apt install vim
vim /etc/ssh/sshd_config
添加如下
PubkeyAuthentication yes #启用公钥私钥配对认证方式
AuthorizedKeysFile .ssh/pub_key #公钥文件路径(和上面生成的文件同)
PermitRootLogin yes #root能使用ssh登录
ClientAliveInterval 60 #参数数值是秒 , 是指超时时间
ClientAliveCountMax 3 #设置允许超时的次数
添加ssh公钥
vim /root/.ssh/pub_key
启动ssh服务
service ssh start
登陆脚本
#!/bin/bash
ssh -i /home/coder/project/.ssh/h3_rsa root@172.18.92.251 -p 5001
7 README和Wiki
优秀的项目一定有完善,易懂的文档
7.1 README
- README.md文件用于介绍此代码仓库
- 使用markdow格式编写README.md
示例:
7.2 WiKi
项目wiki应包含项目开发文档、经验文档等。
关注博主公众号,优质文章不断更新