惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
The Exploit Database - CXSecurity.com
V
Vulnerabilities – Threatpost
Google DeepMind News
Google DeepMind News
Attack and Defense Labs
Attack and Defense Labs
Webroot Blog
Webroot Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
TaoSecurity Blog
TaoSecurity Blog
I
Intezer
Application and Cybersecurity Blog
Application and Cybersecurity Blog
N
News | PayPal Newsroom
S
Security Affairs
T
Tor Project blog
P
Proofpoint News Feed
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
S
Security @ Cisco Blogs
H
Heimdal Security Blog
Hacker News: Ask HN
Hacker News: Ask HN
Help Net Security
Help Net Security
U
Unit 42
云风的 BLOG
云风的 BLOG
The Hacker News
The Hacker News
Cisco Talos Blog
Cisco Talos Blog
量子位
F
Full Disclosure
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 叶小钗
有赞技术团队
有赞技术团队
T
Troy Hunt's Blog
P
Privacy & Cybersecurity Law Blog
Forbes - Security
Forbes - Security
人人都是产品经理
人人都是产品经理
L
Lohrmann on Cybersecurity
Apple Machine Learning Research
Apple Machine Learning Research
Microsoft Security Blog
Microsoft Security Blog
博客园 - Franky
腾讯CDC
AI
AI
Last Week in AI
Last Week in AI
Latest news
Latest news
Google Online Security Blog
Google Online Security Blog
N
Netflix TechBlog - Medium
Engineering at Meta
Engineering at Meta
GbyAI
GbyAI
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
IT之家
IT之家
Martin Fowler
Martin Fowler
Blog — PlanetScale
Blog — PlanetScale
V2EX - 技术
V2EX - 技术
酷 壳 – CoolShell
酷 壳 – CoolShell

陈少文的网站

巨变与机遇的未来十年 Kubernetes 平台管理软件压力测试方案 使用镜像部署 Hexo 静态页面 终于等到你 - GitHub 镜像仓库服务(ghcr.io) 一起来学 Go --(6)Interface 一起来学 Go --(5)Goroutine 和 Channel 什么是函数式编程 如何在 Kubernetes 集群集成 Kata 柯里化与偏函数 使用 PyGithub 自动创建 Label 软件产品是团队能力的输出 Helm 2 、Helm 3 比较 IoT 变现 Kubernetes 中的 DNS 服务 国内的 Helm 镜像源 Harbor 使用自签证书支持 Https 访问 DevOps 工具链之 Prow 如何使用 kfctl 安装 Kubeflow VS Code 无法下载 Go 插件的工具包 工程师更应具有服务精神 你不知道的 Docker 使用技巧 使用 Docker 运行 Tensorflow 论中国 什么是左移 如何清空 Git 仓库全部历史记录 一禅小和尚 有风吹过厨房 时间的玫瑰 如何在 CentOS 安装 GPU 驱动 开发 Tips(19) 使用 Velero 备份 Kubernetes 集群 Kubernetes Cheat Sheet 开发 Tips(18) 如何构建一个 Java 工程 开发 Tips(17) KubeSpray 安装 Kubernetes 报错 ip in ansible_all_ipv4_addresses 基于 Kubernetes 和 Jenkins 搭建自动化测试系统 在 Kubernetes 上动态创建 Jenkins Slave 使用 Jenkins 进行服务拨测 开发 Tips(16) Kubernetes 签发 Ingress 证书及日常故障运维 Kubernetes 中 Deployment 的基本操作 Kubernetes 中的证书 如何使用 KubeBuilder 开发一个 Operator Kubernetes 1.6.0 安装问题汇总 镜像管理工具 -- Harbor 开发 Tips(15) Docker 如何拉取镜像 开发 Tips(14) 使用 Helm 安装 harbor 开发 Tips(13) 使用 S2I 构建云原生应用 在 Kubernetes 中使用 emptyDir、hostPath、localVolume 开发 Tips(12) 开发 Tips(11) 代码质量分析工具 SonarQube 使用 Kubeadm 安装 Kubernetes 集群 一起来学 Go --(4)常用函数 Kubernetes 中的 Ceph Kubernetes 之 Volumes Kubernetes 之 Labels、Selectors 开发 Tips(10) 开源正在重构商业模式 Kubernetes 之网络 Kubernetes 之 API 使用 Helm 和 Operator 快速部署 Prometheus Kubernetes 复杂有状态应用管理框架 -- Operator Kubernetes 的包管理器 -- Helm 一起来学 Go --(3)Go Modules 如何一步一步地优化博客方案 kubectl 实用指南 Kubernetes 中的基本概念 搭建远程 Kubernetes 开发环境 大公司和小公司的 ToB 思路 开发 Tips(9) Go 入门指南 一起来学 Go --(2)数据与逻辑结构 如何预防 Web 富文本中的 XSS 攻击 django-xss-cleaner 云工作时代 一起来学 Go --(1)背景与特点 SaaS 开发团队的不同阶段 你不知道的 Git 使用技巧 输出既服务 微服务设计 继续奔跑 开发 Tips(8) 从账户安全到二次验证 Django 性能之数据库查询优化 Django 性能之分库分表 敏捷开发之研发流程 打造一致性的团队 开发 Tips(7) Pytest 进阶学习之 Mock PaaS 部署之 buildpack Go 开发配置 领域输出才是 PaaS 的核心竞争力 Pytest 入门学习 开发 Tips(6) 如何使用 Jenkins、Docker、GitLab 搭建 Django 自动化部署流程
基于 Git 的前后端开发工作流
微信公众号 · 2018-03-31 · via 陈少文的网站

