夜间模式
一、代码仓库创建规范
1、 项目创建需符合Group
规范。
2、 创建项目必须添加Project description
说明。
3、 每个项目都需要README.md
文件。
4、 除文档说明类型仓库,所有代码仓库都需要.gitignore
。
注意
有模板的项目,要以统一的模板创建项目_
二、Groups 使用规范
Group
分为 rule
(技术行为规范)、lab
(技术预研)、common
(基础库)、realicloud
(基础平台)、rexxox
(产品)、customer
(定制化开发项目)
三、目录结构及权限介绍
rule - Internal
- 主要用于存放技术行为规范相关资料
lab - Internal
- 主要用于存放技术预研,比如 shader 预研、售前 demo 技术预研等。
common - Internal
- 主要用于存放公共组件库,基础算法库
rexxxud - Private
- 主要用于存放底层基础能力平台相关微服务,如 PaaS 层的接口、网关鉴权服务等。
rexxxb - Private
- 主要存放产品相关业务代码,如应用中心小程序等。
customer - Private
- 主要存放客户制定化开发项目代码。
权限说明:gitlab 主要包括三种权限 Private
、Internal
、Public
,分别为只对组内用户开放、注册用户可见和公开,公司 gitlab 一般不使用 Public
四、关联仓库的管理
涉及内部仓库之间的引用采用 submodule
进行版本管理,对于可开源发布的版本管理采用包管理,比如 pip
、npm
、go get
。
主项目管理形式如下:
git
A(主项目) --> B(common公共模块)
|
|---> C(包管理)
|
|---> D(其他仓库)
将引用项目作为 submodule 添加到主项目中:
git
# 添加submodule
$ git submodule add <远程引用模块仓库地址>
子项目版本管理和主项目版本管理是分发的,主项目中的子项目更新需要手动操作:
git
# 更新子模块
$ git submodule update --init
五、README 文件规范
README 文件结构如下:
git
<项目简介/Introduction>
<快速使用/Quick start>
<文档说明/Documentation>
Introduction
用于阐述项目基本情况和功能(是什么,用来做什么的)Quick Start
主要包括两部分内容:简易的安装部署说明(Deployment)和使用案例(Example)。Documentation
部分是核心的文档,对于大型项目可以使用超链接代替
参考:
使用 Description Template
使用 merge request template
(待补充:https://docs.gitlab.com/ee/user/project/description_templates.html)
https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/merge_request_templates/Security Release.md
六、版本管理规范
项目代码 release 包括三类:
- 大版本(x.0.0)
- 小版本(x.x.0)
- 补丁(x.x.x)
6.1 版本管理
git 流程模式有两种:一种是Git flow
工作流,一种是Github flow
工作流。
七、Git Flow 分支模型
步骤
master
分支不做代码提交,master
为生产环境运行代码- 开发主要在
develop
分支上进行提交 - 功能开发切换一个新的功能分支上,功能分支完成后需合并到
develop
分支 - 用
release
分支做版本发布,release
用于预发布环境测试 release
分支从开发分支切出来,完成后需要合并到master
分支和develop
分支- 预发布环境测试无误后,
release
分支合并到master
分支,发布到生产环境测试 - 生产环境测试完成后
release
分支可以删除 - 生产环境运行中紧急修复采用
hotfix
分支,hotfix
分支从mater
分支切出 hotfix
分支修复后需合并会master
分支和develop
分支
7.1 功能开发
创建功能分支
git
# 从develop创建功能分支
$ git checkout -b myfeature develop
完成功能分支,合并 develop
,并推送到远程仓库
git
# 切换到develop分支
$ git checkout develop
# develop分支合并功能分支
$ git merge --no-ff myfeature
# 删除功能分支
$ git branch -d myfeature
# 推到远程仓库
$ git push origin develop
7.2 版本发布
版本发布前,创建版本分支
git
# 从develop分支切到版本发布分支
$ git checkout -b release-1.2 develop
完成版本测试后,合并到 master
分支上
git
# 切换到master
$ git checkout master
# master合并release分支
$ git merge --no-ff release-1.2
# 给master分支打tag
$ git tag -a 1.2
生产环境测试没有问题后,将 release
分支合并会 develop
分支,并删除 release
分支
git
# 切换到develop分支
$ git checkout develop
# develop分支合并release分支
$ git merge --no-ff release-1.2
# 删除release分支
$ git branch -d release-1.2
7.3 临时补丁
生产环境上发现 bug,直接通过 hotfix 快速修复:
git
# 从master切出一条分支,紧急修复问题
$ git checkout -b hotfix-1.2 master
完成问题修复后,合并进 master:
git
# 切到master分支
$ git checkout master
# master分支合并hotfix分支
$ git merge --no-ff hotfix-1.2
# 打上新tag
$ git tag -a 1.2
# 切换到develop分支
如果当前 release 分支还未删除,合并到 release 分支,再由 release 分支合并到 develop 分支:
git
$ git checkout release-1.2
# release-1.2合并hotfix分支
$ git merge --no-ff hotfix-1.2
# 删除hotfix分支
$ git branch -d hotfix-1.2
# 切换到develop分支
$ git checkout develop
# develop分支合并release分支
$ git merge --no-ff release-1.2
如果 release 分支已删除,则直接合并到 develop 分支:
git
# 切换到develop分支
$ git checkout develop
# develop分支合并release分支
$ git merge --no-ff hotfix-1.2
# 删除hotfix分支
$ git branch -d hotfix-1.2
7.4 原则
- 开发永远不直接提交到 master 分支,master 保留用于发布到生产中的代码
- 尽量一个任务,一个功能分支
- 在合并到开发分支前,对每个 merge requests 测试
- 新功能只添加到 develop 分支
7.5 优缺点
优点:
- 流程清晰,覆盖面全,通过分支模型将工作流串通
- git flow 作为最早提出的分支模型,也是最广泛使用的分支模型,受众广泛
- 以 master 作为生产分支,面向单版本的线上产品迭代
缺点:
- 分支十分复杂,敏捷性较差
- 仅 master 分支上做持续集成,而大部分工具默认将 master 分支设为默认分支,因此经常面临分支切换,导致很繁琐
- 修补分支和发布分支设置繁琐,比如每次使用修补分支都需要同时合并到 master 和 develop 分支,但开发经常犯错误,比如忘记合并回 develop 分支
7.6 Github Flow 分支模型
面对 git flow 的繁琐,github flow 分支模型仅具有功能分支和主分支,将所有内容合并到 master 分支中并进行部署,采用 pull request 方式进行代码合并,强调持续集成和连续交付。
优点:
- 流程十分简单,可以满足敏捷交付
- 不需要频繁切换分支,在自己的仓库进行开发,统一合并 master
- 每次提交均需要测试
缺点:
- 对自动化测试要求较高,需要大量的单元测、端到端测试和集成测试
- 模型过于简单,对于部署、发版和集成上存在着大量问题
7.7 Gitlab Flow 分支模型
结合了 git flow 分支模型和 github flow 分支模型:
步骤
- 需要一个 staging 环境和 pre-production 环境(两个生产环境镜像)
- 从主仓库 fork 到自己的仓库
- 所有请求直接提交到 master 分支,每次提交都做持续集成和测试,主要是自动化测试
- 每个 merge requests 需要描述符合提交规范,每个人出了代码输出工作,需要每天抽出时间进行 code review。
- 部署发布的时候,从 master 中摘取(cherry Pick)核心发布功能到"release-x.x.x-alpha"分支进行测试,并在其上进行修复
- 测试通过后,切换到"release-x.x.x"分支并删除"release-x.x.x-alpha"分支,将"release-x.x.x"分支发布到生产环境中进行测试
- 生产环境测试通过后,将"release-x.x.x"合并回 master
要使用好 cherry-pick,每个提交要清晰简洁
7.7.1 功能开发
git
# fork到用户仓库
# 拉取到本地修改
$ git clone <your repo>
# 切出一个分支
$ git branch -b feature/xx
# 提交
$ git commit
# 上传到自己的仓库
$ git push origin
# 向主仓库发起merge requests请求,合并到主仓库master
# CI通过并且其他人code review后同意即可合并到主仓库
7.7.2 预发布
git
# 从最新的release版本切出一个新的版本分支release-x.x.x-alpha
$ git checkout -b release-x.x.x-alpha
# 从master分支cherry-pick所需提交记录
$ git cherry-pick hash1 hash2 hash3
# 上传到自己的仓库
$ git push origin
# 向主仓库发起merge requests请求,合并到release-x.x.x-alpha
# CI通过并且其他人code review后同意即可合并到主仓库
7.7.3 优缺点
优点:
- 相比 git flow 分支模型更简单,减少了分支数量
- 和 github flow 分支模型一样,更强调测试,对所有提交都需进行测试或 code review
缺点:
- 需要自动化测试流程支撑,需要有较好的持续集成和连续交付基础
八、commit 规范
git commit 提交样式规范:
git
<类型>: <标题>
<空一行>
<内容>
<空一行>
<结尾>
<类型>
用于说明 commit 的类别,只允许使用下面 7 个标识。
- feat:新功能(feature)
- fix:修补 bug
- docs:文档(documentation)
- style: 格式(不影响代码运行的变动)
- refactor:重构(即不是新增功能,也不是修改 bug 的代码变动)
- test:测试相关改动
- chore:构建过程(CI/CD)或辅助工具的变动
<题目>
commit 目的的简短描述,不超过 50 个字符
<内容>
对本次 commit 的详细描述,可以分成多行,可详细说明代码变动的动机
<结尾>
Footer 部分只用于以下两种情况:
九、不兼容变动
如果当前代码与上一个版本不兼容,则 Footer 部分以 BREAKING CHANGE 开头,后面是对变动的描述、以及变动理由和迁移方法。
git
BREAKING CHANGE: isolate scope bindings definition has changed.
To migrate the code follow the example below:
Before:
scope: {
myAttr: 'attribute',
}
After:
scope: {
myAttr: '@',
}
The removed `inject` wasn't generaly useful for directives so there should be no code using it.
十、关闭 Issue
如果当前 commit 针对某个 issue,那么可以在 Footer 部分关闭这个 issue 。
git
Closes #234
10.1 Example
git
feat(compiler): comments for if-else conditions #10286
In order to fix these 2 issues, I need to have access to the HTML comments before a v-else block
vue-styleguidist/vue-styleguidist#430
vue-styleguidist/vue-styleguidist#322
To give you an example, here is a format that does not work with the current parser.
Since we cannot have the comments as normal nodes, I thought we could have the missing comment beside the ifCondition.
closes #10288
十一、Revert
还有一种特殊情况,如果当前 commit 用于撤销以前的 commit,则必须以 revert:开头,后面跟着被撤销 Commit 的 Header。
git
revert: feat(pencil): add 'graphiteWidth' option
This reverts commit 667ecc1654a317a13331b17617d973392f415f02.
Body 部分的格式是固定的,必须写成This reverts commit <hash>
.,其中的 hash 是被撤销 commit 的 SHA 标识符。
如果当前 commit 与被撤销的 commit,在同一个发布(release)里面,那么它们都不会出现在 Change log 里面。如果两者在不同的发布,那么当前 commit,会出现在 Change log 的 Reverts 小标题下面。
十二、Commitizen
可以使用典型的 git 工作流程或通过使用 CLI 向导Commitizen来添加提交消息格式。
12.1 安装
git
npm install -g commitizen
然后,在项目目录里,运行下面的命令,使其支持 Angular 的 Commit message 格式。
git
commitizen init cz-conventional-changelog --save --save-exact
以后,凡是用到git commit
命令,一律改为使用git cz
。这时,就会出现选项,用来生成符合格式的 Commit message。
十三、生成 Change log
如果你的所有 Commit 都符合 Angular 格式,那么发布新版本时, Change log 就可以用脚本自动生成。生成的文档包括以下三个部分:
- New features
- Bug fixes
- Breaking changes.
每个部分都会罗列相关的 commit ,并且有指向这些 commit 的链接。当然,生成的文档允许手动修改,所以发布前,你还可以添加其他内容。
conventional-changelog 就是生成 Change log 的工具,运行下面的命令即可。
git
npm install -g conventional-changelog
cd my-project
conventional-changelog -p angular -i CHANGELOG.md -w