【 运维这些事儿 】- 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 查看提交记录确认无误

相关推荐
Youkiup6 分钟前
【linux 常用命令】
linux·运维·服务器
qq_2975046110 分钟前
【解决】Linux更新系统内核后Nvidia-smi has failed...
linux·运维·服务器
_oP_i15 分钟前
.NET Core 项目配置到 Jenkins
运维·jenkins·.netcore
weixin_4373982123 分钟前
Linux扩展——shell编程
linux·运维·服务器·bash
小燚~25 分钟前
ubuntu开机进入initramfs状态
linux·运维·ubuntu
小林熬夜学编程32 分钟前
【Linux网络编程】第十四弹---构建功能丰富的HTTP服务器:从状态码处理到服务函数扩展
linux·运维·服务器·c语言·网络·c++·http
上海运维Q先生37 分钟前
面试题整理15----K8s常见的网络插件有哪些
运维·网络·kubernetes
hhhhhhh_hhhhhh_1 小时前
ubuntu18.04连接不上网络问题
linux·运维·ubuntu
冷心笑看丽美人1 小时前
探秘 DNS 服务器:揭开域名解析的神秘面纱
linux·运维·服务器·dns
wenxiaocsdn1 小时前
某科技局国产服务器PVE虚拟化技术文档
运维·服务器