【 运维这些事儿 】- Gerrit代码审查详

news2024/11/27 10:30:57

文章目录

    • 背景
    • 作用
    • 代码审查工具
      • Gerrit
        • 镜像构建
          • Dockerfile
        • 部署
        • 配置
      • Gitlab代码同步
        • ssh-agent
    • 相关概念
    • 常用命令
    • Git 配置
    • 使用 Git Review
      • 针对已有项目添加commit-msg,用于自动添加changeId
      • 添加源
      • 配置 `.gitreview`
      • 备注
        • 指定审核人
        • 自定义git命令
    • 开发使用
      • 代码审查

背景

团队成员需要对彼此的代码进行检查和评审,以确保代码质量和项目的稳健性。

作用

  • 发现自身代码缺陷
  • 提高团队整体代码质量
  • 互相了解业务
  • 保障业务稳定
  • 文档和标准化

代码审查工具

Gerrit

镜像构建

Dockerfile
FROM gerritcodereview/gerrit:3.8.1
MAINTAINER ycloud
ADD entrypoint.sh .
ADD reviewers.jar /var/gerrit/plugins/reviewers.jar
USER root
RUN chmod +x entrypoint.sh  && ssh-keygen -t rsa -N '' -f /root/.ssh/id_rsa -q && sudo sed -i '1i StrictHostKeyChecking no \nPubkeyAuthentication yes' /etc/ssh/ssh_config
ADD config /root/.ssh

拉取replication插件,

[root@ycloud gerrit]# ll
total 76
-rw-r--r-- 1 root root    77 Aug  8 09:57 config
-rw-r--r-- 1 root root   342 Aug  8 10:17 Dockerfile
-rw-r--r-- 1 root root   569 Aug  8 10:17 entrypoint.sh启动脚本调整

-rw-rw-rw- 1 root root 64363 Jul 31 16:09 reviewers.jar
---
## 拉取replication插件
wget https://gerrit-ci.gerritforge.com/job/plugin-reviewers-bazel-master/lastSuccessfulBuild/artifact/bazel-bin/plugins/reviewers/reviewers.jar

---
## entrypoint.sh启动脚本调整
[root@ycloud gerrit]# cat entrypoint.sh 
#!/bin/bash -e

export JAVA_OPTS='--add-opens java.base/java.net=ALL-UNNAMED --add-opens java.base/java.lang.invoke=ALL-UNNAMED'

if [ ! -d /var/gerrit/git/All-Projects.git ] || [ "$1" == "init" ]
then
  echo "Initializing Gerrit site ..."
  java $JAVA_OPTS -jar /var/gerrit/bin/gerrit.war init --batch --install-all-plugins -d /var/gerrit
  java $JAVA_OPTS -jar /var/gerrit/bin/gerrit.war reindex -d /var/gerrit
fi


if [ "$1" != "init" ]
then
  echo "Running Gerrit ..."
  exec /var/gerrit/bin/gerrit.sh run
fi
git clone --bare git@gitlab/***/*.git   ### 尝试拉取gitlab

---
## ssh配置
[root@ycloud gerrit]# cat config 
Host *
    IdentityFile ~/.ssh/id_rsa
    PreferredAuthentications publickey

部署

部署方式是根据容器运行时,针对服务编写 Helm Chart 并运行在k8s集群,详细内容查看 where

配置

这里使用Ldap做权限控制,方便集中管理用户。

[ldap]
    server = ldap://openldap:389
    username=cn=admin,dc=ycloud,dc=net
    accountBase = dc=ycloud,dc=net
    accountPattern = (&(objectClass=person)(cn=${username}))
    accountFullName = displayName
    accountEmailAddress = mail
    accountSshUserName = uid
    password = $DLo6XV1OSqmbZe8Ih%l!sFYU8

Gitlab代码同步

​ 通常使用 git 命令行工具来进行代码同步和管理。依赖的是 replication 插件, 这个插件允许在 Gerrit 中配置自动同步规则,以将代码自动同步到其他远程仓库。

创建 Gerrit 项目: 在 Gerrit 中创建一个项目,用于同步 GitLab 的代码。可以使用 Gerrit 的 Web 界面或命令行工具来创建项目。

