云效Codeup代码评审中的代码协同

简介: 云效 Codeup 汇集了阿里巴巴最新的代码托管、代码协同技术,希望能够造福更多中国和世界的开发者。

640.jpg

大神说:“Show me the code”,于是就有了代码评审

“Talk is cheap. Show me the code.”


——Linus Torvalds, founder of Linux and Git.


代码评审中同样存在着“Talk is cheap. Show me the code”,语言无力时,直接上代码吧。这就是我们今天要讨论的话题——代码评审中的代码协同。
一  基于邮件列表的代码评审
这是一种和代码仓库松耦合的代码评审模式,100%的代码都要经由一位或多位“仁慈的独裁者”(benevolent dictator)代码评审后才能合并入代码仓库。这种开发模式还需要开发者掌握一些命令行操作技巧以便完成代码在仓库和邮件列表之间的转换。采用这个模式的项目不多,不过 Linux、Git 开源社区就是按照这种模式运作的。
1  代码和邮件的相互转换
代码转换为电子邮件,要使用 git format-patch 命令。例如下面的命令将指定范围的代码提交(例如在 origin/master 之后的新提交)转换为电子邮件:

git format-patch origin/master..HEAD


生成的补丁文件的格式如下所示:

From: Author Name <author@email>
Subject: [PATCH] first line of commit message
more commit message...
---
diff --git ...
<content of patch>


  • 邮件头中的 Subject: 字段是邮件标题,使用 [PATCH] 作为标题前缀,以提交说明的第一行作为标题内容。


  • 更多的提交说明作为邮件内容,和邮件头之间用一个空行分隔开。


  • 用分隔符 --- 作为提交说明的结束。


  • 在分隔符 ---diff --git 开始的补丁内容之间的文字被忽略。通常此处内容是提交的变更统计,开发者也可以在此处写入不宜列入提交说明中的附加说明。


git format-patch 命令有很多参数,要结合不同场景使用,例如:

  • 一个特性由多个提交构成,分散在多个提交中的提交说明难以描述整个特性,可以使用 --cover-letter 参数,生成一封编号为 0000 的邮件,作为后续提交的摘要说明,便于评审者理解代码。


  • 一个特性通常会多次迭代,就需要为每次迭代设置不同的版本。这就要用到 -v {num} 参数指定补丁的版本。版本将体现在邮件标题中,例如第二版本的补丁,邮件标题将使用 [PATCH v2] 作为前缀。


  • 回复特定邮件,以便形成可追踪的邮件线索,使用参数 --in-reply-to="{Message-ID}",为电子邮件生成相关的 In-Reply-To:References: 头信息。


  • 默认提交本身的作者、提交说明的签名区(trailer)提及的贡献者会自动添加为邮件的收件人。要添加更多参与者,可以使用 --to={email}--cc={email} 参数。


将电子邮件转换为代码,则使用命令 git am [options...] mail... 。该命令会将邮件正确转换为 Git 仓库中的提交。
使用 git send-email 命令,将包含代码提交的邮件发送到邮件列表。
2  评审中的代码片段转换为提交
代码评审以邮件回复的方式完成。注意邮件回复都要求用纯文本格式,否则会被邮件服务器退信。
代码评审中发现小的文字错误,例如将 warning 写成了 waring,评审者可能做出如下简洁的回复:

s/waring/warning/

这种约定俗成的格式大概是源于 sed 命令实现文本替换的语法。

评审者有时候会在回复中贴上大段的代码补丁,为了使代码补丁和邮件上下文做出区分,会使用特殊的剪刀分隔符将邮件中的评论和代码补丁分隔开。

Subject: Re: whatever thread you're in
Somebody else said:
> blah blah blah
I disagree. You should do it like this instead:
-- >8 --
first line of commit message
more commit message
---
diff --git ...

上面是 Peff(Jeff King)在邮件中给出的一个示范,看到其中的剪刀分隔符了么?剪刀分隔符由多个减号(穿孔的分割线)和一个剪刀符号组成至少8个字符的分隔符。可选的分隔符有:-- 8< ---- >8 ---- %< ----- >% --- 等。