最近参与了一个多人协作开发的项目,在开发过程中遇到不少问题。例如,前端提交冲掉后端代码、代码冲突无法解决直接返工、A 提交 B 分支、直接提交 Master 分支等。本文是记录,也是思考如何更高质量地管理项目、进行多人合作项目的开发。

1. 版本管理的需求

1.1 版本标记

在正式环境,每一次发布之前都需要对版本进行标记。一方面是为了记录发布历史,另一方面是为了在必要时,能够迅速地回滚版本。比如,在 3 月 21 日 进行了一次正式环境的发布,Tag: V20180321,Message:新增 XXXX。在 3 月 29 日,运营人员要求立即下线一个跳转的链接。但是在距离上一次正式发布的时间段内,开发人员已经提交了新的功能代码,甚至可能已经合并到主仓库。这时,开发人员可以拉取 Tag: V20180321 版本的代码,修改之后再打上 Tag: V20180321-remove-xxx,即可进行测试、发布。

1.2 分支管理

在多人开发时,为了减少开发人员之间的相互干扰,强烈建议每个人都以功能的维度创建分支更新代码,一个功能一个分支。在项目排期分配的过程中,通常会将不同的功能、模块,划分给不同的人。在这种情况下,只需要提前约定模块之前耦合的部分,比如,接口、全局变量等,就能够满足协作开发的初衷:多人并行、缩短开发周期。

1.3 变更记录

对文件变更的记录是版本管理最基本的需求。变更记录是最原始的迭代数据,通过查阅变更记录,可以将功能和具体的代码行结合起来,既方便审计代码,也是给其他开发者的注释。

2. 为什么是 Git, 而不是 SVN

分支管理上的优势,让我们选择了 Git,放弃 SVN。

Git 上可以轻松地使用多个独立分支。同时很容易对这些分支进行创建、更新、删除、合并等操作。

另外一点是,Git 速度快,从各种压力测试数据来看,相较于 SVN,Git 在文件压缩、文件存储方面有着极高的效率。

3. Git 开发工作流

简单介绍一下项目开发团队背景:开发人员包括,三个前端、两个后端;项目 S 是一个 SaaS 项目,基于 PaaS 平台开发,平台提供 SVN 仓库进行代码管理。前端使用 Webpack + Vue.js,后端使用 Django,采用前后端分离的模式进行开发。

S 项目是一个在频繁迭代的项目,这一次是第五期。前面几期,主要有一个前端、一个后端配合开发。第五期,由于前端离职,两个前端新人+前端导师加入项目组。两个后端也有其他项目,并非 100 % 投入。

这种情况下,前端不熟悉项目、后端不能全身心投入。如果不采取一定的措施,势必导致项目延期,甚至污染早期的代码。

于是在新迭代伊始,我就将仓库迁移到 Git。同时,使用GitLab CI 将代码推送到 SVN 发布仓库,以更好地支持多人协作开发。

考虑到项目迭代周期短,我选择的是 Github Flow 的工作模式。下面是开发工作流:

以功能划分单元,每个功能新建一个分支,最终合并到 Master 分支。由于小的功能点特别多,频繁的创建分支,会导致分支太多;如果删除分支,又无法追溯版本。于是,约定在这一期迭代中,每个人持续跟踪一个自己的分支。在每次开发新功能之前,需要将 Master 合并到自己的分支,以保持本地版本最新。

4. MR/PR 流程

多人合作开发主要是通过多分支来实施。多分支管理的难点在分支的合并上。听过公司内部一个敏捷开发方向的专家分享,在他带领的团队出现过,合并代码比开发代码时间还长的情况。然后,通过解耦、优化流程,结合 CI 工具,最终每两个星期就能发一个版本,再结合 A/B 发布,能达到每周一个版本,快速迭代的奇效。

简单点讲,Github Flow 就是将每次新功能、BUG 修改等都新建一个分支。提交代码之后,发起一个 Merge Request(简称,MR)、或者 Pull Request (简称,PR)。再由项目其他成员讨论之后,反复修改、提交代码。最终达成一致之后,由具有 Merge 权限的成员合并到 Master 分支。

其中的 MR/PR 流程是保证模块正确耦合、高质量代码的关键。出现前端代码冲掉后端代码、冲突无法解决直接返工等问题的原因,正是因为 MR/PR 流程的缺失。

于是,前后端都指定了一位负责人,具有 Master 权限,负责 Review 其他成员的代码,处理其他成员发起的 MR/PR。其他成员作为 Developer 的角色存在于项目。Review 代码是一种能快速学习、提高代码质量的方式,如果项目内部能形成相互 Review 的习惯,对项目和自己都会有很大收益。

5. 参考