配置 SSH 密钥: 确保 Gerrit 和 GitLab 能够正常通信。这里有两个问题

  • 如果使用pod创建的密钥对,那再pod重启之后将无效
  • 在宿主机上使用ssh-agent在pod内,也可以正常使用认证密钥,但是gerrit的jgit认证无法通过

同步代码到 Gerrit: 使用 Gerrit 插件实现同步。

进行代码审查: 在 Gerrit 中进行代码审查,团队成员可以对同步到 Gerrit 中的代码进行审查、添加评论和建议修改。

合并代码: 审查通过后,将代码合并到 GitLab 主仓库。这可以通过 Gerrit 提供的 “Submit” 功能来实现,也可以使用其他自动化方式来将代码合并到 GitLab。

保持同步: 确保继续同步 Gerrit 和 GitLab 之间的代码,以保持代码库的一致性。

ssh-agent

相关概念

:::info
Change
:::

一个Change包含一个Change-Id,这个Id就是通过我们拉取代码库的时候所拷贝的hooks(hooks/commit-msg)自动生成的;

包含一个或多个Patch Set,以及诸如Owner,Project,Target branch,Comments等信息;

:::info
Change-Id
:::

Change-Id是一串SHA-1字符串。有hooks自动生成在我们的commit message下面:

移除冗余代码

Change-Id: I77033b4bb1ac72855a719bfee364e55eeb71e713

在一个project的每个branch中Change Id是唯一的。

:::info
Patch Set
:::

一个Patch Set就是一次commit,Gerrit会将其生成一个Branch暂存。Change中的每提交一个Patch Set表示这个Change的一个新的版本,自动覆盖前一个Patch Set, 默认情况下,仅最后一个Patch Set是有意义的。Code Review通过时,也仅仅是最后一个Patch Set会合并到指定的branch中。

Git工作原则:

  • 永远是基于远程库的最新代码工作,尽量每一步操作(特别是add/commit/push)都通过git pull --rebase获取一下当前最新版本;
  • 尽可能保证每一个Change的完整性以及独立性,且越小越好;

常用命令

  • clone 初始化项目