使用 git am --scissors 命令,能够识别邮件中的剪刀分隔符,将邮件中的代码转换为提交。
3  为提交贡献者署名
Git的提交元信息中只包含两个署名信息,一个是提交的原始作者(Author),一个是将提交合入仓库或者对提交做了修补的提交者(Committer),而在提交评审过程中有过贡献的人往往不只两人,如何致敬贡献者呢?Git 社区的实践是在提交尾部(trailer)添加贡献者签名。贡献者签名由一个被动语态的关键字和贡献者ID组成,例如:

  • Signed-off-by: User <Email> :通常由代码的贡献者(Author)和代码合入时的提交者(Committer)提供的签名。可由命令 git commit -sgit am -s 等命令自动添加。


  • Reported-by: User <Email> :问题的报告者。


  • Helped-by: User <Email>:对提交有过帮助的人。


  • Reviewed-by: User <Email> :评审者。

可以通过 Git 项目仓库的提交历史,看到更多的签名示例。
4  使用 GitHub PR 实现代码到邮件的转换
一个名为 GitGitGadget 工具借助 GitHub 强大的扩展能力,通过向 gitgitgadget/git 仓库发送 pull request,实现提交到邮件的转换,并发送到 Git 项目的邮件列表中。使用 GitGitGadget 参与 Git 社区代码贡献详见。
二  GitHub 代码评审中的协同
GitHub 使用 pull request 进行代码评审,评论中的代码块儿也可以转换为提交。
1  代码评论中嵌入代码块
下图中,点击评论工具栏第一个按钮,可以在评论中嵌入代码块:


2.png

2  评论中代码块转换为提交
对 pull request 的源仓库具有写权限的用户,可以将评审中的代码库转换为提交,如下图所示:

3.png


于是代码评审中会增加一个新的修正提交。
GitHub 的这个功能对于代码评审中发现的一些小问题,还是非常方便的。但是大的修改就无能为力了。

3  线下评审
对于功能复杂的 pull request,在线上浏览代码不方便,也不能线上调试代码,这时线下获取并浏览代码,就非常有必要了。
GitHub 的代码仓库中为每一个代码评审设置了特殊的关联引用:

  • refs/pull/{ID}/head :关联 pull request 的源提交。


  • refs/pull/{ID}/merge :对于没有冲突的 pull request,这个引用指向一个成功的合并提交。


代码评审者使用如下命令可以获取 pull request (例如编号为 123 的 PR)指向的提交:

git fetch origin refs/pull/123/head
git switch -d FETCH_HEAD

评审者可以线下调试 pull request 指向的代码,但是对代码做出的本地修改,没有办法直接更新到线上的代码评审中。

阿里巴巴的云效Codeup,支持线下到线上的代码协同。
三  云效Codeup代码评审中的协同
无论是 GitHub 还是 Gitlab,开发者创建代码评审首先需要将代码推送到线上独立的分支中(无论是在线上的派生仓库,还是目标仓库),然后再通过网页选择来源仓库、分支及目标仓库、分支,创建代码评审。
GitHub 和 Gitlab 这种代码评审方式,或者要引入冗余的派生仓库,或者需要为开发者赋予在仓库中的写入权限,并容易引发杂乱的分支管理。
1  适合主干开发的无分支创建代码评审
云效 Codeup 可以通过 git push 命令在客户端直接创建代码评审,无需创建派生仓库或者在仓库中创建特性分支。例如在客户端执行如下命令:

git push origin HEAD:refs/for/master/topic1

该命令会在服务端创建新的代码评审,或者如果已经存在相同用户、相同命令创建的代码评审则会更新评审中的提交。


建议安装我们开源的 git-repo 工具,则可以用更简单的命令行,实现从客户端创建/更新代码评审。

git pr

2  线下评审,线上协同
和 GitHub 类似,云效 Codeup 创建的代码评审都有一个特殊引用相关联,格式为:refs/merge-requests/{ID}/head
代码评审者可以使用 git fetch 命令获取特定的代码评审(以编号123为例)指向的代码,进行线下代码评审。

git fetch origin refs/merge-requests/123/head
git switch -d FETCH_HEAD

如果安装了 git-repo,可以使用下面更为简洁的命令:

git download 123

代码评审者除了可以在本地仓库中浏览、调试代码,还可以更新代码、创建提交,然后将本地新增提交更新到线上的代码评审中。命令示例如下:

git pr -c 123


4.png


在云效 Codeup,开发者和评审者可以基于代码评审进行更为流畅的代码协同。

3  Git proc-receive 挂钩
上述“线下评审、线上协同”功能的核心是 Git 的 proc-receive 挂钩和 report-status-v2 新能力。这一功能由阿里巴巴贡献给 Git 社区,并在 Git 2.29.0 发布。

云效 Codeup 汇集了阿里巴巴最新的代码托管、代码协同技术,希望能够造福更多中国和世界的开发者。


