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

文章目录

背景

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

作用

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

代码审查工具

Gerrit

镜像构建

Dockerfile
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插件,

shell 复制代码
[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做权限控制,方便集中管理用户。

yaml 复制代码
[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 初始化项目
bash 复制代码
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
bash 复制代码
git push origin HEAD:refs/for/refs/heads/main

:::note

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

:::

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

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

bash 复制代码
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 文件中添加类似如下配置:

:::

conf 复制代码
[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

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

添加源

zsh 复制代码
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 查看提交记录确认无误

相关推荐
Avan_菜菜13 小时前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
叫我少年17 小时前
Windows 中安装 git
git
SelectDB2 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
XIAOHEZIcode3 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220704 天前
如何搭建本地yum源(上)
运维
深海鱼在掘金6 天前
Git 完全指南 —— 第1章:Git 概览与版本控制演进
git
大树887 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠7 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质7 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工7 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信