export PROJECT_NAME=ycloud
git clone "ssh://ycloud@review.7c.net/${PROJECT_NAME}" && (cd "${PROJECT_NAME}" && mkdir -p `git rev-parse --git-dir`/hooks/ && curl -Lo `git rev-parse --git-dir`/hooks/commit-msg https://review.7c.net/tools/hooks/commit-msg && chmod +x `git rev-parse --git-dir`/hooks/commit-msg)
  • 提交 review topic
git push origin HEAD:refs/for/refs/heads/main

:::note
需要特别注意,for 后面是待合并到的远端分支名。
:::

  • 下载 patchset(具体命令可以在 change 页面右侧 EDIT 右侧的符号点击后看到)

场景,如果前面提交请求被拒绝,或者还需要在原来的基础上修改,那么就需要下载原来的patchset,修改后再提交。

git fetch ssh://ycloud@review.7c.net:29418/buf refs/changes/69/469/1 && git checkout -b change-469 FETCH_HEAD

特别注意:在修改 patchset 后重新提交的时候一定要用 amend 提交,且不能修改 change id。

Git 配置

由于当前是使用的 IP 和端口直接访问 Gerrit 中的代码仓库,因此需要进行相关配置才可无缝使用 Git 。

:::info
为了便于直接使用网页中提供的 git 地址,可以在 gitconfig 文件中添加类似如下配置:
:::

[url "ssh://ycloud@review.7c.net/"]
	insteadOf =  http://ycloud@review.7c.net/a/
	insteadOf = https://ycloud@review.7c.net/a/
	insteadOf = ssh://ycloud@review.7c.net:29418/

加上以上配置后,拉取 git 的时候都会转换成 ssh 协议。

使用 Git Review

关于 Git Review 的介绍可以参见:https://www.mediawiki.org/wiki/Gerrit/git-review#

针对已有项目添加commit-msg,用于自动添加changeId

curl -Lo .git/hooks/commit-msg http://review.7c.net/tools/hooks/commit-msg
chmod u+x .git/hooks/commit-msg

添加源

git remote add gerrit ssh://review.7c.net/ycloud

配置 .gitreview

[gerrit]
host=review.7c.net


# 项目名
project=ycloud

# 目标分支
defaultbranch=develop

正常开发,注意commit功能聚合changeId(rebase处理)

需要小范围review或到dev上线前review时无需push

执行 git review,通过后几分钟后同步本地dev分支

git fetch -p
git rebase

无效分支删除后本地执行 git remote prune origin 进行同步

备注

指定审核人

git review --reviewers 1xxxx@163.com 2xxxx@163.com

自定义git命令

git config alias.reviewers "review --reviewers 1xxxx@163.com 2xxxx@163.com"

--global 可针对全部项目设置审核人
后续使用 git reviewers 命令即可

开发使用

gerrit在使用上,主要已git进行操作,在开发人员使用时,管理员用户需要提前将项目添加好,可以

1、所有用户: setting --> New SSH key

在这里插入图片描述

2、admin:主页点击BROWSE–>Repositories ,右上角有CREATE NEW按钮,新增项目
在这里插入图片描述

可以看到项目已经创建成功,但是需要替换为gitlab的git配置,所以直接将目录中 ops-system-menifest.git 删除,然后拉取gitlab上的项目,

⚡️: 查看gerrit中ops项目内容

在这里插入图片描述

这里的地址先改用 ip:port 来使用

4、admin: 新建项目想要同步gitlab,需要调整replication 配置信息

在这里插入图片描述

代码审查

⚡️: 这里用devops项目做测试,拉取项目调整并推送

在这里插入图片描述

📑: NOTE

需要注意的是,提交的时候多了个 for,如下所示推送到main分支:

git push origin HEAD:refs/for/refs/heads/main

查看Gerrit页面,可以看到一条需要我们去review的信息

在这里插入图片描述

在这里插入图片描述

审查无误确认 Code-Review +2 之后,点击 submit ,合并到master分支,合并成功之后replication,会同步到gitlab

在这里插入图片描述

Gitlab 查看提交记录确认无误

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/875647.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

image has dependent child images

问题:很多none的镜像无法被删除 解决过程: 1、通过 docker image prune -f 提示可删除为 0 2、直接进行删除报错: docker rmi 8f5116cbc201Error response from daemon: conflict: unable to delete 8f5116cbc201 (cannot be forced) - im…

面试题-React(一):React是什么?它的主要特点是什么?

探索React:前端开发中的重要角色与主要特点 引言: 在现代前端开发领域,React已经成为最受欢迎和广泛使用的JavaScript库之一。它由Facebook开发并于2013年首次发布。随着时间的推移,React在开发社区中获得了强大的支持和认可。本…

对锁的理解

悲观锁和乐观锁 每次操作的时候都在上锁解锁,能解决并发中的各种问题,不支持并发操作,效率低 每次操作都加上版本号,操作提交的时候会比较数据库版本和目前的版本号是否一致,不一致就会提交失败 表锁和行锁 表锁是对…

Joint HDR Denoising and Fusion: A Real-World Mobile HDR Image Dataset

Abstract 手机已经成为我们日常生活中无处不在、不可或缺的拍照设备,而小光圈和传感器尺寸使得手机更容易受到噪点和过饱和的影响,导致动态范围(LDR)低、画质低。 因此,为手机开发高动态范围(HDR)成像技术至关重要。 然而,现有的…

SpringBean的生命周期和循环依赖

Spring循环依赖 前言 大制作来啦,spring源码篇,很早之前我就想写一系列spring源码篇了,正好最近总是下雨,不想出门,那就让我来带大家走进Spring源码世界吧。 阅读建议 spring源码读起来有点难度,需要多Deb…

性价比最高的护眼灯,护眼台灯应该怎么挑选

随着技术的发展,灯光早已成为每家每户都需要的东西。但是灯光不好可能会对眼睛造成伤害是很多人没有注意到的。现在随着护眼灯产品越来越多,市场上台灯的选择越来越多样化,如何选择一个对眼睛无伤害、无辐射的台灯成为许多家长首先要考虑的问…

limereport报表使用

在这里我使用报表是以报表的形式显示数据库的信息。所以首先需要准备的资料有:limereport源码,还有数据库,我这里使用的是qsqlite数据库。 1、下载limereport报表源码 2、运行自带的案例:demo_r1 3、点击 “Run Report Designer”…

RedisDesktopManager连不上redis问题解决(小白版)

常见问题就是 redis.conf配置文件 a.将port 127.0.0.1这一行注释掉 b.protected-mode保护模式改为no 这个可以看到很多博主都说了,相信都搜到这里来了你们都弄了,我就不详细说了 防火墙开放端口 我说明我自己的问题以及解决方法 1、执行telnet 虚拟…

2023年8月第1~2周大模型荟萃

2023年8月第1~2周大模型荟萃 2023.8.14版权声明:本文为博主chszs的原创文章,未经博主允许不得转载。 1、黑客制造了一款基于 AI 的恶意工具 FraudGPT 早先,有黑客制作了一个“没有道德限制”的 WormGPT 聊天机器人,可以自动生成…

PDF文件限制编辑怎么取消?

PDF文件设置了限制编辑,想要取消PDF文件的限制编辑,很简单,打开PDF编辑器,点击工具栏中的文件,选择属性按钮,进入到熟悉感界面之后,点击安全,然后我们点击权限下拉框,选择…

ModaHub魔搭社区:Milvus Cloud向量数据库可以部分避免AI幻觉

向量数据库的技术优势使其更适合在AI场景下应用,能够为AI的开发、增强内容生成的准确性提供重要的技术支撑。进一步来讲,向量数据库也被看作是大语言模型的记忆与灵魂,对于解决大模型的“幻觉”问题至关重要。 由于大模型是基于已有数据训练而…

TB/TM-商品详情原数据(APP)

一、接口参数说明: item_get_app-获得TB/TMapp商品详情原数据,点击更多API调试,请移步注册API账号点击获取测试key和secret 公共参数 请求地址: https://api-gw.onebound.cn/taobao/item_get_app 名称类型必须描述keyString是调用key&…

java+springboot+mysql员工管理系统

项目介绍: 使用javaspringbootmysql开发的员工管理系统(人力资源管理系统),系统包含超级管理员、管理员、员工角色,功能如下: 超级管理员:管理员管理;部门管理;职位管理…

嵌入式面试笔试刷题(day10)

文章目录 前言一、数组和链表的区别二、什么是内存对齐三、IIC的时序四、static作用五、查看tty设备的方法六、查找指定文件命令七、三次握手和四次挥手1.三次握手2.四次挥手 八、半关闭状态九、字节流和数据报总结 前言 本篇文章继续讲解笔试和面试。 一、数组和链表的区别 …

C++ STL stack queue

目录 一.stack 介绍 二.stack 使用 三.stack 模拟实现 普通版本: 适配器版本: 四.queue的介绍 五. queue使用 六.queue模拟实现 七.deque介绍 1.容器适配器 2.deque的简单介绍 3.deque的缺陷 4.为什么选择deque作为stack和queue的底层默认容…

SpringBoot复习:(46)全局的bean懒加载是怎么实现的?

在application.properties中配置: spring.main.lazy-initializationtrue在运行SpringApplication的run方法时,代码如下: 其中调用了prepareContext,prepareContext代码如下: 当在配置文件中配置了spring.main.lazy-initializat…

中国1990-2021连续30年土地利用数据CLCD介绍及下载

CLCD数据介绍 CLCD(China Land Cover Dataset)数据集由武汉大学黄昕老师公布,黄昕老师基于Google Earth Engine上335,709景Landsat数据,制作中国年度土地覆盖数据集(annual China Land Cover Dataset, CLCD),包含1985+1990—2020中国逐年土地覆盖信息。 为此,黄昕老师…

学好Elasticsearch系列-索引的批量操作

本文已收录至 Github,推荐阅读 👉 Java 随想录 先看后赞,养成习惯。 点赞收藏,人生辉煌。 文章目录 基于 mget 的批量查询基于 bulk 的批量增删改增加删除修改 filter_path Elasticsearch 提供了 _bulk API 来执行批量操作&#x…

Web APIs 第六天

正则表达式介绍语法元字符修饰符 一.正则表达式介绍 ① 简介 用来匹配字符串中字符组合的模式在JavaScript中,正则表达式也是对象通常用来查找,替换那些符合正则表达式的文本,许多语言都支持正则表达式 ② 使用场景 验证表单&#xff1a…

解决Adobe Flash Player已被屏蔽

问题:该插件不支持 原因:现在浏览器默认禁用flash 博主当前使用的是谷歌浏览器Chrome 2个主要方法都已经失效 搜索一圈后,之前博客给出的2个主要方法都已经失效。 1、flash.cn 下载本地播放器 2、在chrome中打开flash的禁用开关 2023年解…