相关实践学习
流水线运行出错排查难?AI帮您智能排查
本实验将带您体验云效流水线Flow的智能排查能力,只需短短1-2分钟,即可体验AI智能排查建议。
ALPD云架构师系列 - 云原生DevOps36计
如何把握和运用云原生技术,撬动新技术红利,实现持续、安全、高效和高质量的应用交付,并提升业务的连续性和稳定性,这是云原生时代持续交付共同面对的机会和挑战。本课程由阿里云开发者学堂和阿里云云效共同出品,是ALPD方法学云架构师系列的核心课程之一,适合架构师、企业工程效能负责人、对DevOps感兴趣的研发、测试、运维。 课程目标 前沿技术:了解云原生下DevOps的正确姿势,享受云原生带来的技术红利 系统知识:全局视角看软件研发生命周期,系统学习DevOps实践技能 课程大纲: 云原生开发和交付:云研发时代软件交付的挑战与云原生工程实践 云原生开发、运行基础设施:无差别的开发、运行环境 自动部署:构建可靠高效的应用发布体系 持续交付:建立团队协同交付的流程和流水线 质量守护:构建和维护测试和质量守护体系 安全保障:打造可信交付的安全保障体系 建立持续反馈和持续改进闭环
目录
相关文章
|
人工智能 自然语言处理 Devops
云效 AI 智能代码评审体验指南
云效AI智能代码评审正式上线!在合并请求时自动分析代码,精准识别问题,提升交付效率与质量。支持自定义规则、多语言评审,助力研发效能升级。立即体验AI驱动的代码评审革新,让AI成为你的代码质量伙伴!
254 7
|
6月前
|
敏捷开发 自然语言处理 IDE
通义灵码+云效 DevOps MCP:通过云效工作项自动生成代码并提交请求
本文将详细介绍如何利用云效MCP服务,根据工作项内容生成对应代码、创建分支、提交代码,并发起合并请求。
|
9月前
|
人工智能 JavaScript 测试技术
云效+DeepSeek 打造高效代码评审的新途径
本文介绍如何在云效平台上利用DeepSeek等大模型实现AI智能代码评审。通过创建云效组织、获取API令牌、配置Flow自定义步骤、导入示例代码库及创建流水线,结合单元测试和代码扫描功能,实现自动化代码审查。此方案显著减少人工评审工作量,提升代码质量与开发效率,确保项目快速且安全地上线。
|
敏捷开发 监控 Java
阿里云云效产品使用合集之Codeup WebIDE环境下,如何使用通义灵码
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
运维 Devops Java
DevOps 工具链:从代码到生产
【8月更文第30天】在现代软件开发中,DevOps(Development 和 Operations 的结合)已成为确保快速而可靠的软件交付的关键方法。DevOps 通过自动化流程将软件开发与 IT 运维相结合,从而实现持续集成 (CI) 和持续部署 (CD)。本文将介绍一个典型的 DevOps 工具链,并提供实际的代码示例来帮助您理解如何将这些工具集成在一起。
618 5
|
Kubernetes 监控 Devops
【独家揭秘】.NET项目中的DevOps实践:从代码提交到生产部署,你不知道的那些事!
【8月更文挑战第28天】.NET 项目中的 DevOps 实践贯穿代码提交到生产部署全流程,涵盖健壮的源代码管理、GitFlow 工作流、持续集成与部署、容器化及监控日志记录。通过 Git、CI/CD 工具、Kubernetes 及日志框架的最佳实践应用,显著提升软件开发效率与质量。本文通过具体示例,助力开发者构建高效可靠的 DevOps 流程,确保项目成功交付。
274 0
|
监控 安全 Devops
DevOps实践:从代码到部署的无缝过渡
【8月更文挑战第30天】本文通过深入浅出的方式,向读者展示了DevOps文化和实践如何帮助团队实现从代码编写到软件部署的高效、自动化流程。我们将探讨持续集成(CI)、持续交付(CD)以及监控和日志记录的最佳实践,旨在为希望优化软件开发周期的专业人士提供实用指南。文章不展示具体代码示例,而是聚焦于概念理解和实践应用,确保内容即便在没有代码的情况下也具有实质性价值。
|
缓存 资源调度 Kubernetes
阿里云云效产品使用合集之如何将两个独立的代码仓库构建并部署到同一个容器内
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
Kubernetes Java 开发工具
阿里云云效产品使用合集之如何将代码库中的代码覆盖目录
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
敏捷开发 缓存 前端开发
阿里云云效产品使用合集之前端打包时npm安装卡住一般是什么导致的
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。