文章目录
背景
团队成员需要对彼此的代码进行检查和评审,以确保代码质量和项目的稳健性。
作用
- 发现自身代码缺陷
- 提高团队整体代码质量
- 互相了解业务
- 保障业务稳定
- 文档和标准化
代码审查工具
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 查看提交记录确认无误