团队成员需要对彼此的代码进行检查和评审,以确保代码质量和项目的稳健性。
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
通常使用 git
命令行工具来进行代码同步和管理。依赖的是 replication
插件, 这个插件允许在 Gerrit 中配置自动同步规则,以将代码自动同步到其他远程仓库。
创建 Gerrit 项目: 在 Gerrit 中创建一个项目,用于同步 GitLab 的代码。可以使用 Gerrit 的 Web 界面或命令行工具来创建项目。
配置 SSH 密钥: 确保 Gerrit 和 GitLab 能够正常通信。这里有两个问题
同步代码到 Gerrit: 使用 Gerrit 插件实现同步。
进行代码审查: 在 Gerrit 中进行代码审查,团队成员可以对同步到 Gerrit 中的代码进行审查、添加评论和建议修改。
合并代码: 审查通过后,将代码合并到 GitLab 主仓库。这可以通过 Gerrit 提供的 “Submit” 功能来实现,也可以使用其他自动化方式来将代码合并到 GitLab。
保持同步: 确保继续同步 Gerrit 和 GitLab 之间的代码,以保持代码库的一致性。
:::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工作原则:
export PROJECT_NAME=ycloud
git clone "ssh://[email protected]/${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)
git push origin HEAD:refs/for/refs/heads/main
:::note
需要特别注意,for 后面是待合并到的远端分支名。
:::
场景,如果前面提交请求被拒绝,或者还需要在原来的基础上修改,那么就需要下载原来的patchset,修改后再提交。
git fetch ssh://[email protected]:29418/buf refs/changes/69/469/1 && git checkout -b change-469 FETCH_HEAD
特别注意:在修改 patchset 后重新提交的时候一定要用 amend 提交,且不能修改 change id。
由于当前是使用的 IP 和端口直接访问 Gerrit 中的代码仓库,因此需要进行相关配置才可无缝使用 Git 。
:::info
为了便于直接使用网页中提供的 git 地址,可以在 gitconfig 文件中添加类似如下配置:
:::
[url "ssh://[email protected]/"]
insteadOf = http://[email protected]/a/
insteadOf = https://[email protected]/a/
insteadOf = ssh://[email protected]:29418/
加上以上配置后,拉取 git 的时候都会转换成 ssh 协议。
关于 Git Review 的介绍可以参见:https://www.mediawiki.org/wiki/Gerrit/git-review#
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 [email protected] [email protected]
git config alias.reviewers "review --reviewers [email protected] [email protected]"
加 --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 查看提交记录确认无误