commit 1e007fa3f728aa9967acb5b9693466b0727ce473 Author: rjb <263303411@qq.com> Date: Mon Dec 22 17:12:39 2025 +0800 first commit diff --git a/(红头)Gerrit服务器启停操作文档.txt b/(红头)Gerrit服务器启停操作文档.txt new file mode 100644 index 0000000..ea25a4e --- /dev/null +++ b/(红头)Gerrit服务器启停操作文档.txt @@ -0,0 +1,405 @@ +================================================================================ + Gerrit 服务器启停操作文档 +================================================================================ + +文档名称:Gerrit 服务器启停操作指南 +创建日期:2025-12-15 +适用版本:Gerrit 3.3.8 +服务器路径:/home/renjianbo/gerrit_install/review_site + +================================================================================ +一、基本操作命令 +================================================================================ + +【进入 Gerrit 目录】 + +cd /home/renjianbo/gerrit_install/review_site + +【启动服务】 + +bin/gerrit.sh start + +或者使用 Java 11(推荐): + +JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64 bin/gerrit.sh start + +【停止服务】 + +bin/gerrit.sh stop + +【重启服务】 + +bin/gerrit.sh restart + +或者: + +bin/gerrit.sh stop +sleep 3 +JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64 bin/gerrit.sh start + +【查看服务状态】 + +bin/gerrit.sh status + +【查看服务进程】 + +ps aux | grep gerrit + +或者: + +ps -ef | grep gerrit + +================================================================================ +二、详细操作说明 +================================================================================ + +【启动服务】 + +1. 基本启动: + cd /home/renjianbo/gerrit_install/review_site + bin/gerrit.sh start + +2. 使用 Java 11 启动(推荐,避免版本兼容问题): + cd /home/renjianbo/gerrit_install/review_site + JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64 bin/gerrit.sh start + +3. 启动后等待几秒,然后检查状态: + sleep 5 + bin/gerrit.sh status + +【停止服务】 + +1. 正常停止: + cd /home/renjianbo/gerrit_install/review_site + bin/gerrit.sh stop + +2. 如果正常停止失败,强制停止: + # 查找进程 ID + ps aux | grep gerrit | grep -v grep + + # 杀死进程(替换 PID 为实际进程 ID) + kill -9 + + # 或者直接杀死所有 Gerrit 进程 + pkill -9 -f gerrit + +【重启服务】 + +1. 正常重启: + cd /home/renjianbo/gerrit_install/review_site + bin/gerrit.sh restart + +2. 完整重启(推荐,确保使用 Java 11): + cd /home/renjianbo/gerrit_install/review_site + bin/gerrit.sh stop + sleep 3 + JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64 bin/gerrit.sh start + sleep 5 + bin/gerrit.sh status + +【查看服务状态】 + +1. 查看服务状态: + cd /home/renjianbo/gerrit_install/review_site + bin/gerrit.sh status + +2. 检查端口是否监听: + netstat -tlnp | grep 8080 # HTTP 端口 + netstat -tlnp | grep 29418 # SSH 端口 + + 或者使用 ss 命令: + ss -tlnp | grep 8080 + ss -tlnp | grep 29418 + +3. 检查进程: + ps aux | grep gerrit | grep -v grep + +4. 测试 HTTP 服务: + curl -s -o /dev/null -w "HTTP Status: %{http_code}\n" http://localhost:8080/ + +5. 测试 SSH 服务: + ssh -p 29418 renjianbo@localhost gerrit version + +================================================================================ +三、日志查看 +================================================================================ + +【查看实时日志】 + +1. HTTP 访问日志: + cd /home/renjianbo/gerrit_install/review_site + tail -f logs/httpd_log + +2. SSH 访问日志: + cd /home/renjianbo/gerrit_install/review_site + tail -f logs/sshd_log + +3. Gerrit 主日志: + cd /home/renjianbo/gerrit_install/review_site + tail -f logs/gerrit.log + +4. 错误日志: + cd /home/renjianbo/gerrit_install/review_site + tail -f logs/error_log + +【查看历史日志】 + +1. 查看最后 100 行 HTTP 日志: + cd /home/renjianbo/gerrit_install/review_site + tail -100 logs/httpd_log + +2. 查看最后 50 行错误日志: + cd /home/renjianbo/gerrit_install/review_site + tail -50 logs/error_log + +3. 搜索特定内容: + cd /home/renjianbo/gerrit_install/review_site + grep "error" logs/gerrit.log | tail -20 + grep "renjianbo" logs/httpd_log | tail -20 + +================================================================================ +四、常见问题处理 +================================================================================ + +【问题1】服务启动失败 + +检查项: +1. 检查 Java 版本: + java -version + # 应该显示 Java 11 或更高版本 + +2. 检查端口是否被占用: + netstat -tlnp | grep 8080 + netstat -tlnp | grep 29418 + + 如果端口被占用,可以: + - 停止占用端口的进程 + - 或修改 gerrit.config 中的端口配置 + +3. 查看错误日志: + cd /home/renjianbo/gerrit_install/review_site + tail -50 logs/error_log + +4. 检查磁盘空间: + df -h + +5. 检查内存: + free -h + +【问题2】服务无法停止 + +解决方法: +1. 查找进程: + ps aux | grep gerrit | grep -v grep + +2. 强制停止: + kill -9 + + 或者: + pkill -9 -f gerrit + +3. 验证已停止: + bin/gerrit.sh status + ps aux | grep gerrit | grep -v grep + +【问题3】服务启动后无法访问 + +检查项: +1. 检查服务是否运行: + bin/gerrit.sh status + +2. 检查端口是否监听: + netstat -tlnp | grep 8080 + +3. 检查防火墙: + sudo firewall-cmd --list-ports + # 确保 8080 和 29418 端口已开放 + +4. 检查配置文件: + cat etc/gerrit.config | grep listenUrl + cat etc/gerrit.config | grep canonicalWebUrl + +5. 测试本地访问: + curl http://localhost:8080/ + +【问题4】Java 版本问题 + +如果遇到 Java 版本错误: +1. 检查已安装的 Java 版本: + ls /usr/lib/jvm/ + +2. 使用 Java 11 启动: + JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64 bin/gerrit.sh start + +3. 或者设置环境变量: + export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64 + export PATH=$JAVA_HOME/bin:$PATH + bin/gerrit.sh start + +================================================================================ +五、完整操作脚本 +================================================================================ + +【启动脚本】 + +#!/bin/bash +cd /home/renjianbo/gerrit_install/review_site +JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64 bin/gerrit.sh start +sleep 5 +bin/gerrit.sh status + +【停止脚本】 + +#!/bin/bash +cd /home/renjianbo/gerrit_install/review_site +bin/gerrit.sh stop +sleep 3 +ps aux | grep gerrit | grep -v grep + +【重启脚本】 + +#!/bin/bash +cd /home/renjianbo/gerrit_install/review_site +bin/gerrit.sh stop +sleep 3 +JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64 bin/gerrit.sh start +sleep 5 +bin/gerrit.sh status +curl -s -o /dev/null -w "HTTP Status: %{http_code}\n" http://localhost:8080/ + +【状态检查脚本】 + +#!/bin/bash +cd /home/renjianbo/gerrit_install/review_site +echo "=== Gerrit 服务状态 ===" +bin/gerrit.sh status +echo "" +echo "=== 端口监听状态 ===" +netstat -tlnp | grep -E "8080|29418" +echo "" +echo "=== 进程状态 ===" +ps aux | grep gerrit | grep -v grep +echo "" +echo "=== HTTP 服务测试 ===" +curl -s -o /dev/null -w "HTTP Status: %{http_code}\n" http://localhost:8080/ + +================================================================================ +六、系统服务配置(可选) +================================================================================ + +如果需要将 Gerrit 配置为系统服务(开机自启动),可以创建 systemd 服务文件: + +【创建服务文件】 + +sudo vi /etc/systemd/system/gerrit.service + +【服务文件内容】 + +[Unit] +Description=Gerrit Code Review +After=network.target + +[Service] +Type=forking +User=renjianbo +Group=renjianbo +WorkingDirectory=/home/renjianbo/gerrit_install/review_site +Environment="JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64" +ExecStart=/home/renjianbo/gerrit_install/review_site/bin/gerrit.sh start +ExecStop=/home/renjianbo/gerrit_install/review_site/bin/gerrit.sh stop +Restart=on-failure +RestartSec=10 + +[Install] +WantedBy=multi-user.target + +【使用系统服务】 + +1. 重新加载 systemd: + sudo systemctl daemon-reload + +2. 启动服务: + sudo systemctl start gerrit + +3. 停止服务: + sudo systemctl stop gerrit + +4. 重启服务: + sudo systemctl restart gerrit + +5. 查看状态: + sudo systemctl status gerrit + +6. 设置开机自启动: + sudo systemctl enable gerrit + +7. 取消开机自启动: + sudo systemctl disable gerrit + +================================================================================ +七、快速参考命令 +================================================================================ + +【常用命令速查】 + +# 启动 +cd /home/renjianbo/gerrit_install/review_site && JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64 bin/gerrit.sh start + +# 停止 +cd /home/renjianbo/gerrit_install/review_site && bin/gerrit.sh stop + +# 重启 +cd /home/renjianbo/gerrit_install/review_site && bin/gerrit.sh stop && sleep 3 && JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64 bin/gerrit.sh start + +# 状态 +cd /home/renjianbo/gerrit_install/review_site && bin/gerrit.sh status + +# 查看日志 +cd /home/renjianbo/gerrit_install/review_site && tail -f logs/httpd_log + +# 检查端口 +netstat -tlnp | grep -E "8080|29418" + +# 测试 HTTP +curl http://localhost:8080/ + +# 测试 SSH +ssh -p 29418 renjianbo@localhost gerrit version + +================================================================================ +八、重要提示 +================================================================================ + +1. 启动服务前,确保: + - Java 11 或更高版本已安装 + - 端口 8080 和 29418 未被占用 + - 有足够的磁盘空间和内存 + +2. 停止服务前,建议: + - 等待当前操作完成 + - 通知用户(如果有) + +3. 重启服务后,建议: + - 等待 5-10 秒让服务完全启动 + - 检查服务状态 + - 测试 HTTP 和 SSH 访问 + +4. 日志文件位置: + - HTTP 日志:logs/httpd_log + - SSH 日志:logs/sshd_log + - 主日志:logs/gerrit.log + - 错误日志:logs/error_log + +5. 配置文件位置: + - 主配置:etc/gerrit.config + - 安全配置:etc/secure.config + +6. 数据目录: + - Git 仓库:git/ + - 数据库:db/ + - 缓存:cache/ + +================================================================================ +文档结束 +================================================================================ + diff --git a/(红头)Git代码提交命令文档.txt b/(红头)Git代码提交命令文档.txt new file mode 100644 index 0000000..112a40b --- /dev/null +++ b/(红头)Git代码提交命令文档.txt @@ -0,0 +1,606 @@ +================================================================================ + Gerrit Git 代码提交命令文档 +================================================================================ + +文档名称:Gerrit Git 代码提交命令参考 +创建日期:2025-12-15 +适用版本:Gerrit 3.3.8 +服务器地址:http://101.43.95.130:8080 + +================================================================================ +一、初始配置 +================================================================================ + +【配置 Git 用户信息】 + +# 全局配置 +git config --global user.name "Your Name" +git config --global user.email "your_email@example.com" + +# 项目级别配置 +cd /path/to/project +git config user.name "Your Name" +git config user.email "your_email@example.com" + +【配置 Gerrit 服务器】 + +# 配置 SSH 远程仓库 +git remote add origin ssh://renjianbo@101.43.95.130:29418/project-name + +# 或配置 HTTP 远程仓库(不推荐) +git remote add origin http://renjianbo@101.43.95.130:8080/project-name + +【安装 commit-msg hook】 + +# 下载 commit-msg hook(自动添加 Change-Id) +cd /path/to/project +mkdir -p .git/hooks +curl -o .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg +chmod +x .git/hooks/commit-msg + +================================================================================ +二、克隆项目 +================================================================================ + +【通过 SSH 克隆(推荐)】 + +git clone ssh://renjianbo@101.43.95.130:29418/project-name +cd project-name + +【通过 HTTP 克隆】 + +git clone http://101.43.95.130:8080/project-name +cd project-name + +# 首次克隆时,如果提示输入用户名,输入:renjianbo +# 密码留空(开发模式不需要密码) + +================================================================================ +三、基本提交流程 +================================================================================ + +【步骤1:修改代码】 + +# 编辑文件 +vim file.txt +# 或使用其他编辑器 + +【步骤2:查看修改】 + +# 查看工作区状态 +git status + +# 查看具体修改内容 +git diff + +# 查看已暂存的修改 +git diff --cached + +【步骤3:暂存修改】 + +# 暂存单个文件 +git add file.txt + +# 暂存所有修改 +git add . + +# 暂存所有修改(包括删除的文件) +git add -A + +# 交互式暂存(选择性地暂存修改) +git add -i + +【步骤4:提交代码】 + +# 提交修改(commit-msg hook 会自动添加 Change-Id) +git commit -m "Your commit message" + +# 提交并添加详细描述 +git commit -m "Short summary" -m "Detailed description" + +# 提交时直接编辑提交信息 +git commit + +【步骤5:推送到 Gerrit 进行评审】 + +# 推送到评审队列(关键:推送到 refs/for/master) +git push origin HEAD:refs/for/master + +# 推送到其他分支的评审队列 +git push origin HEAD:refs/for/develop + +# 推送到指定分支的评审队列 +git push origin HEAD:refs/for/branch-name + +================================================================================ +四、修改已提交的代码 +================================================================================ + +【修改最后一次提交】 + +# 修改提交信息(不改变代码) +git commit --amend + +# 修改提交信息(使用编辑器) +git commit --amend -m "New commit message" + +# 添加文件到最后一次提交 +git add forgotten-file.txt +git commit --amend --no-edit + +# 修改提交信息但保持 Change-Id 不变 +git commit --amend --no-edit + +【修改之前的提交】 + +# 交互式 rebase(修改历史提交) +git rebase -i HEAD~3 # 修改最近 3 次提交 + +# 在交互式界面中,将要修改的提交标记为 "edit" +# 然后修改代码,使用: +git add . +git commit --amend --no-edit +git rebase --continue + +【重新推送修改后的提交】 + +# 修改提交后,重新推送到 Gerrit +git push origin HEAD:refs/for/master + +# 如果提示需要 force push,使用: +git push origin HEAD:refs/for/master --force + +================================================================================ +五、分支操作 +================================================================================ + +【创建新分支】 + +# 基于当前分支创建新分支 +git checkout -b feature/new-feature + +# 基于指定分支创建新分支 +git checkout -b feature/new-feature origin/master + +# 基于指定提交创建新分支 +git checkout -b feature/new-feature + +【切换分支】 + +# 切换到已存在的分支 +git checkout branch-name + +# 切换到 master 分支 +git checkout master + +【查看分支】 + +# 查看本地分支 +git branch + +# 查看所有分支(包括远程) +git branch -a + +# 查看远程分支 +git branch -r + +【删除分支】 + +# 删除本地分支 +git branch -d branch-name + +# 强制删除本地分支 +git branch -D branch-name + +【推送分支到 Gerrit】 + +# 推送新分支 +git push origin branch-name:refs/for/branch-name + +# 推送并设置上游分支 +git push -u origin branch-name:refs/for/branch-name + +================================================================================ +六、查看和比较 +================================================================================ + +【查看提交历史】 + +# 查看提交历史 +git log + +# 查看简洁的提交历史 +git log --oneline + +# 查看图形化的提交历史 +git log --graph --oneline --all + +# 查看最近 N 次提交 +git log -n 5 + +# 查看指定文件的提交历史 +git log file.txt + +# 查看提交的详细修改 +git log -p + +【查看差异】 + +# 查看工作区和暂存区的差异 +git diff + +# 查看暂存区和最后一次提交的差异 +git diff --cached + +# 查看工作区和最后一次提交的差异 +git diff HEAD + +# 查看两次提交之间的差异 +git diff commit1 commit2 + +# 查看两个分支之间的差异 +git diff branch1 branch2 + +【查看文件状态】 + +# 查看工作区状态 +git status + +# 查看简洁的状态 +git status -s + +# 查看详细的文件状态 +git status -v + +================================================================================ +七、撤销操作 +================================================================================ + +【撤销工作区修改】 + +# 撤销单个文件的修改 +git checkout -- file.txt + +# 撤销所有文件的修改(危险!) +git checkout -- . + +# 使用 restore 命令(Git 2.23+) +git restore file.txt +git restore . + +【撤销暂存区的修改】 + +# 取消暂存单个文件 +git reset HEAD file.txt + +# 取消暂存所有文件 +git reset HEAD + +# 使用 restore 命令(Git 2.23+) +git restore --staged file.txt +git restore --staged . + +【撤销提交】 + +# 撤销最后一次提交,保留修改在暂存区 +git reset --soft HEAD~1 + +# 撤销最后一次提交,保留修改在工作区 +git reset --mixed HEAD~1 +# 或 +git reset HEAD~1 + +# 撤销最后一次提交,完全删除修改(危险!) +git reset --hard HEAD~1 + +================================================================================ +八、Gerrit 特定操作 +================================================================================ + +【推送代码评审】 + +# 推送到 master 分支的评审队列 +git push origin HEAD:refs/for/master + +# 推送到 develop 分支的评审队列 +git push origin HEAD:refs/for/develop + +# 推送时添加主题(Topic) +git push origin HEAD:refs/for/master%topic=feature-name + +# 推送时添加评审者 +git push origin HEAD:refs/for/master%r=reviewer@example.com + +# 推送时添加多个评审者 +git push origin HEAD:refs/for/master%r=reviewer1@example.com,r=reviewer2@example.com + +# 推送时标记为 Work In Progress(WIP) +git push origin HEAD:refs/for/master%wip + +# 推送时标记为私有(只有评审者可见) +git push origin HEAD:refs/for/master%private + +【直接推送(跳过评审,不推荐)】 + +# 直接推送到 master 分支(绕过评审) +git push origin HEAD:refs/heads/master + +# 直接推送到其他分支 +git push origin HEAD:refs/heads/branch-name + +【查看 Gerrit 变更】 + +# 查看变更列表(需要安装 gerrit 工具) +ssh -p 29418 renjianbo@101.43.95.130 gerrit query status:open + +# 查看特定变更 +ssh -p 29418 renjianbo@101.43.95.130 gerrit query change:1 + +# 查看我的变更 +ssh -p 29418 renjianbo@101.43.95.130 gerrit query owner:renjianbo + +【下载变更到本地】 + +# 下载变更到本地(cherry-pick) +git fetch ssh://renjianbo@101.43.95.130:29418/project-name refs/changes/01/1/1 +git cherry-pick FETCH_HEAD + +# 或使用 checkout +git fetch ssh://renjianbo@101.43.95.130:29418/project-name refs/changes/01/1/1 +git checkout FETCH_HEAD + +================================================================================ +九、合并后的操作 +================================================================================ + +【更新本地仓库】 + +# 切换到 master 分支 +git checkout master + +# 拉取最新代码 +git pull origin master + +# 或使用 fetch + merge +git fetch origin +git merge origin/master + +【清理已合并的分支】 + +# 删除已合并的本地分支 +git branch -d feature-branch + +# 强制删除分支(即使未合并) +git branch -D feature-branch + +# 删除远程分支的引用 +git remote prune origin + +【同步远程分支】 + +# 获取所有远程分支信息 +git fetch origin + +# 查看远程分支 +git branch -r + +# 创建本地分支跟踪远程分支 +git checkout -b local-branch origin/remote-branch + +================================================================================ +十、常用工作流程 +================================================================================ + +【工作流程1:创建新功能】 + +# 1. 更新主分支 +git checkout master +git pull origin master + +# 2. 创建功能分支 +git checkout -b feature/new-feature + +# 3. 开发代码 +# ... 修改代码 ... + +# 4. 提交代码 +git add . +git commit -m "Add new feature" + +# 5. 推送到 Gerrit 评审 +git push origin HEAD:refs/for/master + +# 6. 在 Gerrit Web 界面进行评审 + +# 7. 合并后,更新本地仓库 +git checkout master +git pull origin master +git branch -d feature/new-feature + +【工作流程2:修复 Bug】 + +# 1. 从 master 创建修复分支 +git checkout master +git pull origin master +git checkout -b bugfix/fix-issue-123 + +# 2. 修复代码 +# ... 修复代码 ... + +# 3. 提交修复 +git add . +git commit -m "Fix issue #123" + +# 4. 推送到 Gerrit 评审 +git push origin HEAD:refs/for/master + +【工作流程3:修改已提交的代码】 + +# 1. 修改代码 +# ... 修改代码 ... + +# 2. 添加到最后一次提交 +git add . +git commit --amend --no-edit + +# 3. 重新推送(会自动更新原变更) +git push origin HEAD:refs/for/master + +【工作流程4:处理评审意见】 + +# 1. 查看评审意见(在 Gerrit Web 界面) + +# 2. 修改代码 +# ... 根据意见修改代码 ... + +# 3. 修改提交 +git add . +git commit --amend --no-edit + +# 4. 重新推送 +git push origin HEAD:refs/for/master + +================================================================================ +十一、高级操作 +================================================================================ + +【Stash 操作(暂存修改)】 + +# 暂存当前修改 +git stash + +# 暂存并添加描述 +git stash save "Work in progress" + +# 查看暂存列表 +git stash list + +# 恢复暂存(保留暂存记录) +git stash apply + +# 恢复暂存(删除暂存记录) +git stash pop + +# 删除暂存 +git stash drop + +# 清空所有暂存 +git stash clear + +【Rebase 操作】 + +# 将当前分支 rebase 到 master +git checkout feature-branch +git rebase master + +# 交互式 rebase(修改最近 3 次提交) +git rebase -i HEAD~3 + +# 中止 rebase +git rebase --abort + +# 继续 rebase +git rebase --continue + +【Cherry-pick 操作】 + +# 选择性地应用某个提交 +git cherry-pick + +# 选择性地应用多个提交 +git cherry-pick + +# 选择性地应用提交范围 +git cherry-pick .. + +================================================================================ +十二、配置 SSH(避免每次输入长命令) +================================================================================ + +【创建 SSH 配置文件】 + +# 创建配置文件 +mkdir -p ~/.ssh +cat > ~/.ssh/config << 'EOF' +Host 101.43.95.130 + Port 29418 + PubkeyAcceptedKeyTypes +ssh-rsa + PubkeyAcceptedAlgorithms +ssh-rsa +EOF + +# 设置权限 +chmod 600 ~/.ssh/config + +【配置后可以直接使用】 + +# 配置后,可以直接使用简短的命令 +git push origin HEAD:refs/for/master + +# 不需要每次都输入: +# GIT_SSH_COMMAND="ssh -o PubkeyAcceptedKeyTypes=+ssh-rsa ..." git push ... + +================================================================================ +十三、常用命令速查表 +================================================================================ + +【日常开发】 + +git status # 查看状态 +git add . # 暂存所有修改 +git commit -m "message" # 提交代码 +git push origin HEAD:refs/for/master # 推送到 Gerrit + +【查看信息】 + +git log --oneline # 查看提交历史 +git diff # 查看修改 +git branch # 查看分支 + +【分支操作】 + +git checkout -b branch-name # 创建并切换分支 +git checkout branch-name # 切换分支 +git branch -d branch-name # 删除分支 + +【撤销操作】 + +git checkout -- file.txt # 撤销文件修改 +git reset HEAD file.txt # 取消暂存 +git commit --amend # 修改最后一次提交 + +【Gerrit 特定】 + +git push origin HEAD:refs/for/master # 推送评审 +git push origin HEAD:refs/for/master%wip # 推送为 WIP +git commit --amend --no-edit # 修改提交(保持 Change-Id) + +================================================================================ +十四、重要提示 +================================================================================ + +1. 推送到 Gerrit 必须使用 refs/for/ 前缀,例如: + git push origin HEAD:refs/for/master + + 不要直接推送到 refs/heads/master(会绕过评审) + +2. 每次提交都会自动包含 Change-Id(如果安装了 commit-msg hook) + +3. 修改提交后重新推送,会自动更新原变更,不会创建新变更 + +4. 推送成功后,Gerrit 会返回变更 URL,例如: + remote: http://101.43.95.130:8080/c/project/+/1 [NEW] + +5. 在 Gerrit Web 界面进行代码评审,不要直接合并到主分支 + +6. 合并后,记得更新本地仓库: + git checkout master + git pull origin master + +7. 如果遇到问题,查看 Gerrit 日志: + cd /home/renjianbo/gerrit_install/review_site + tail -f logs/httpd_log + +================================================================================ +文档结束 +================================================================================ + diff --git a/(红头)gerrit问题解决.txt b/(红头)gerrit问题解决.txt new file mode 100644 index 0000000..8b63167 --- /dev/null +++ b/(红头)gerrit问题解决.txt @@ -0,0 +1,309 @@ +================================================================================ + Gerrit 问题解决方案文档 +================================================================================ + +文档名称:Gerrit 登录和推送问题解决方案 +创建日期:2025-12-15 +适用版本:Gerrit 3.3.8 +服务器地址:http://101.43.95.130:8080 + +================================================================================ +一、登录问题解决方案 +================================================================================ + +问题现象: +---------- +- 点击 Account ID 登录后,界面仍然显示 "ANONYMOUS"(匿名用户) +- 服务器端登录成功(日志显示账户ID),但浏览器界面显示匿名 + +问题根源: +---------- +这是浏览器的 Cookie 安全策略导致的。现代浏览器(Chrome/Edge/Firefox)对 +Cookie 有严格的安全限制,特别是 SameSite 属性。 + +解决方案: +---------- + +【方案一】修改 Chrome 浏览器的 SameSite 标志(推荐) + +1. 在 Chrome 地址栏输入:chrome://flags/ +2. 在搜索框输入:SameSite +3. 找到以下选项并修改: + - "SameSite by default cookies" → 设置为 Disabled + - "Cookies without SameSite must be secure" → 设置为 Disabled +4. 点击右下角的"重新启动"按钮 +5. 清除浏览器 Cookie(Ctrl+Shift+Delete,选择"所有时间",清除 Cookie) +6. 重新访问:http://101.43.95.130:8080 +7. 点击 Account ID 登录 + +【方案二】修改 Firefox 浏览器的配置 + +1. 在 Firefox 地址栏输入:about:config +2. 点击"接受风险并继续" +3. 在搜索框输入:network.cookie.sameSite.noneRequiresSecure +4. 双击该选项,将值改为 false +5. 重启 Firefox +6. 清除浏览器 Cookie +7. 重新访问:http://101.43.95.130:8080 +8. 点击 Account ID 登录 + +【方案三】服务器端配置(已完成) + +服务器端已配置: +- cookieSecure = false(允许 HTTP 使用 Cookie) +- cookieSameSite = LAX(允许跨站 Cookie) +- canonicalWebUrl = http://101.43.95.130:8080/(正确的访问地址) + +================================================================================ +二、代码推送问题解决方案 +================================================================================ + +问题现象: +---------- +- HTTP 推送失败:remote: Unauthorized +- SSH 推送失败:Permission denied (publickey) 或 no mutual signature algorithm + +问题根源: +---------- +1. HTTP 认证:DEVELOPMENT_BECOME_ANY_ACCOUNT 模式对 HTTP Basic 认证支持有限 +2. SSH 认证:OpenSSH 10.0 默认禁用了某些旧的签名算法(如 RSA-SHA1), + 而 Gerrit 3.3.8 使用的 Apache SSHD 可能不支持新的签名算法 + +解决方案: +---------- + +【步骤一】配置 SSH 密钥 + +1. 生成 SSH 密钥(如果还没有): + ssh-keygen -t rsa -b 4096 -C "your_email@example.com" + +2. 查看公钥内容: + cat ~/.ssh/id_rsa.pub + # Windows Git Bash 使用: + type ~/.ssh/id_rsa.pub + +3. 将公钥添加到 Gerrit: + - 访问:http://101.43.95.130:8080/#/settings/ssh-keys + - 在 "New SSH key" 输入框中粘贴完整公钥 + - 点击 "Add" 保存 + +【步骤二】创建 SSH 配置文件(解决签名算法问题) + +在本地电脑上创建 SSH 配置文件: + +1. 创建配置文件: + mkdir -p ~/.ssh + cat > ~/.ssh/config << 'EOF' + Host 101.43.95.130 + Port 29418 + PubkeyAcceptedKeyTypes +ssh-rsa + PubkeyAcceptedAlgorithms +ssh-rsa + EOF + +2. 设置正确的权限: + chmod 600 ~/.ssh/config + +3. 验证配置: + cat ~/.ssh/config + +【步骤三】测试 SSH 连接 + +ssh -p 29418 renjianbo@101.43.95.130 gerrit version + +如果成功,会显示:gerrit version 3.3.8 + +【步骤四】配置 Git 使用 SSH + +1. 删除 HTTP 远程仓库: + git remote remove origin + +2. 添加 SSH 远程仓库: + git remote add origin ssh://renjianbo@101.43.95.130:29418/test-project + +3. 验证远程仓库配置: + git remote -v + +【步骤五】注册邮箱地址 + +1. 访问:http://101.43.95.130:8080/#/settings/email-addresses +2. 在 "New Email Address" 输入框中输入您的邮箱地址 +3. 点击 "Add" 按钮 +4. 如果需要验证,按提示完成验证 + +【步骤六】安装 commit-msg hook(添加 Change-Id) + +1. 下载 commit-msg hook: + cd /d/ttt/test-project + mkdir -p .git/hooks + curl -o .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg + chmod +x .git/hooks/commit-msg + +2. 修改最后一次提交(添加 Change-Id): + git commit --amend --no-edit + +【步骤七】推送代码 + +git push origin HEAD:refs/for/master + +推送成功后,Gerrit 会返回变更 URL,例如: +remote: http://101.43.95.130:8080/c/test-project/+/1 [NEW] + +================================================================================ +三、防火墙配置(如果 SSH 连接超时) +================================================================================ + +如果 SSH 连接超时(Connection timed out),需要配置防火墙: + +【云服务器】 + +1. 登录云控制台(阿里云、腾讯云等) +2. 找到安全组配置 +3. 添加入站规则: + - 协议:TCP + - 端口:29418 + - 源:0.0.0.0/0(或您的 IP) +4. 保存规则 + +【本地服务器】 + +sudo firewall-cmd --permanent --add-port=29418/tcp +sudo firewall-cmd --reload +sudo firewall-cmd --list-ports | grep 29418 + +================================================================================ +四、完整操作流程示例 +================================================================================ + +【首次设置】 + +1. 配置 SSH 密钥和配置文件(见上述步骤一、二) + +2. 克隆项目: + git clone ssh://renjianbo@101.43.95.130:29418/test-project + cd test-project + +3. 安装 commit-msg hook: + mkdir -p .git/hooks + curl -o .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg + chmod +x .git/hooks/commit-msg + +4. 配置 Git 用户信息: + git config user.name "Your Name" + git config user.email "your_email@example.com" + +【日常开发流程】 + +1. 修改代码 +2. 提交代码: + git add . + git commit -m "Your commit message" +3. 推送代码评审: + git push origin HEAD:refs/for/master +4. 在 Gerrit Web 界面进行评审 +5. 如果有修改意见,修改后重新推送: + git commit --amend + git push origin HEAD:refs/for/master +6. 合并后,更新本地仓库: + git checkout master + git pull origin master + +================================================================================ +五、常见问题排查 +================================================================================ + +【问题1】SSH 连接超时 + +检查项: +- 防火墙是否开放 29418 端口 +- 云服务器安全组是否配置正确 +- Gerrit SSH 服务是否运行:bin/gerrit.sh status + +【问题2】SSH 认证失败(Permission denied) + +检查项: +- 公钥是否已添加到 Gerrit +- SSH 配置文件是否正确 +- 用户名是否正确(Settings → Profile) + +【问题3】缺少 Change-Id + +解决: +- 安装 commit-msg hook(见步骤六) +- 使用 git commit --amend --no-edit 修改提交 + +【问题4】邮箱地址未注册 + +解决: +- 访问 Settings → Email Addresses +- 添加您的邮箱地址 + +【问题5】HTTP 推送失败 + +解决: +- 使用 SSH 方式推送(推荐) +- 或配置 gitBasicAuth = true(服务器端已配置) + +================================================================================ +六、服务器端配置摘要 +================================================================================ + +当前服务器配置(/home/renjianbo/gerrit_install/review_site/etc/gerrit.config): + +[gerrit] + basePath = git + canonicalWebUrl = http://101.43.95.130:8080/ + serverId = fab2bec9-a17c-434d-9a25-76a7f2675339 + +[database] + type = h2 + database = db/ReviewDB + +[auth] + type = DEVELOPMENT_BECOME_ANY_ACCOUNT + gitBasicAuth = true + +[sshd] + listenAddress = *:29418 + +[httpd] + listenUrl = http://*:8080/ + cookieSecure = false + cookieSameSite = LAX + cookiePath = / + +[cache] + directory = cache + +[index] + type = LUCENE + +[receive] + enableSignedPush = false + +================================================================================ +七、重要提示 +================================================================================ + +1. SSH 方式比 HTTP 更可靠,强烈推荐使用 SSH 推送代码 + +2. 安装 commit-msg hook 后,以后的所有提交都会自动包含 Change-Id + +3. 创建 SSH 配置文件后,以后可以直接使用 git push,不需要每次都 + 输入长命令 + +4. 如果遇到问题,查看服务器日志: + cd /home/renjianbo/gerrit_install/review_site + tail -f logs/httpd_log + tail -f logs/sshd_log + +5. 常用链接: + - Gerrit 主页:http://101.43.95.130:8080 + - 所有变更:http://101.43.95.130:8080/#/q/status:open + - 我的变更:http://101.43.95.130:8080/#/q/owner:renjianbo + - SSH Keys:http://101.43.95.130:8080/#/settings/ssh-keys + - Email 地址:http://101.43.95.130:8080/#/settings/email-addresses + +================================================================================ +文档结束 +================================================================================ + diff --git a/(红头1)服务器启停说明.txt b/(红头1)服务器启停说明.txt new file mode 100644 index 0000000..dd98ed0 --- /dev/null +++ b/(红头1)服务器启停说明.txt @@ -0,0 +1,428 @@ +================================================================================ + 服务器启停操作说明 +================================================================================ + +文档名称:服务器启停操作说明 +创建日期:2025-01-XX +服务器类型:Gerrit Code Review +服务器路径:/home/renjianbo/gerrit_install/review_site +Java 版本:Java 17 + +================================================================================ +一、快速操作命令 +================================================================================ + +【启动服务器】 +cd /home/renjianbo/gerrit_install/review_site +JAVA_HOME=/usr/local/java/jdk-17.0.12+7 bin/gerrit.sh start + +【停止服务器】 +cd /home/renjianbo/gerrit_install/review_site +bin/gerrit.sh stop + +【重启服务器】 +cd /home/renjianbo/gerrit_install/review_site +bin/gerrit.sh stop +sleep 3 +JAVA_HOME=/usr/local/java/jdk-17.0.12+7 bin/gerrit.sh start + +【查看服务状态】 +cd /home/renjianbo/gerrit_install/review_site +bin/gerrit.sh status + +【查看进程】 +ps aux | grep gerrit | grep -v grep + +================================================================================ +二、详细操作步骤 +================================================================================ + +【启动服务器】 + +1. 进入服务器目录: + cd /home/renjianbo/gerrit_install/review_site + +2. 启动服务(使用 Java 17): + JAVA_HOME=/usr/local/java/jdk-17.0.12+7 bin/gerrit.sh start + +3. 等待服务启动(建议等待 5-10 秒): + sleep 5 + +4. 检查服务状态: + bin/gerrit.sh status + +5. 验证服务是否正常运行: + - 检查端口监听:netstat -tlnp | grep 8080 + - 测试 HTTP 访问:curl http://localhost:8080/ + - 访问 Web 界面:http://101.43.95.130:8080 + +【停止服务器】 + +1. 进入服务器目录: + cd /home/renjianbo/gerrit_install/review_site + +2. 停止服务: + bin/gerrit.sh stop + +3. 等待服务停止(建议等待 3-5 秒): + sleep 3 + +4. 验证服务已停止: + bin/gerrit.sh status + ps aux | grep gerrit | grep -v grep + +5. 如果服务未正常停止,强制停止: + # 查找进程 ID + ps aux | grep gerrit | grep -v grep + + # 强制停止(替换 PID 为实际进程 ID) + kill -9 + + # 或者直接停止所有 Gerrit 进程 + pkill -9 -f gerrit + +【重启服务器】 + +1. 进入服务器目录: + cd /home/renjianbo/gerrit_install/review_site + +2. 停止服务: + bin/gerrit.sh stop + +3. 等待服务完全停止: + sleep 3 + +4. 启动服务(使用 Java 17): + JAVA_HOME=/usr/local/java/jdk-17.0.12+7 bin/gerrit.sh start + +5. 等待服务启动: + sleep 5 + +6. 检查服务状态: + bin/gerrit.sh status + +7. 验证服务正常运行: + curl -s -o /dev/null -w "HTTP Status: %{http_code}\n" http://localhost:8080/ + +================================================================================ +三、服务状态检查 +================================================================================ + +【检查服务状态】 + +1. 使用 Gerrit 脚本检查: + cd /home/renjianbo/gerrit_install/review_site + bin/gerrit.sh status + +2. 检查进程: + ps aux | grep gerrit | grep -v grep + +3. 检查端口监听: + # HTTP 端口(默认 8080) + netstat -tlnp | grep 8080 + # 或使用 ss 命令 + ss -tlnp | grep 8080 + + # SSH 端口(默认 29418) + netstat -tlnp | grep 29418 + # 或使用 ss 命令 + ss -tlnp | grep 29418 + +4. 测试 HTTP 服务: + curl http://localhost:8080/ + # 或检查 HTTP 状态码 + curl -s -o /dev/null -w "HTTP Status: %{http_code}\n" http://localhost:8080/ + +5. 测试 SSH 服务: + ssh -p 29418 renjianbo@localhost gerrit version + +6. 检查 Web 界面访问: + 浏览器访问:http://101.43.95.130:8080 + +================================================================================ +四、日志查看 +================================================================================ + +【查看实时日志】 + +1. HTTP 访问日志: + cd /home/renjianbo/gerrit_install/review_site + tail -f logs/httpd_log + +2. SSH 访问日志: + cd /home/renjianbo/gerrit_install/review_site + tail -f logs/sshd_log + +3. Gerrit 主日志: + cd /home/renjianbo/gerrit_install/review_site + tail -f logs/gerrit.log + +4. 错误日志: + cd /home/renjianbo/gerrit_install/review_site + tail -f logs/error_log + +【查看历史日志】 + +1. 查看最后 N 行日志: + tail -100 logs/gerrit.log # 查看最后 100 行 + tail -50 logs/error_log # 查看最后 50 行错误日志 + +2. 搜索日志内容: + grep "error" logs/gerrit.log | tail -20 + grep "renjianbo" logs/httpd_log | tail -20 + +================================================================================ +五、常见问题处理 +================================================================================ + +【问题1】服务启动失败 + +检查步骤: +1. 检查 Java 版本和路径: + /usr/local/java/jdk-17.0.12+7/bin/java -version + echo $JAVA_HOME + +2. 检查端口是否被占用: + netstat -tlnp | grep 8080 + netstat -tlnp | grep 29418 + + 如果端口被占用: + - 查找占用进程:lsof -i :8080 + - 停止占用进程或修改配置文件中的端口 + +3. 查看错误日志: + cd /home/renjianbo/gerrit_install/review_site + tail -50 logs/error_log + +4. 检查磁盘空间: + df -h + +5. 检查内存: + free -h + +【问题2】服务无法停止 + +解决方法: +1. 查找进程: + ps aux | grep gerrit | grep -v grep + +2. 强制停止: + kill -9 + + 或: + pkill -9 -f gerrit + +3. 验证已停止: + bin/gerrit.sh status + ps aux | grep gerrit | grep -v grep + +【问题3】服务启动后无法访问 + +检查步骤: +1. 检查服务状态: + bin/gerrit.sh status + +2. 检查端口监听: + netstat -tlnp | grep 8080 + +3. 检查防火墙: + sudo firewall-cmd --list-ports + # 确保 8080 和 29418 端口已开放 + + # 如果需要开放端口: + sudo firewall-cmd --permanent --add-port=8080/tcp + sudo firewall-cmd --permanent --add-port=29418/tcp + sudo firewall-cmd --reload + +4. 检查配置文件: + cat etc/gerrit.config | grep listenUrl + cat etc/gerrit.config | grep canonicalWebUrl + +5. 测试本地访问: + curl http://localhost:8080/ + +【问题4】Java 版本问题 + +如果遇到 Java 版本错误: +1. 检查 Java 安装路径: + ls -la /usr/local/java/ + +2. 使用指定 Java 版本启动: + JAVA_HOME=/usr/local/java/jdk-17.0.12+7 bin/gerrit.sh start + +3. 或者设置环境变量: + export JAVA_HOME=/usr/local/java/jdk-17.0.12+7 + export PATH=$JAVA_HOME/bin:$PATH + bin/gerrit.sh start + +================================================================================ +六、一键操作脚本 +================================================================================ + +【启动脚本】 + +#!/bin/bash +cd /home/renjianbo/gerrit_install/review_site +JAVA_HOME=/usr/local/java/jdk-17.0.12+7 bin/gerrit.sh start +sleep 5 +bin/gerrit.sh status + +【停止脚本】 + +#!/bin/bash +cd /home/renjianbo/gerrit_install/review_site +bin/gerrit.sh stop +sleep 3 +ps aux | grep gerrit | grep -v grep + +【重启脚本】 + +#!/bin/bash +cd /home/renjianbo/gerrit_install/review_site +bin/gerrit.sh stop +sleep 3 +JAVA_HOME=/usr/local/java/jdk-17.0.12+7 bin/gerrit.sh start +sleep 5 +bin/gerrit.sh status +curl -s -o /dev/null -w "HTTP Status: %{http_code}\n" http://localhost:8080/ + +【状态检查脚本】 + +#!/bin/bash +cd /home/renjianbo/gerrit_install/review_site +echo "=== 服务状态 ===" +bin/gerrit.sh status +echo "" +echo "=== 端口监听状态 ===" +netstat -tlnp | grep -E "8080|29418" +echo "" +echo "=== 进程状态 ===" +ps aux | grep gerrit | grep -v grep +echo "" +echo "=== HTTP 服务测试 ===" +curl -s -o /dev/null -w "HTTP Status: %{http_code}\n" http://localhost:8080/ + +================================================================================ +七、系统服务配置(可选) +================================================================================ + +如果需要将服务器配置为系统服务(开机自启动),可以使用 systemd: + +【创建服务文件】 + +sudo vi /etc/systemd/system/gerrit.service + +【服务文件内容】 + +[Unit] +Description=Gerrit Code Review +After=network.target + +[Service] +Type=forking +User=renjianbo +Group=renjianbo +WorkingDirectory=/home/renjianbo/gerrit_install/review_site +Environment="JAVA_HOME=/usr/local/java/jdk-17.0.12+7" +ExecStart=/home/renjianbo/gerrit_install/review_site/bin/gerrit.sh start +ExecStop=/home/renjianbo/gerrit_install/review_site/bin/gerrit.sh stop +Restart=on-failure +RestartSec=10 + +[Install] +WantedBy=multi-user.target + +【使用系统服务】 + +1. 重新加载 systemd: + sudo systemctl daemon-reload + +2. 启动服务: + sudo systemctl start gerrit + +3. 停止服务: + sudo systemctl stop gerrit + +4. 重启服务: + sudo systemctl restart gerrit + +5. 查看状态: + sudo systemctl status gerrit + +6. 设置开机自启动: + sudo systemctl enable gerrit + +7. 取消开机自启动: + sudo systemctl disable gerrit + +================================================================================ +八、快速参考命令 +================================================================================ + +# 启动服务器 +cd /home/renjianbo/gerrit_install/review_site && JAVA_HOME=/usr/local/java/jdk-17.0.12+7 bin/gerrit.sh start + +# 停止服务器 +cd /home/renjianbo/gerrit_install/review_site && bin/gerrit.sh stop + +# 重启服务器 +cd /home/renjianbo/gerrit_install/review_site && bin/gerrit.sh stop && sleep 3 && JAVA_HOME=/usr/local/java/jdk-17.0.12+7 bin/gerrit.sh start + +# 查看状态 +cd /home/renjianbo/gerrit_install/review_site && bin/gerrit.sh status + +# 查看日志 +cd /home/renjianbo/gerrit_install/review_site && tail -f logs/gerrit.log + +# 检查端口 +netstat -tlnp | grep -E "8080|29418" + +# 测试 HTTP +curl http://localhost:8080/ + +# 测试 SSH +ssh -p 29418 renjianbo@localhost gerrit version + +================================================================================ +九、重要提示 +================================================================================ + +1. 启动服务前,确保: + - Java 17 已正确安装(路径:/usr/local/java/jdk-17.0.12+7) + - 端口 8080(HTTP)和 29418(SSH)未被占用 + - 有足够的磁盘空间和内存 + - 服务器目录存在:/home/renjianbo/gerrit_install/review_site + +2. 停止服务前,建议: + - 等待当前操作完成 + - 通知相关用户(如果有) + +3. 重启服务后,建议: + - 等待 5-10 秒让服务完全启动 + - 检查服务状态 + - 测试 HTTP 和 SSH 访问 + - 验证 Web 界面可正常访问 + +4. 日志文件位置: + - HTTP 日志:logs/httpd_log + - SSH 日志:logs/sshd_log + - 主日志:logs/gerrit.log + - 错误日志:logs/error_log + +5. 配置文件位置: + - 主配置:etc/gerrit.config + - 安全配置:etc/secure.config + +6. 数据目录: + - Git 仓库:git/ + - 数据库:db/ + - 缓存:cache/ + +7. 服务器访问地址: + - Web 界面:http://101.43.95.130:8080 + - SSH 端口:29418 + +================================================================================ +文档结束 +================================================================================ + diff --git a/CI流水线部署方案.md b/CI流水线部署方案.md new file mode 100644 index 0000000..6ecfd91 --- /dev/null +++ b/CI流水线部署方案.md @@ -0,0 +1,456 @@ +# CI/CD 流水线部署方案 + +## 概述 + +当前项目已部署 Gerrit 代码审查系统(运行在 `http://101.43.95.130:8080`),本文档提供几种 CI/CD 流水线部署方案,可根据需求选择。 + +--- + +## 方案对比 + +| 方案 | 优点 | 缺点 | 适用场景 | +|------|------|------|----------| +| **Jenkins** | 功能强大、插件丰富、与 Gerrit 集成好 | 资源占用较大 | 企业级、复杂流水线 | +| **Drone CI** | 轻量级、现代化、Docker 原生 | 功能相对简单 | 中小型项目、容器化环境 | +| **GitLab Runner** | 独立运行、配置简单 | 需要单独配置 | 熟悉 GitLab CI 语法 | +| **Webhook + 脚本** | 最轻量、完全自定义 | 需要自己开发 | 简单自动化需求 | + +--- + +## 方案一:Jenkins(推荐) + +### 特点 +- ✅ 与 Gerrit 深度集成,支持事件触发 +- ✅ 丰富的插件生态 +- ✅ 成熟的流水线配置(Pipeline as Code) +- ✅ 支持分布式构建 + +### 安装步骤 + +#### 1. 快速安装(使用脚本) + +```bash +# 运行 Jenkins 安装脚本 +bash install_jenkins.sh +``` + +#### 2. 手动安装 + +```bash +# 1. 安装 Jenkins(CentOS/RHEL) +sudo wget -O /etc/yum.repos.d/jenkins.repo \ + https://pkg.jenkins.io/redhat-stable/jenkins.repo +sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key +sudo yum install -y jenkins + +# 2. 启动 Jenkins +sudo systemctl start jenkins +sudo systemctl enable jenkins + +# 3. 查看初始密码 +sudo cat /var/lib/jenkins/secrets/initialAdminPassword + +# 4. 访问 Jenkins +# http://101.43.95.130:8080(如果端口冲突,Jenkins 默认使用 8080,需要修改) +``` + +### Gerrit 集成配置 + +#### 1. 安装 Gerrit Trigger 插件 +- Jenkins 管理界面 → 插件管理 → 搜索 "Gerrit Trigger" → 安装 + +#### 2. 配置 Gerrit 连接 +- Jenkins 管理界面 → 系统配置 → Gerrit Trigger +- 添加 Gerrit Server: + - **Name**: `Gerrit-Server` + - **Frontend URL**: `http://101.43.95.130:8080` + - **SSH Port**: `29418` + - **Username**: `admin`(或您的 Gerrit 用户名) + - **SSH Keyfile**: `/home/renjianbo/.ssh/id_rsa`(Gerrit SSH 密钥路径) + +#### 3. 创建流水线任务 +- 新建任务 → 选择 "流水线" 类型 +- 在 Pipeline 脚本中配置: + +```groovy +pipeline { + agent any + + triggers { + gerrit( + serverName: 'Gerrit-Server', + events: [ + changeMerged(), + patchsetCreated() + ], + project: 'plain:.*', + branch: 'plain:.*' + ) + } + + stages { + stage('构建') { + steps { + echo '开始构建...' + sh 'mvn clean package' // 或您的构建命令 + } + } + + stage('测试') { + steps { + echo '运行测试...' + sh 'mvn test' + } + } + + stage('部署') { + steps { + echo '部署应用...' + // 您的部署脚本 + } + } + } + + post { + success { + echo '流水线执行成功' + } + failure { + echo '流水线执行失败' + } + } +} +``` + +--- + +## 方案二:Drone CI(轻量级) + +### 特点 +- ✅ 轻量级,资源占用小 +- ✅ 基于 Docker,易于扩展 +- ✅ 配置简单,YAML 格式 +- ✅ 支持 Gerrit Webhook + +### 安装步骤 + +#### 1. 安装 Docker(如果未安装) + +```bash +# CentOS/RHEL +sudo yum install -y docker +sudo systemctl start docker +sudo systemctl enable docker +``` + +#### 2. 安装 Drone Server + +```bash +# 创建 Drone 配置目录 +sudo mkdir -p /opt/drone +cd /opt/drone + +# 运行 Drone Server(使用 Docker) +docker run \ + --volume=/opt/drone:/data \ + --env=DRONE_GERRIT_SERVER=http://101.43.95.130:8080 \ + --env=DRONE_GERRIT_USERNAME=admin \ + --env=DRONE_RPC_SECRET=$(openssl rand -hex 16) \ + --env=DRONE_SERVER_HOST=101.43.95.130:3000 \ + --env=DRONE_SERVER_PROTO=http \ + --publish=3000:80 \ + --publish=443:443 \ + --restart=always \ + --detach=true \ + --name=drone \ + drone/drone:latest +``` + +#### 3. 安装 Drone Runner + +```bash +# 运行 Drone Runner +docker run -d \ + -v /var/run/docker.sock:/var/run/docker.sock \ + -e DRONE_RPC_PROTO=http \ + -e DRONE_RPC_HOST=101.43.95.130:3000 \ + -e DRONE_RPC_SECRET=<从上面获取的密钥> \ + -e DRONE_RUNNER_CAPACITY=2 \ + -e DRONE_RUNNER_NAME=runner-1 \ + --restart always \ + --name runner \ + drone/drone-runner-docker:latest +``` + +### 配置 Gerrit Webhook + +在 Gerrit 项目中创建 `.drone.yml` 文件: + +```yaml +kind: pipeline +type: docker +name: default + +steps: +- name: build + image: maven:3.8-openjdk-17 + commands: + - mvn clean package + +- name: test + image: maven:3.8-openjdk-17 + commands: + - mvn test + +- name: deploy + image: alpine + commands: + - echo "部署应用..." +``` + +在 Gerrit 项目设置中配置 Webhook: +- URL: `http://101.43.95.130:3000/hook` +- 触发事件: `change-merged`, `patchset-created` + +--- + +## 方案三:GitLab Runner(独立运行) + +### 特点 +- ✅ 独立运行,不需要 GitLab +- ✅ 使用 GitLab CI 语法 +- ✅ 支持多种执行器(Docker、Shell 等) + +### 安装步骤 + +```bash +# 1. 下载 GitLab Runner +curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh" | sudo bash +sudo yum install -y gitlab-runner + +# 2. 注册 Runner(需要 GitLab 实例,或使用本地配置) +sudo gitlab-runner register \ + --non-interactive \ + --url "http://localhost" \ + --registration-token "your-token" \ + --executor "shell" \ + --description "Gerrit Runner" + +# 3. 启动 Runner +sudo systemctl start gitlab-runner +sudo systemctl enable gitlab-runner +``` + +### 使用方式 + +在项目根目录创建 `.gitlab-ci.yml`: + +```yaml +stages: + - build + - test + - deploy + +build: + stage: build + script: + - echo "构建项目..." + - mvn clean package + +test: + stage: test + script: + - echo "运行测试..." + - mvn test + +deploy: + stage: deploy + script: + - echo "部署应用..." +``` + +通过 Gerrit Webhook 触发 GitLab Runner 执行。 + +--- + +## 方案四:Webhook + 自定义脚本(最简单) + +### 特点 +- ✅ 最轻量,无需额外服务 +- ✅ 完全自定义 +- ✅ 资源占用最小 + +### 实现步骤 + +#### 1. 创建 Webhook 接收脚本 + +```bash +# 创建目录 +mkdir -p /opt/ci-scripts +cd /opt/ci-scripts + +# 创建简单的 HTTP 服务器接收 Webhook +cat > webhook_receiver.py << 'EOF' +#!/usr/bin/env python3 +from http.server import HTTPServer, BaseHTTPRequestHandler +import json +import subprocess +import os + +class WebhookHandler(BaseHTTPRequestHandler): + def do_POST(self): + content_length = int(self.headers['Content-Length']) + post_data = self.rfile.read(content_length) + + try: + event = json.loads(post_data.decode('utf-8')) + # 处理 Gerrit 事件 + if event.get('type') == 'patchset-created': + project = event.get('change', {}).get('project') + branch = event.get('change', {}).get('branch') + + # 执行构建脚本 + script_path = f'/opt/ci-scripts/build.sh' + if os.path.exists(script_path): + subprocess.Popen(['bash', script_path, project, branch]) + + self.send_response(200) + self.end_headers() + except Exception as e: + print(f"Error: {e}") + self.send_response(500) + self.end_headers() + +if __name__ == '__main__': + server = HTTPServer(('0.0.0.0', 9000), WebhookHandler) + print("Webhook receiver started on port 9000") + server.serve_forever() +EOF + +chmod +x webhook_receiver.py +``` + +#### 2. 创建构建脚本 + +```bash +cat > /opt/ci-scripts/build.sh << 'EOF' +#!/bin/bash +PROJECT=$1 +BRANCH=$2 + +echo "构建项目: $PROJECT, 分支: $BRANCH" + +# 克隆或更新代码 +cd /tmp +if [ -d "$PROJECT" ]; then + cd $PROJECT + git pull +else + git clone ssh://admin@101.43.95.130:29418/$PROJECT + cd $PROJECT +fi + +# 执行构建 +# 根据项目类型执行不同的构建命令 +if [ -f "pom.xml" ]; then + mvn clean package +elif [ -f "package.json" ]; then + npm install && npm run build +fi + +echo "构建完成" +EOF + +chmod +x /opt/ci-scripts/build.sh +``` + +#### 3. 启动 Webhook 服务 + +```bash +# 使用 systemd 管理 +sudo tee /etc/systemd/system/webhook-ci.service > /dev/null << EOSERVICE +[Unit] +Description=CI Webhook Receiver +After=network.target + +[Service] +Type=simple +User=renjianbo +WorkingDirectory=/opt/ci-scripts +ExecStart=/usr/bin/python3 /opt/ci-scripts/webhook_receiver.py +Restart=always + +[Install] +WantedBy=multi-user.target +EOSERVICE + +sudo systemctl daemon-reload +sudo systemctl start webhook-ci +sudo systemctl enable webhook-ci +``` + +#### 4. 配置 Gerrit Webhook + +在 Gerrit 项目设置中添加 Webhook: +- URL: `http://101.43.95.130:9000` +- 事件: `patchset-created`, `change-merged` + +--- + +## 推荐方案选择 + +### 🎯 个人小团队推荐(首选) + +**推荐:方案四 - Webhook + 自定义脚本** +- ✅ **最轻量**:资源占用最小,几乎零开销 +- ✅ **最简单**:无需安装复杂服务,直接运行脚本 +- ✅ **完全可控**:所有逻辑自己掌控,易于调试 +- ✅ **快速部署**:5分钟即可完成部署 +- ⚠️ **适合场景**:个人开发者、小团队、简单构建需求 + +**备选:方案二 - Drone CI** +- ✅ **现代化**:轻量级 CI/CD 工具 +- ✅ **Docker 原生**:适合容器化项目 +- ✅ **配置简单**:YAML 格式配置 +- ⚠️ **需要 Docker**:服务器需要安装 Docker + +### 场景 1:企业级、复杂流水线 +**推荐:Jenkins** +- 需要多环境部署 +- 需要复杂的构建流程 +- 需要详细的构建报告和通知 + +### 场景 2:中小型项目、容器化 +**推荐:Drone CI** +- 项目规模中等 +- 使用 Docker 容器 +- 需要快速部署 + +### 场景 3:简单自动化 +**推荐:Webhook + 脚本** +- 只需要简单的构建和部署 +- 资源有限 +- 完全自定义需求 + +--- + +## 端口规划 + +| 服务 | 端口 | 说明 | +|------|------|------| +| Gerrit | 8080 | 已部署 | +| Jenkins | 8081 | 避免与 Gerrit 冲突 | +| Drone CI | 3000 | Web 界面 | +| Webhook Receiver | 9000 | 自定义脚本 | + +--- + +## 下一步 + +1. 选择适合的方案 +2. 运行对应的安装脚本 +3. 配置 Gerrit 集成 +4. 创建第一个流水线任务 + +如需帮助,请参考各方案的详细安装脚本。 + diff --git a/Gerrit升级指南.md b/Gerrit升级指南.md new file mode 100644 index 0000000..49ad091 --- /dev/null +++ b/Gerrit升级指南.md @@ -0,0 +1,245 @@ +# Gerrit 升级指南 + +## 概述 + +本指南说明如何将 Gerrit 升级到最新版本(3.13.1),并使用 JDK 17 运行。 + +## 当前状态 + +- ✅ JDK 17 已安装: `/usr/local/java/jdk-17.0.12+7` +- ✅ 当前 Gerrit 版本: 3.3.8 或 3.9.0 +- 🎯 目标版本: 3.13.1(支持 JDK 17) + +## 升级步骤 + +### 方法一:使用升级脚本(推荐) + +```bash +cd /home/renjianbo/gerrit +./upgrade_gerrit.sh +``` + +升级脚本会自动: +1. ✅ 验证 JDK 17 安装 +2. ✅ 停止现有 Gerrit 服务 +3. ✅ 备份所有数据(Git 仓库、数据库、配置、插件) +4. ✅ 下载 Gerrit 3.13.1 +5. ✅ 升级 Gerrit(保留现有数据) +6. ✅ 配置 Gerrit 使用 JDK 17 +7. ✅ 启动服务 + +### 方法二:手动升级 + +#### 1. 停止 Gerrit 服务 + +```bash +cd /home/renjianbo/gerrit_install/review_site +bin/gerrit.sh stop +``` + +#### 2. 备份数据 + +```bash +cd /home/renjianbo/gerrit_install +BACKUP_DIR="backup_$(date +%Y%m%d_%H%M%S)" +mkdir -p $BACKUP_DIR + +# 备份 Git 仓库 +cp -r review_site/git $BACKUP_DIR/ 2>/dev/null || true + +# 备份数据库 +cp -r review_site/db $BACKUP_DIR/ 2>/dev/null || true + +# 备份配置 +cp -r review_site/etc $BACKUP_DIR/ 2>/dev/null || true + +# 备份插件 +cp -r review_site/plugins $BACKUP_DIR/ 2>/dev/null || true +``` + +#### 3. 下载新版本 + +```bash +cd /home/renjianbo/gerrit_install +wget https://gerrit-releases.storage.googleapis.com/gerrit-3.13.1.war +``` + +#### 4. 设置 JDK 17 + +```bash +export JAVA_HOME=/usr/local/java/jdk-17.0.12+7 +export PATH=$JAVA_HOME/bin:$PATH + +# 验证 +java -version +``` + +#### 5. 升级 Gerrit + +```bash +cd /home/renjianbo/gerrit_install +java -jar gerrit-3.13.1.war init \ + -d review_site \ + --batch \ + --no-auto-start \ + --install-plugin=download-commands \ + --install-plugin=replication \ + --install-plugin=reviewnotes +``` + +#### 6. 配置使用 JDK 17 启动 + +编辑 `review_site/bin/gerrit.sh`,在文件开头添加: + +```bash +export JAVA_HOME=/usr/local/java/jdk-17.0.12+7 +export PATH=$JAVA_HOME/bin:$PATH +``` + +#### 7. 启动服务 + +```bash +cd /home/renjianbo/gerrit_install/review_site +bin/gerrit.sh start +``` + +#### 8. 验证升级 + +```bash +# 检查服务状态 +bin/gerrit.sh status + +# 查看日志 +tail -f logs/error_log + +# 访问 Web 界面 +# http://101.43.95.130:8080 +``` + +## 版本兼容性 + +| Gerrit 版本 | 最低 JDK 要求 | 推荐 JDK | +|------------|--------------|---------| +| 3.3.x | JDK 11 | JDK 11 | +| 3.9.x | JDK 17 | JDK 17 | +| 3.13.x | JDK 17 | JDK 17 | + +## 升级后验证 + +### 1. 检查版本 + +访问 Gerrit Web 界面,在页面底部查看版本号,应该显示 `3.13.1`。 + +### 2. 检查 Java 版本 + +```bash +cd /home/renjianbo/gerrit_install/review_site +ps aux | grep gerrit | grep java +``` + +应该看到进程使用 JDK 17。 + +### 3. 测试功能 + +- ✅ 登录 Web 界面 +- ✅ 查看项目列表 +- ✅ 创建/查看变更 +- ✅ SSH 连接测试 + +## 回滚(如果需要) + +如果升级后出现问题,可以回滚到之前的版本: + +```bash +# 1. 停止服务 +cd /home/renjianbo/gerrit_install/review_site +bin/gerrit.sh stop + +# 2. 恢复备份 +cd /home/renjianbo/gerrit_install +BACKUP_DIR="backup_YYYYMMDD_HHMMSS" # 替换为实际的备份目录名 + +# 恢复 Git 仓库 +rm -rf review_site/git +cp -r $BACKUP_DIR/git review_site/ + +# 恢复数据库 +rm -rf review_site/db +cp -r $BACKUP_DIR/db review_site/ + +# 恢复配置 +rm -rf review_site/etc +cp -r $BACKUP_DIR/etc review_site/ + +# 恢复插件 +rm -rf review_site/plugins +cp -r $BACKUP_DIR/plugins review_site/ 2>/dev/null || true + +# 3. 使用旧版本 war 文件重新初始化 +# (使用之前下载的 gerrit-3.3.8.war 或 gerrit-3.9.0.war) + +# 4. 启动服务 +cd review_site +bin/gerrit.sh start +``` + +## 常见问题 + +### Q: 升级后服务无法启动? + +**A:** 检查日志文件: +```bash +tail -f /home/renjianbo/gerrit_install/review_site/logs/error_log +``` + +常见原因: +- JDK 版本不匹配 +- 端口被占用 +- 配置文件错误 + +### Q: 升级后数据丢失? + +**A:** 检查备份目录: +```bash +ls -la /home/renjianbo/gerrit_install/backup_* +``` + +可以从备份目录恢复数据。 + +### Q: 如何确认使用的是 JDK 17? + +**A:** 运行以下命令: +```bash +cd /home/renjianbo/gerrit_install/review_site +ps aux | grep gerrit | grep -o '/[^ ]*java[^ ]*' | head -1 | xargs -I {} {} -version +``` + +### Q: 升级需要多长时间? + +**A:** 通常需要 2-5 分钟,取决于: +- 网络速度(下载新版本) +- 数据量大小(备份和升级) +- 服务器性能 + +## 注意事项 + +1. ⚠️ **备份重要**:升级前务必备份所有数据 +2. ⚠️ **停机时间**:升级过程中服务会停止,建议在维护窗口进行 +3. ⚠️ **测试环境**:建议先在测试环境验证升级流程 +4. ⚠️ **插件兼容性**:某些插件可能需要更新以支持新版本 +5. ⚠️ **配置检查**:升级后检查配置文件,确保所有设置正确 + +## 相关文件 + +- 升级脚本: `/home/renjianbo/gerrit/upgrade_gerrit.sh` +- 安装脚本: `/home/renjianbo/gerrit/install_gerrit.sh` +- 重新安装脚本: `/home/renjianbo/gerrit/reinstall_gerrit.sh` +- Gerrit 目录: `/home/renjianbo/gerrit_install/` + +## 技术支持 + +如果遇到问题,可以: +1. 查看日志文件 +2. 检查备份数据 +3. 参考 Gerrit 官方文档: https://www.gerritcodereview.com/ + diff --git a/Gerrit安装使用指南.md b/Gerrit安装使用指南.md new file mode 100644 index 0000000..fe48665 --- /dev/null +++ b/Gerrit安装使用指南.md @@ -0,0 +1,855 @@ +# Gerrit 个人使用完整安装与使用指南 + +## 📋 目录 +- [环境准备](#环境准备) +- [手动安装步骤](#手动安装步骤) +- [一键自动化安装脚本](#一键自动化安装脚本) +- [使用指南](#使用指南) +- [常用技巧](#常用技巧) + +--- + +## 环境准备 + +### 适合的系统 +- **Ubuntu** 18.04+ / 20.04 / 22.04 +- **Debian** 10+ / 11+ +- **CentOS** 7+ / Rocky Linux 8+ + +### 云主机建议配置 +- **CPU**: 1-2核 +- **内存**: 2GB +- **磁盘**: 20GB+ (根据项目数量调整) +- **网络**: 公网IP(如需远程访问) + +### 必备软件 +- **Git**: 版本控制工具 +- **JDK**: Java 11 或 Java 17(推荐 Java 17) +- **wget**: 下载工具 + +--- + +## 手动安装步骤 + +### 步骤 1: 系统更新 + +```bash +# Ubuntu/Debian 系统 +sudo apt update && sudo apt upgrade -y + +# CentOS/Rocky Linux 系统 +sudo yum update -y +# 或者 (CentOS 8+) +sudo dnf update -y +``` + +### 步骤 2: 安装依赖软件 + +#### Ubuntu/Debian 系统 + +```bash +# 安装 Git 和 wget +sudo apt install -y git wget + +# 安装 OpenJDK 17 +sudo apt install -y openjdk-17-jdk + +# 验证安装 +java -version +git --version +``` + +#### CentOS/Rocky Linux 系统 + +```bash +# 安装 Git 和 wget +sudo yum install -y git wget +# 或者 (CentOS 8+) +sudo dnf install -y git wget + +# 安装 OpenJDK 17 +sudo yum install -y java-17-openjdk java-17-openjdk-devel +# 或者 (CentOS 8+) +sudo dnf install -y java-17-openjdk java-17-openjdk-devel + +# 验证安装 +java -version +git --version +``` + +### 步骤 3: 创建工作目录 + +```bash +# 创建 Gerrit 工作目录 +sudo mkdir -p /opt/gerrit +sudo chown $USER:$USER /opt/gerrit +cd /opt/gerrit +``` + +### 步骤 4: 下载 Gerrit.war 文件 + +```bash +# 下载最新稳定版本(以 3.9.0 为例,可根据需要修改版本号) +GERRIT_VERSION=3.9.0 +wget https://gerrit-releases.storage.googleapis.com/gerrit-${GERRIT_VERSION}.war + +# 或者下载特定版本 +# wget https://gerrit-releases.storage.googleapis.com/gerrit-3.8.0.war +``` + +### 步骤 5: 初始化 Gerrit(使用内置 H2 数据库) + +```bash +# 初始化 Gerrit,使用 H2 数据库(适合个人使用) +java -jar gerrit-${GERRIT_VERSION}.war init -d review_site + +# 初始化过程中会提示以下配置,建议选择: +# - 数据库类型: [2] H2 (默认,适合个人使用) +# - 认证方式: [1] DEVELOPMENT_BECOME_ANY_ACCOUNT (开发模式,方便测试) +# 或者 [2] HTTP (生产环境推荐) +# - Git 仓库位置: 直接回车使用默认值 +# - 索引类型: [1] LUCENE (默认) +# - 监听地址: 直接回车使用默认 (0.0.0.0) +# - 监听端口: 直接回车使用默认 (29418) 或输入自定义端口 +# - 是否作为守护进程运行: [Y] 是 +# - 是否安装 Bouncy Castle: [Y] 是 +``` + +**注意**: 如果希望非交互式初始化,可以使用以下命令: + +```bash +java -jar gerrit-${GERRIT_VERSION}.war init \ + -d review_site \ + --batch \ + --no-auto-start \ + --install-plugin=download-commands \ + --install-plugin=replication \ + --install-plugin=reviewnotes +``` + +### 步骤 6: 启动 Gerrit 服务 + +```bash +# 进入 Gerrit 站点目录 +cd /opt/gerrit/review_site + +# 启动 Gerrit +bin/gerrit.sh start + +# 查看状态 +bin/gerrit.sh status + +# 查看日志 +tail -f logs/gerrit.log +``` + +### 步骤 7: 访问 Gerrit +101.43.95.130 +http://101.43.95.130:8080 +打开浏览器访问: +- **Web 界面**: `http://你的服务器IP:8080` 或 `http://localhost:8080` +- **SSH 端口**: `29418` (默认) + +--- + +## 一键自动化安装脚本 + +以下脚本会自动判断系统类型、安装依赖、下载 Gerrit、初始化并启动服务。 + +### 创建安装脚本 + +```bash +cat > install_gerrit.sh << 'EOF' +#!/bin/bash + +# Gerrit 一键安装脚本 +# 支持 Ubuntu/Debian 和 CentOS/Rocky Linux + +set -e + +# 颜色输出 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# 配置变量 +GERRIT_VERSION="${GERRIT_VERSION:-3.9.0}" +GERRIT_HOME="/opt/gerrit" +GERRIT_USER="${USER}" +GERRIT_PORT="${GERRIT_PORT:-8080}" +GERRIT_SSH_PORT="${GERRIT_SSH_PORT:-29418}" + +echo -e "${GREEN}========================================${NC}" +echo -e "${GREEN}Gerrit 自动化安装脚本${NC}" +echo -e "${GREEN}版本: ${GERRIT_VERSION}${NC}" +echo -e "${GREEN}========================================${NC}" + +# 检测系统类型 +detect_os() { + if [ -f /etc/os-release ]; then + . /etc/os-release + OS=$ID + OS_VERSION=$VERSION_ID + elif [ -f /etc/redhat-release ]; then + OS="rhel" + OS_VERSION=$(cat /etc/redhat-release | sed 's/.*release \([0-9]\+\).*/\1/') + else + echo -e "${RED}无法检测操作系统类型${NC}" + exit 1 + fi + echo -e "${YELLOW}检测到系统: ${OS} ${OS_VERSION}${NC}" +} + +# 安装依赖 +install_dependencies() { + echo -e "${GREEN}开始安装依赖...${NC}" + + if [[ "$OS" == "ubuntu" ]] || [[ "$OS" == "debian" ]]; then + sudo apt update + sudo apt install -y git wget openjdk-17-jdk + elif [[ "$OS" == "centos" ]] || [[ "$OS" == "rhel" ]] || [[ "$OS" == "rocky" ]]; then + if command -v dnf &> /dev/null; then + sudo dnf install -y git wget java-17-openjdk java-17-openjdk-devel + else + sudo yum install -y git wget java-17-openjdk java-17-openjdk-devel + fi + else + echo -e "${RED}不支持的操作系统: ${OS}${NC}" + exit 1 + fi + + # 验证 Java 安装 + if ! java -version 2>&1 | grep -q "version"; then + echo -e "${RED}Java 安装失败${NC}" + exit 1 + fi + + echo -e "${GREEN}依赖安装完成${NC}" +} + +# 创建工作目录 +create_directories() { + echo -e "${GREEN}创建工作目录...${NC}" + sudo mkdir -p ${GERRIT_HOME} + sudo chown ${GERRIT_USER}:${GERRIT_USER} ${GERRIT_HOME} + cd ${GERRIT_HOME} +} + +# 下载 Gerrit +download_gerrit() { + echo -e "${GREEN}下载 Gerrit ${GERRIT_VERSION}...${NC}" + cd ${GERRIT_HOME} + + if [ ! -f "gerrit-${GERRIT_VERSION}.war" ]; then + wget https://gerrit-releases.storage.googleapis.com/gerrit-${GERRIT_VERSION}.war + else + echo -e "${YELLOW}Gerrit war 文件已存在,跳过下载${NC}" + fi +} + +# 初始化 Gerrit +init_gerrit() { + echo -e "${GREEN}初始化 Gerrit...${NC}" + cd ${GERRIT_HOME} + + if [ -d "review_site" ]; then + echo -e "${YELLOW}Gerrit 已初始化,跳过初始化步骤${NC}" + return + fi + + # 非交互式初始化 + java -jar gerrit-${GERRIT_VERSION}.war init \ + -d review_site \ + --batch \ + --no-auto-start \ + -D gerrit.canonicalWebUrl=http://$(hostname -I | awk '{print $1}'):${GERRIT_PORT}/ \ + --install-plugin=download-commands \ + --install-plugin=replication \ + --install-plugin=reviewnotes || true + + # 配置认证方式为开发模式(方便个人使用) + cat > review_site/etc/gerrit.config << EOCONFIG +[gerrit] + basePath = git + canonicalWebUrl = http://$(hostname -I | awk '{print $1}'):${GERRIT_PORT}/ + serverId = $(uuidgen 2>/dev/null || echo $(date +%s)) +[database] + type = h2 + database = db/ReviewDB +[auth] + type = DEVELOPMENT_BECOME_ANY_ACCOUNT +[sshd] + listenAddress = *:${GERRIT_SSH_PORT} +[httpd] + listenUrl = http://*:${GERRIT_PORT}/ +[cache] + directory = cache +[index] + type = LUCENE +[receive] + enableSignedPush = false +EOCONFIG + + echo -e "${GREEN}Gerrit 初始化完成${NC}" +} + +# 启动 Gerrit +start_gerrit() { + echo -e "${GREEN}启动 Gerrit 服务...${NC}" + cd ${GERRIT_HOME}/review_site + + # 启动服务 + bin/gerrit.sh start + + # 等待服务启动 + sleep 5 + + # 检查状态 + if bin/gerrit.sh status | grep -q "Running"; then + echo -e "${GREEN}Gerrit 服务启动成功!${NC}" + else + echo -e "${RED}Gerrit 服务启动失败,请检查日志${NC}" + echo -e "${YELLOW}查看日志: tail -f ${GERRIT_HOME}/review_site/logs/gerrit.log${NC}" + exit 1 + fi +} + +# 创建 systemd 服务(可选) +create_systemd_service() { + echo -e "${GREEN}创建 systemd 服务...${NC}" + + sudo tee /etc/systemd/system/gerrit.service > /dev/null << EOSERVICE +[Unit] +Description=Gerrit Code Review +After=network.target + +[Service] +Type=forking +User=${GERRIT_USER} +Group=${GERRIT_USER} +ExecStart=${GERRIT_HOME}/review_site/bin/gerrit.sh start +ExecStop=${GERRIT_HOME}/review_site/bin/gerrit.sh stop +ExecReload=${GERRIT_HOME}/review_site/bin/gerrit.sh restart +Restart=on-failure +RestartSec=10 + +[Install] +WantedBy=multi-user.target +EOSERVICE + + sudo systemctl daemon-reload + sudo systemctl enable gerrit + + echo -e "${GREEN}systemd 服务创建完成${NC}" + echo -e "${YELLOW}使用以下命令管理服务:${NC}" + echo -e " 启动: sudo systemctl start gerrit" + echo -e " 停止: sudo systemctl stop gerrit" + echo -e " 重启: sudo systemctl restart gerrit" + echo -e " 状态: sudo systemctl status gerrit" +} + +# 输出访问信息 +print_info() { + SERVER_IP=$(hostname -I | awk '{print $1}') + + echo -e "${GREEN}========================================${NC}" + echo -e "${GREEN}安装完成!${NC}" + echo -e "${GREEN}========================================${NC}" + echo -e "${YELLOW}访问地址:${NC}" + echo -e " Web 界面: http://${SERVER_IP}:${GERRIT_PORT}" + echo -e " SSH 端口: ${GERRIT_SSH_PORT}" + echo -e "" + echo -e "${YELLOW}常用命令:${NC}" + echo -e " 启动服务: ${GERRIT_HOME}/review_site/bin/gerrit.sh start" + echo -e " 停止服务: ${GERRIT_HOME}/review_site/bin/gerrit.sh stop" + echo -e " 重启服务: ${GERRIT_HOME}/review_site/bin/gerrit.sh restart" + echo -e " 查看状态: ${GERRIT_HOME}/review_site/bin/gerrit.sh status" + echo -e " 查看日志: tail -f ${GERRIT_HOME}/review_site/logs/gerrit.log" + echo -e "" + echo -e "${YELLOW}配置文件位置:${NC}" + echo -e " ${GERRIT_HOME}/review_site/etc/gerrit.config" + echo -e "" + echo -e "${YELLOW}首次访问:${NC}" + echo -e " 1. 打开浏览器访问 http://${SERVER_IP}:${GERRIT_PORT}" + echo -e " 2. 使用任意用户名登录(开发模式)" + echo -e " 3. 第一个登录的用户将自动成为管理员" + echo -e "${GREEN}========================================${NC}" +} + +# 主函数 +main() { + detect_os + install_dependencies + create_directories + download_gerrit + init_gerrit + start_gerrit + + # 询问是否创建 systemd 服务 + read -p "是否创建 systemd 服务以便开机自启? (y/n): " -n 1 -r + echo + if [[ $REPLY =~ ^[Yy]$ ]]; then + create_systemd_service + fi + + print_info +} + +# 执行主函数 +main +EOF + +chmod +x install_gerrit.sh +``` + +### 运行安装脚本 + +```bash +# 直接运行(使用默认配置) +./install_gerrit.sh + +# 或者指定版本和端口 +GERRIT_VERSION=3.8.0 GERRIT_PORT=8080 ./install_gerrit.sh +``` + +--- + +## 使用指南 + +### 1. 首页访问与管理员账户创建 + +#### 访问 Gerrit + +1. 打开浏览器,访问 `http://你的服务器IP:8080` +2. 首次访问会看到 Gerrit 欢迎页面 + +#### 创建管理员账户 + +**方式一:开发模式(推荐个人使用)** + +如果使用 `DEVELOPMENT_BECOME_ANY_ACCOUNT` 认证方式: + +1. 点击右上角 "Sign In" +2. 输入任意用户名(例如:`admin`) +3. 点击 "Sign In" +4. **第一个登录的用户自动成为管理员** + +**方式二:HTTP 认证** + +1. 首次访问会提示创建账户 +2. 输入用户名和邮箱 +3. 设置密码 +4. 第一个账户自动成为管理员 + +#### 验证管理员权限 + +登录后,点击右上角用户名 → "Settings" → 左侧菜单应显示 "Administration" 选项。 + +### 2. 创建项目仓库 + +#### 在 Web 界面创建项目 + +1. 登录 Gerrit +2. 点击顶部菜单 "Projects" → "Create Project" +3. 填写项目信息: + - **Project Name**: `my-project`(例如) + - **Parent**: `All-Projects`(默认) + - **Description**: 项目描述(可选) + - **Submit Type**: `Merge If Necessary`(推荐) + - **Create initial empty commit**: 勾选(推荐) +4. 点击 "Create Project" + +#### 通过命令行创建项目 + +```bash +# 使用 SSH 连接 Gerrit +ssh -p 29418 admin@你的服务器IP gerrit create-project my-project + +# 或者使用 HTTP API(需要配置) +curl -X PUT \ + --user admin:密码 \ + http://你的服务器IP:8080/a/projects/my-project +``` + +### 3. 在本地 Git 配置与克隆仓库 + +#### 配置 Git 用户信息 + +```bash +# 设置全局用户信息 +git config --global user.name "Your Name" +git config --global user.email "your.email@example.com" + +# 配置 Gerrit 服务器 +git config --global review.你的服务器IP:29418.username admin +``` + +#### 克隆仓库 + +```bash +# 方式一:通过 SSH(推荐) +git clone ssh://admin@你的服务器IP:29418/my-project + +# 方式二:通过 HTTP +git clone http://你的服务器IP:8080/my-project +``` + +#### 配置 Git 远程仓库 + +如果已经有一个本地 Git 仓库,可以添加 Gerrit 作为远程仓库: + +```bash +cd your-existing-repo +git remote add gerrit ssh://admin@你的服务器IP:29418/my-project +# 或者 +git remote add gerrit http://你的服务器IP:8080/my-project +``` + +### 4. 开发提交流程 + +#### 标准提交流程(代码评审) + +```bash +# 1. 进入项目目录 +cd my-project + +# 2. 创建或切换到开发分支 +git checkout -b feature/new-feature + +# 3. 进行代码修改 +echo "# My Project" > README.md +git add README.md + +# 4. 提交更改 +git commit -m "Add README file" + +# 5. 推送到 Gerrit 进行评审 +# 关键:推送到 refs/for/master 分支(不是直接推送到 master) +git push origin HEAD:refs/for/master + +# 如果配置了 review 用户名,可以使用: +git push gerrit HEAD:refs/for/master +``` + +**重要说明**: +- `refs/for/master` 表示推送到 `master` 分支的评审队列 +- 推送后会生成一个 Change(变更),需要经过评审才能合并 +- 推送成功后,Gerrit 会返回 Change 的 URL + +#### 推送示例输出 + +``` +remote: Resolving deltas: 100% (1/1) +remote: Processing changes: refs: 1, new: 1 +remote: +remote: SUCCESS +remote: +remote: http://你的服务器IP:8080/c/my-project/+/1 [NEW] +remote: +To ssh://你的服务器IP:29418/my-project + * [new branch] HEAD -> refs/for/master +``` + +### 5. 在网页界面进行代码评审并合并 + +#### 查看变更 + +1. 推送成功后,复制 Gerrit 返回的 URL +2. 在浏览器中打开该 URL,或登录 Gerrit 后点击 "Changes" 查看 + +#### 代码评审流程 + +1. **查看变更详情** + - 点击 Change 进入详情页 + - 查看文件差异(Diff) + - 查看提交信息 + +2. **添加评论** + - 在代码行上点击,添加行内评论 + - 在页面底部添加整体评论 + +3. **评审投票** + - **Code-Review**: + - `+2` = 批准合并 + - `+1` = 看起来不错,但需要其他人批准 + - `-1` = 需要修改 + - `-2` = 拒绝 + - **Verified**: + - `+1` = 验证通过 + - `-1` = 验证失败 + +4. **提交者修改代码**(如果需要) + +```bash +# 修改代码后,追加提交(会自动关联到同一个 Change) +git add . +git commit --amend # 修改最后一次提交 +git push origin HEAD:refs/for/master +``` + +5. **合并变更** + +当满足以下条件时,变更可以自动合并: +- Code-Review: +2 +- Verified: +1(如果启用了 Verified 标签) + +或者管理员可以手动点击 "Submit" 按钮合并。 + +#### 合并后的操作 + +```bash +# 更新本地仓库 +cd my-project +git checkout master +git pull origin master + +# 删除已合并的特性分支 +git branch -d feature/new-feature +``` + +### 6. 常用技巧 + +#### 跳过评审直接推送(个人使用) + +如果只是个人使用,可以配置直接推送: + +```bash +# 方法一:推送到 refs/heads/master(绕过评审) +git push origin HEAD:refs/heads/master + +# 方法二:配置项目权限,允许直接推送 +# 在 Gerrit Web 界面: +# Projects → my-project → Access → Edit +# 添加权限: +# Reference: refs/heads/* +# Push: 允许你的用户组 +``` + +#### 修改端口 + +编辑配置文件: + +```bash +sudo nano /opt/gerrit/review_site/etc/gerrit.config +``` + +修改以下部分: + +```ini +[httpd] + listenUrl = http://*:9090/ # 修改为 9090 端口 + +[sshd] + listenAddress = *:29419 # 修改 SSH 端口为 29419 +``` + +重启服务: + +```bash +/opt/gerrit/review_site/bin/gerrit.sh restart +``` + +#### 备份数据 + +```bash +# 1. 停止 Gerrit 服务 +/opt/gerrit/review_site/bin/gerrit.sh stop + +# 2. 备份整个站点目录 +tar -czf gerrit-backup-$(date +%Y%m%d).tar.gz /opt/gerrit/review_site + +# 3. 或者只备份重要数据 +# 备份 Git 仓库 +tar -czf gerrit-git-$(date +%Y%m%d).tar.gz /opt/gerrit/review_site/git + +# 备份数据库(H2) +cp -r /opt/gerrit/review_site/db /backup/gerrit-db-$(date +%Y%m%d) + +# 备份配置 +cp -r /opt/gerrit/review_site/etc /backup/gerrit-etc-$(date +%Y%m%d) + +# 4. 启动服务 +/opt/gerrit/review_site/bin/gerrit.sh start +``` + +#### 恢复数据 + +```bash +# 1. 停止服务 +/opt/gerrit/review_site/bin/gerrit.sh stop + +# 2. 恢复备份 +tar -xzf gerrit-backup-20240101.tar.gz -C / + +# 3. 启动服务 +/opt/gerrit/review_site/bin/gerrit.sh start +``` + +#### 查看日志 + +```bash +# 实时查看日志 +tail -f /opt/gerrit/review_site/logs/gerrit.log + +# 查看错误日志 +tail -f /opt/gerrit/review_site/logs/error_log + +# 查看 SSH 日志 +tail -f /opt/gerrit/review_site/logs/sshd_log +``` + +#### 修改管理员账户 + +```bash +# 通过 SSH 命令添加管理员 +ssh -p 29418 admin@你的服务器IP gerrit set-members --add admin Administrators + +# 查看管理员组 +ssh -p 29418 admin@你的服务器IP gerrit gsql -c "SELECT account_id, full_name FROM accounts WHERE account_id IN (SELECT account_id FROM account_group_members WHERE group_id IN (SELECT group_id FROM account_groups WHERE name='Administrators'));" +``` + +#### 配置邮件通知(可选) + +编辑配置文件: + +```bash +sudo nano /opt/gerrit/review_site/etc/gerrit.config +``` + +添加邮件配置: + +```ini +[sendemail] + smtpServer = smtp.example.com + smtpServerPort = 587 + smtpEncryption = tls + smtpUser = your-email@example.com + smtpPass = your-password + from = Gerrit Code Review +``` + +#### 性能优化 + +对于个人使用,可以调整以下配置: + +```bash +sudo nano /opt/gerrit/review_site/etc/gerrit.config +``` + +```ini +[cache] + directory = cache + +[core] + packedGitOpenFiles = 128 + packedGitLimit = 100m + packedGitWindowSize = 8k +``` + +--- + +## 常用命令速查 + +### 服务管理 + +```bash +# 启动 +/opt/gerrit/review_site/bin/gerrit.sh start + +# 停止 +/opt/gerrit/review_site/bin/gerrit.sh stop + +# 重启 +/opt/gerrit/review_site/bin/gerrit.sh restart + +# 状态 +/opt/gerrit/review_site/bin/gerrit.sh status + +# 查看日志 +tail -f /opt/gerrit/review_site/logs/gerrit.log +``` + +### Git 操作 + +```bash +# 推送代码评审 +git push origin HEAD:refs/for/master + +# 直接推送(跳过评审) +git push origin HEAD:refs/heads/master + +# 修改提交后重新推送 +git commit --amend +git push origin HEAD:refs/for/master + +# 查看远程分支 +git ls-remote origin +``` + +### Gerrit 命令行工具 + +```bash +# 创建项目 +ssh -p 29418 admin@服务器 gerrit create-project my-project + +# 查看项目列表 +ssh -p 29418 admin@服务器 gerrit ls-projects + +# 查看用户信息 +ssh -p 29418 admin@服务器 gerrit query --format=JSON --current-patch-set change:1 +``` + +--- + +## 故障排查 + +### 问题 1: 无法访问 Web 界面 + +**检查项**: +1. 服务是否运行:`/opt/gerrit/review_site/bin/gerrit.sh status` +2. 端口是否被占用:`netstat -tlnp | grep 8080` +3. 防火墙是否开放端口: + ```bash + # Ubuntu/Debian + sudo ufw allow 8080/tcp + + # CentOS + sudo firewall-cmd --permanent --add-port=8080/tcp + sudo firewall-cmd --reload + ``` +4. 查看错误日志:`tail -f /opt/gerrit/review_site/logs/gerrit.log` + +### 问题 2: SSH 连接失败 + +**检查项**: +1. SSH 服务是否运行:检查 Gerrit 日志 +2. 端口是否正确:默认 29418 +3. 用户权限:确保用户已注册 + +### 问题 3: 推送失败 + +**常见错误**: +- `Permission denied`: 检查项目权限配置 +- `Branch refs/for/master not found`: 确保推送到 `refs/for/master` 而不是 `master` +- `Authentication failed`: 检查 SSH 密钥或 HTTP 认证配置 + +--- + +## 总结 + +恭喜!你已经完成了 Gerrit 的安装和基本配置。现在你可以: + +1. ✅ 通过 Web 界面管理代码评审 +2. ✅ 使用 Git 推送代码进行评审 +3. ✅ 在网页上进行代码审查和合并 +4. ✅ 管理项目仓库和用户权限 + +**下一步建议**: +- 配置邮件通知(如果需要) +- 设置项目权限规则 +- 安装常用插件(如:download-commands, replication) +- 配置定期备份 + +祝你使用愉快!如有问题,请查看 Gerrit 官方文档:https://www.gerritcodereview.com/ + diff --git a/Gerrit快速使用指南.md b/Gerrit快速使用指南.md new file mode 100644 index 0000000..c27ff95 --- /dev/null +++ b/Gerrit快速使用指南.md @@ -0,0 +1,331 @@ +# Gerrit 快速使用指南 + +## 🎉 恭喜!Gerrit 已成功安装并运行 + +您的 Gerrit 访问地址:**http://101.43.95.130:8080** + +--- + +## 第一步:创建管理员账户 + +### 1. 登录 Gerrit + +1. 打开浏览器,访问:`http://101.43.95.130:8080` +2. 点击右上角的 **"Sign In"** 按钮 +3. 在登录页面,输入任意用户名(例如:`admin`) +4. 点击 **"Sign In"** + +**重要**:由于配置了开发模式(`DEVELOPMENT_BECOME_ANY_ACCOUNT`),您可以使用任意用户名登录,无需密码。 + +### 2. 验证管理员权限 + +登录后,点击右上角用户名 → **"Settings"** → 左侧菜单应该显示 **"Administration"** 选项,说明您已经是管理员了。 + +--- + +## 第二步:创建第一个项目 + +### 方法一:通过 Web 界面创建(推荐) + +1. 登录后,点击顶部菜单 **"Projects"** → **"Create Project"** +2. 填写项目信息: + - **Project Name**: `my-project`(例如) + - **Parent**: `All-Projects`(默认) + - **Description**: 项目描述(可选) + - **Submit Type**: `Merge If Necessary`(推荐) + - **Create initial empty commit**: ✅ 勾选(推荐) +3. 点击 **"Create Project"** + +### 方法二:通过命令行创建 + +```bash +# 使用 SSH 连接 Gerrit +ssh -p 29418 admin@101.43.95.130 gerrit create-project my-project +``` + +--- + +## 第三步:配置本地 Git + +### 1. 配置 Git 用户信息 + +```bash +# 设置全局用户信息 +git config --global user.name "Your Name" +git config --global user.email "your.email@example.com" + +# 配置 Gerrit 服务器(替换 admin 为您的用户名) +git config --global review.101.43.95.130:29418.username admin +``` + +### 2. 克隆项目 + +```bash +# 方式一:通过 SSH(推荐) +git clone ssh://admin@101.43.95.130:29418/my-project + +# 方式二:通过 HTTP +git clone http://101.43.95.130:8080/my-project +``` + +如果使用 HTTP,首次克隆时可能需要输入用户名(密码留空,开发模式不需要密码)。 + +--- + +## 第四步:开发提交流程 + +### 1. 创建开发分支并修改代码 + +```bash +# 进入项目目录 +cd my-project + +# 创建特性分支 +git checkout -b feature/new-feature + +# 进行代码修改 +echo "# My Project" > README.md +git add README.md + +# 提交更改 +git commit -m "Add README file" +``` + +### 2. 推送到 Gerrit 进行评审 + +**关键**:推送到 `refs/for/master` 分支(不是直接推送到 `master`) + +```bash +# 推送到评审队列 +git push origin HEAD:refs/for/master +``` + +**推送成功后的输出示例**: +``` +remote: Resolving deltas: 100% (1/1) +remote: Processing changes: refs: 1, new: 1 +remote: +remote: SUCCESS +remote: +remote: http://101.43.95.130:8080/c/my-project/+/1 [NEW] +remote: +To ssh://admin@101.43.95.130:29418/my-project + * [new branch] HEAD -> refs/for/master +``` + +### 3. 查看变更 + +复制 Gerrit 返回的 URL(例如:`http://101.43.95.130:8080/c/my-project/+/1`),在浏览器中打开查看变更详情。 + +--- + +## 第五步:代码评审与合并 + +### 1. 在 Web 界面进行评审 + +1. **查看变更详情** + - 点击 Change 进入详情页 + - 查看文件差异(Diff) + - 查看提交信息 + +2. **添加评论** + - 在代码行上点击,添加行内评论 + - 在页面底部添加整体评论 + +3. **评审投票** + - **Code-Review**: + - `+2` = 批准合并 + - `+1` = 看起来不错,但需要其他人批准 + - `-1` = 需要修改 + - `-2` = 拒绝 + - **Verified**: + - `+1` = 验证通过 + - `-1` = 验证失败 + +4. **合并变更** + - 当满足以下条件时,变更可以自动合并: + - Code-Review: +2 + - Verified: +1(如果启用了 Verified 标签) + - 或者管理员可以手动点击 **"Submit"** 按钮合并 + +### 2. 修改代码后重新推送 + +如果需要根据评审意见修改代码: + +```bash +# 修改代码后,追加提交(会自动关联到同一个 Change) +git add . +git commit --amend # 修改最后一次提交 +git push origin HEAD:refs/for/master +``` + +### 3. 合并后的操作 + +```bash +# 更新本地仓库 +cd my-project +git checkout master +git pull origin master + +# 删除已合并的特性分支 +git branch -d feature/new-feature +``` + +--- + +## 常用操作 + +### 跳过评审直接推送(个人使用) + +如果只是个人使用,可以配置直接推送: + +```bash +# 方法一:推送到 refs/heads/master(绕过评审) +git push origin HEAD:refs/heads/master + +# 方法二:配置项目权限,允许直接推送 +# 在 Gerrit Web 界面: +# Projects → my-project → Access → Edit +# 添加权限: +# Reference: refs/heads/* +# Push: 允许您的用户组 +``` + +### 查看所有项目 + +```bash +# 通过 SSH +ssh -p 29418 admin@101.43.95.130 gerrit ls-projects + +# 在 Web 界面 +访问:http://101.43.95.130:8080/#/admin/projects/ +``` + +### 查看变更列表 + +```bash +# 通过 SSH +ssh -p 29418 admin@101.43.95.130 gerrit query --format=JSON change:1 + +# 在 Web 界面 +访问:http://101.43.95.130:8080/#/q/status:open +``` + +--- + +## 服务管理命令 + +```bash +# 进入 Gerrit 目录 +cd ~/gerrit_install/review_site + +# 启动服务 +JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64 bin/gerrit.sh start + +# 停止服务 +bin/gerrit.sh stop + +# 重启服务 +bin/gerrit.sh restart + +# 查看状态 +bin/gerrit.sh status + +# 查看日志 +tail -f logs/gerrit.log +tail -f logs/error_log +``` + +--- + +## 常见问题 + +### 1. 无法访问 Web 界面 + +**检查项**: +- 服务是否运行:`cd ~/gerrit_install/review_site && bin/gerrit.sh status` +- 端口是否被占用:`netstat -tlnp | grep 8080` +- 防火墙是否开放端口: + ```bash + sudo firewall-cmd --permanent --add-port=8080/tcp + sudo firewall-cmd --reload + ``` + +### 2. SSH 连接失败 + +**检查项**: +- SSH 服务是否运行:检查 Gerrit 日志 +- 端口是否正确:默认 29418 +- 用户权限:确保用户已注册 + +### 3. 推送失败 + +**常见错误**: +- `Permission denied`: 检查项目权限配置 +- `Branch refs/for/master not found`: 确保推送到 `refs/for/master` 而不是 `master` +- `Authentication failed`: 检查 SSH 密钥或 HTTP 认证配置 + +### 4. 忘记管理员账户 + +在开发模式下,第一个登录的用户自动成为管理员。如果需要添加其他管理员: + +```bash +ssh -p 29418 admin@101.43.95.130 gerrit set-members --add username Administrators +``` + +--- + +## 下一步建议 + +1. ✅ **创建项目**:创建您的第一个项目仓库 +2. ✅ **配置 Git**:在本地配置 Git 用户信息 +3. ✅ **推送代码**:尝试推送代码进行评审 +4. 📧 **配置邮件通知**(可选):如果需要邮件通知功能 +5. 🔒 **设置项目权限**:根据需求配置项目访问权限 +6. 📦 **安装插件**:根据需要安装常用插件 + +--- + +## 快速参考 + +### Git 命令速查 + +```bash +# 推送代码评审 +git push origin HEAD:refs/for/master + +# 直接推送(跳过评审) +git push origin HEAD:refs/heads/master + +# 修改提交后重新推送 +git commit --amend +git push origin HEAD:refs/for/master + +# 查看远程分支 +git ls-remote origin +``` + +### Gerrit 命令行工具 + +```bash +# 创建项目 +ssh -p 29418 admin@101.43.95.130 gerrit create-project project-name + +# 查看项目列表 +ssh -p 29418 admin@101.43.95.130 gerrit ls-projects + +# 查看变更 +ssh -p 29418 admin@101.43.95.130 gerrit query --format=JSON change:1 +``` + +--- + +## 需要帮助? + +- 📖 查看完整安装指南:`Gerrit安装使用指南.md` +- 🌐 访问 Gerrit 官方文档:https://www.gerritcodereview.com/ +- 📝 查看配置文件:`~/gerrit_install/review_site/etc/gerrit.config` + +祝您使用愉快!🎉 + + diff --git a/HTTP认证问题解决方案.md b/HTTP认证问题解决方案.md new file mode 100644 index 0000000..718523f --- /dev/null +++ b/HTTP认证问题解决方案.md @@ -0,0 +1,113 @@ +# HTTP 认证问题解决方案 + +## 问题现象 + +``` +remote: Unauthorized +fatal: Authentication failed for 'http://101.43.95.130:8080/test-project/' +``` + +## 问题原因 + +在 `DEVELOPMENT_BECOME_ANY_ACCOUNT` 模式下,HTTP 认证可能需要特殊处理。 + +## 解决方案 + +### 方案一:配置 Git 凭证存储(推荐) + +在您的本地电脑上执行: + +```bash +cd /d/ttt/test-project + +# 配置 Git 凭证存储 +git config credential.helper store + +# 配置用户名 +git config credential.http://101.43.95.130:8080.username renjianbo + +# 或者全局配置 +git config --global credential.helper store +git config --global credential.http://101.43.95.130:8080.username renjianbo + +# 重新推送 +git push origin HEAD:refs/for/master +``` + +当提示输入密码时,直接按回车(留空)。 + +### 方案二:在 URL 中使用空密码 + +```bash +cd /d/ttt/test-project + +# 修改远程 URL,包含用户名和空密码 +git remote set-url origin http://renjianbo:@101.43.95.130:8080/test-project + +# 推送 +git push origin HEAD:refs/for/master +``` + +### 方案三:使用 Git Credential Manager + +如果使用 Windows Git Credential Manager: + +```bash +cd /d/ttt/test-project + +# 清除已保存的凭证 +git credential reject </dev/null || true + +# 添加凭证(格式:protocol://username:password@host:port) +echo "http://renjianbo:@101.43.95.130:8080" >> ~/.git-credentials + +# 配置 Git 使用凭证文件 +git config --global credential.helper store + +# 推送 +cd /d/ttt/test-project +git push origin HEAD:refs/for/master +``` + +## 快速修复(最简单) + +执行以下命令: + +```bash +cd /d/ttt/test-project + +# 方法 1:配置凭证存储和用户名 +git config credential.helper store +git config credential.http://101.43.95.130:8080.username renjianbo + +# 方法 2:修改 URL 包含空密码 +git remote set-url origin http://renjianbo:@101.43.95.130:8080/test-project + +# 推送 +git push origin HEAD:refs/for/master +``` + +## 如果还是不行 + +可能需要检查服务器端的 HTTP 认证配置。请告诉我具体的错误信息,我会继续排查。 + diff --git a/README_执行说明.md b/README_执行说明.md new file mode 100644 index 0000000..bf1c9eb --- /dev/null +++ b/README_执行说明.md @@ -0,0 +1,81 @@ +# Gerrit 重新安装 - 执行说明 + +## 🚀 快速执行(推荐) + +由于终端环境限制,请手动执行以下命令: + +```bash +cd /home/renjianbo/gerrit +chmod +x 一键重新安装.sh +./一键重新安装.sh +``` + +或者直接执行一行命令: + +```bash +cd /home/renjianbo/gerrit_install/review_site && bin/gerrit.sh stop 2>/dev/null; pkill -9 -f gerrit.war 2>/dev/null; cd /home/renjianbo/gerrit_install && rm -rf review_site && export JAVA_HOME=/usr/local/java/jdk-17.0.12+7 && export PATH=$JAVA_HOME/bin:$PATH && java -jar gerrit-3.9.0.war init -d review_site --batch --no-auto-start -D gerrit.canonicalWebUrl=http://101.43.95.130:8080/ --install-plugin=download-commands --install-plugin=replication --install-plugin=reviewnotes && cd review_site && cp bin/gerrit.sh bin/gerrit.sh.bak && sed -i "2i export JAVA_HOME=/usr/local/java/jdk-17.0.12+7\nexport PATH=\$JAVA_HOME/bin:\$PATH" bin/gerrit.sh && bin/gerrit.sh start && sleep 5 && echo "✅ 完成!访问 http://101.43.95.130:8080" +``` + +## 📋 已创建的脚本 + +1. **一键重新安装.sh** - 单行命令脚本(最简单) +2. **完全重新安装Gerrit.sh** - 完整脚本(带详细输出) +3. **quick_reinstall.sh** - 快速脚本 +4. **reinstall_gerrit.py** - Python 脚本 + +## ✅ 安装完成后 + +1. **清除浏览器 Cookie 和缓存**(重要!) + - 按 `Ctrl+Shift+Delete` + - 清除所有 Cookie 和缓存 + +2. **访问 Gerrit** + - 打开浏览器 + - 访问:`http://101.43.95.130:8080` + +3. **创建管理员账号** + - 点击 "Sign In" + - 输入新用户名(例如:`admin`) + - **第一个登录的用户将自动成为管理员** + +4. **验证** + - 访问 Settings 页面,应该能看到 "Administration" 选项 + - 访问 Repositories 页面,应该能看到 "CREATE NEW" 按钮 + +## 🔍 如果执行失败 + +查看错误信息,或分步执行: + +```bash +# 步骤 1: 停止服务 +cd /home/renjianbo/gerrit_install/review_site +bin/gerrit.sh stop +pkill -9 -f gerrit.war + +# 步骤 2: 删除旧安装 +cd /home/renjianbo/gerrit_install +rm -rf review_site + +# 步骤 3: 重新初始化 +export JAVA_HOME=/usr/local/java/jdk-17.0.12+7 +export PATH=$JAVA_HOME/bin:$PATH +java -jar gerrit-3.9.0.war init -d review_site --batch --no-auto-start -D gerrit.canonicalWebUrl=http://101.43.95.130:8080/ --install-plugin=download-commands --install-plugin=replication --install-plugin=reviewnotes + +# 步骤 4: 配置启动脚本 +cd review_site +cp bin/gerrit.sh bin/gerrit.sh.bak +sed -i "2i export JAVA_HOME=/usr/local/java/jdk-17.0.12+7\nexport PATH=\$JAVA_HOME/bin:\$PATH" bin/gerrit.sh + +# 步骤 5: 启动服务 +bin/gerrit.sh start +sleep 5 +bin/gerrit.sh status +``` + +## 📞 需要帮助? + +如果遇到问题,请提供: +1. 执行的命令 +2. 错误信息 +3. `bin/gerrit.sh status` 的输出 + diff --git a/SSH公钥添加说明.md b/SSH公钥添加说明.md new file mode 100644 index 0000000..a8c6960 --- /dev/null +++ b/SSH公钥添加说明.md @@ -0,0 +1,45 @@ +# SSH 公钥添加说明 + +## 您的 SSH 公钥 + +请复制以下完整内容(从 `ssh-rsa` 开始到邮箱结束): + +``` +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDfjHZN+QcoRiE6yzSTi15/6iwa7sHQ6D0hlnnGFmzBiEhix+oPhpLM18SM6qKiTSC3KEIsAtjRMndWFOO/PnSsDtLWnBDxg8HWn1YhjDCz5VaCmMEA/Com8FGQPtSliI+6F+v1OOeaviL7V0iJcvZVPuIUrruNTfsZWOHrFhBrEeNwtrxwXcB3N5Hzw1/2c3AZ//5vPUf63FU0GNnNO8K2dTIJqfe80kprJtWXHGaj2OsV1T065LL24GYe65Hfngo8jf9HL1O1+ZUfNWrgJXKnr6U4cPOwpmuxcVa85OlXpxYOxcXWU20fu/ZgxzcvFYnONfnj2pI10j5ix1M2Vf1Ken5GP0WEHJUYUQ4bILbf1jKZRWqLgh0/nyAPikpcaYboqy3R4ZZjl+dC1JCXCzkmT69AiPzrvBWjlz2ygUwr45xoq7YJqLLjtFYJXf2KTgWczpJyDtWb4gXPJV1GAgaSHOrsswa3vlIQT3aOr0hmK7rKNXEcoySm1QV4GHcalfAybKvz9O9eXWxOlAY1JSzLA6fy8ziB3n+8wyIe44Pomro79m5w4R+C0XbrJ4owEzfnAAe1AcaIgQ4ik78idug0ZFQZ4s1YNYS/oQfDS8ZP5TanAC611ouO3XG1SUn6SkkKzG8ThQDr+igXFnShUrgYXKjLxifAj4wfl/wmg2NhXQ== your_email@example.com +``` + +## 添加步骤 + +1. **打开浏览器**,访问:`http://101.43.95.130:8080/#/settings/ssh-keys` + +2. **在 "New SSH key" 输入框中**,粘贴上面的完整公钥 + +3. **点击 "Add"** 按钮保存 + +4. **公钥添加成功后**,会显示在列表中,状态为 "Valid" + +## 防火墙问题 + +SSH 连接超时通常是防火墙问题。我已经尝试在服务器端开放 29418 端口。 + +如果还是无法连接,可能需要: +- 检查云服务器的安全组规则(如果是云服务器) +- 检查服务器的 iptables 规则 +- 或者暂时使用 HTTP 方式推送代码 + +## 临时使用 HTTP 推送 + +如果 SSH 暂时无法修复,可以继续使用 HTTP: + +```bash +cd /d/ttt/test-project + +# 确保远程 URL 包含用户名 +git remote set-url origin http://renjianbo@101.43.95.130:8080/test-project + +# 推送代码 +git push origin HEAD:refs/for/master +``` + +当提示输入密码时,直接按回车(留空)即可。 + diff --git a/SSH公钥认证问题排查.md b/SSH公钥认证问题排查.md new file mode 100644 index 0000000..30d5787 --- /dev/null +++ b/SSH公钥认证问题排查.md @@ -0,0 +1,100 @@ +# SSH 公钥认证问题排查 + +## 问题现象 + +``` +renjianbo@101.43.95.130: Permission denied (publickey). +fatal: Could not read from remote repository. +``` + +## 好消息 + +✅ **SSH 连接已建立**(不再是连接超时),说明防火墙已修复! + +❌ **公钥认证失败**,需要检查公钥配置。 + +## 可能的原因 + +1. **公钥没有正确添加到 Gerrit** +2. **公钥格式问题** +3. **用户名不匹配** +4. **SSH 密钥路径问题** + +## 解决方案 + +### 步骤 1:确认公钥已添加到 Gerrit + +1. **打开浏览器**,访问:`http://101.43.95.130:8080/#/settings/ssh-keys` +2. **检查**您的公钥是否在列表中,状态为 "Valid" +3. **如果没有**,请添加您的完整公钥: + ``` + ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDfjHZN+QcoRiE6yzSTi15/6iwa7sHQ6D0hlnnGFmzBiEhix+oPhpLM18SM6qKiTSC3KEIsAtjRMndWFOO/PnSsDtLWnBDxg8HWn1YhjDCz5VaCmMEA/Com8FGQPtSliI+6F+v1OOeaviL7V0iJcvZVPuIUrruNTfsZWOHrFhBrEeNwtrxwXcB3N5Hzw1/2c3AZ//5vPUf63FU0GNnNO8K2dTIJqfe80kprJtWXHGaj2OsV1T065LL24GYe65Hfngo8jf9HL1O1+ZUfNWrgJXKnr6U4cPOwpmuxcVa85OlXpxYOxcXWU20fu/ZgxzcvFYnONfnj2pI10j5ix1M2Vf1Ken5GP0WEHJUYUQ4bILbf1jKZRWqLgh0/nyAPikpcaYboqy3R4ZZjl+dC1JCXCzkmT69AiPzrvBWjlz2ygUwr45xoq7YJqLLjtFYJXf2KTgWczpJyDtWb4gXPJV1GAgaSHOrsswa3vlIQT3aOr0hmK7rKNXEcoySm1QV4GHcalfAybKvz9O9eXWxOlAY1JSzLA6fy8ziB3n+8wyIe44Pomro79m5w4R+C0XbrJ4owEzfnAAe1AcaIgQ4ik78idug0ZFQZ4s1YNYS/oQfDS8ZP5TanAC611ouO3XG1SUn6SkkKzG8ThQDr+igXFnShUrgYXKjLxifAj4wfl/wmg2NhXQ== your_email@example.com + ``` + +### 步骤 2:检查 SSH 密钥路径 + +在您的本地电脑上执行: + +```bash +# 检查 SSH 密钥是否存在 +ls -la ~/.ssh/id_rsa* + +# 如果密钥文件不存在,重新生成 +ssh-keygen -t rsa -b 4096 -C "your_email@example.com" +``` + +### 步骤 3:使用 SSH 代理(如果密钥有密码) + +如果您的 SSH 密钥设置了密码,需要启动 SSH 代理: + +```bash +# 启动 SSH 代理 +eval $(ssh-agent -s) + +# 添加密钥 +ssh-add ~/.ssh/id_rsa +``` + +### 步骤 4:使用详细模式测试连接 + +```bash +# 使用详细模式查看具体错误 +ssh -v -p 29418 renjianbo@101.43.95.130 gerrit version +``` + +查看输出中的错误信息,特别是: +- 是否尝试使用正确的密钥文件 +- 服务器是否接受密钥 + +### 步骤 5:检查用户名 + +确保 Gerrit 中的用户名是 `renjianbo`。可以访问: +`http://101.43.95.130:8080/#/settings/profile` + +查看您的 Username。 + +### 步骤 6:尝试使用 Account ID + +如果用户名有问题,可以尝试使用 Account ID: + +```bash +# 查看您的 Account ID(在 Settings → Profile 页面) +# 假设是 1000001,使用: +ssh -p 29418 1000001@101.43.95.130 gerrit version +``` + +## 快速检查清单 + +- [ ] 公钥已添加到 Gerrit(`http://101.43.95.130:8080/#/settings/ssh-keys`) +- [ ] 公钥状态显示为 "Valid" +- [ ] SSH 密钥文件存在(`~/.ssh/id_rsa`) +- [ ] 用户名正确(`renjianbo`) +- [ ] 防火墙已开放 29418 端口(✅ 已完成) + +## 如果还是不行 + +请提供: +1. `ssh -v -p 29418 renjianbo@101.43.95.130 gerrit version` 的完整输出 +2. Gerrit SSH Keys 页面的截图 +3. 您的 Gerrit Username(Settings → Profile) + diff --git a/SSH密钥配置指南.md b/SSH密钥配置指南.md new file mode 100644 index 0000000..e2a1a60 --- /dev/null +++ b/SSH密钥配置指南.md @@ -0,0 +1,96 @@ +# SSH 密钥配置指南 + +## ✅ SSH 密钥已生成 + +您的 SSH 密钥已保存在: +- 私钥:`/c/Users/Administrator/.ssh/id_rsa` +- 公钥:`/c/Users/Administrator/.ssh/id_rsa.pub` + +## 下一步:将公钥添加到 Gerrit + +### 步骤 1:查看公钥内容 + +在 Git Bash 中执行: + +```bash +cat ~/.ssh/id_rsa.pub +``` + +或者: + +```bash +type ~/.ssh/id_rsa.pub +``` + +### 步骤 2:复制公钥 + +复制输出的完整内容(从 `ssh-rsa` 开始到邮箱结束的整行),例如: +``` +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQD... your_email@example.com +``` + +### 步骤 3:添加到 Gerrit + +1. **打开浏览器**,访问:`http://101.43.95.130:8080/#/settings/ssh-keys` +2. **粘贴公钥**到 "SSH Public Keys" 页面的输入框 +3. **点击 "Add"** 按钮保存 + +### 步骤 4:测试 SSH 连接 + +在 Git Bash 中执行: + +```bash +ssh -p 29418 renjianbo@101.43.95.130 gerrit version +``` + +如果连接成功,会显示 Gerrit 版本信息。 + +### 步骤 5:使用 SSH 推送代码 + +```bash +cd /d/ttt/test-project + +# 删除当前的 HTTP 远程仓库 +git remote remove origin + +# 添加 SSH 远程仓库 +git remote add origin ssh://renjianbo@101.43.95.130:29418/test-project + +# 查看远程仓库配置 +git remote -v + +# 推送代码 +git push origin HEAD:refs/for/master +``` + +## 如果 SSH 连接失败 + +### 检查防火墙 + +确保服务器的 29418 端口已开放。 + +### 检查 SSH 服务 + +在服务器上检查 Gerrit SSH 服务是否运行: + +```bash +cd /home/renjianbo/gerrit_install/review_site +bin/gerrit.sh status +``` + +### 查看 SSH 日志 + +```bash +cd /home/renjianbo/gerrit_install/review_site +tail -f logs/sshd_log +``` + +## 完成后的操作 + +SSH 配置完成后,您就可以: +- ✅ 使用 SSH 克隆项目 +- ✅ 使用 SSH 推送代码 +- ✅ 使用 SSH 执行 Gerrit 命令 + +SSH 方式比 HTTP 更可靠,推荐使用! + diff --git a/SSH密钥配置步骤.txt b/SSH密钥配置步骤.txt new file mode 100644 index 0000000..34f8e1f --- /dev/null +++ b/SSH密钥配置步骤.txt @@ -0,0 +1,33 @@ +# SSH 密钥配置步骤 - 快速参考 + +## 在 Git Bash 中执行: + +# 1. 生成 SSH 密钥 +ssh-keygen -t ed25519 -C "admin@example.com" +# 按回车使用默认路径,可以设置密码或留空 + +# 2. 查看公钥(复制全部内容) +cat ~/.ssh/id_ed25519.pub + +# 3. 将公钥添加到 Gerrit: +# - 访问: http://101.43.95.130:8080/#/settings/ssh-keys +# - 点击 "Add Key" +# - 粘贴公钥内容 +# - 保存 + +# 4. 删除旧的 known_hosts 条目 +ssh-keygen -R [101.43.95.130]:29418 + +# 5. 测试 SSH 连接 +ssh -p 29418 admin@101.43.95.130 +# 输入 yes 接受新密钥 +# 输入 exit 退出 + +# 6. 配置 Git 使用 SSH +cd /d/zhini/zhini_im +git remote remove gerrit +git remote add gerrit ssh://admin@101.43.95.130:29418/zhini_im + +# 7. 推送代码 +git push gerrit HEAD:refs/heads/master + diff --git a/SSH推送完整指南.md b/SSH推送完整指南.md new file mode 100644 index 0000000..2b2df31 --- /dev/null +++ b/SSH推送完整指南.md @@ -0,0 +1,110 @@ +# SSH 推送完整指南 + +## ✅ 您的 SSH 公钥 + +您的 SSH 公钥格式正确: +``` +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDfjHZN+QcoRiE6yzSTi15/6iwa7sHQ6D0hlnnGFmzBiEhix+oPhpLM18SM6qKiTSC3KEIsAtjRMndWFOO/PnSsDtLWnBDxg8HWn1YhjDCz5VaCmMEA/Com8FGQPtSliI+6F+v1OOeaviL7V0iJcvZVPuIUrruNTfsZWOHrFhBrEeNwtrxwXcB3N5Hzw1/2c3AZ//5vPUf63FU0GNnNO8K2dTIJqfe80kprJtWXHGaj2OsV1T065LL24GYe65Hfngo8jf9HL1O1+ZUfNWrgJXKnr6U4cPOwpmuxcVa85OlXpxYOxcXWU20fu/ZgxzcvFYnONfnj2pI10j5ix1M2Vf1Ken5GP0WEHJUYUQ4bILbf1jKZRWqLgh0/nyAPikpcaYboqy3R4ZZjl+dC1JCXCzkmT69AiPzrvBWjlz2ygUwr45xoq7YJqLLjtFYJXf2KTgWczpJyDtWb4gXPJV1GAgaSHOrsswa3vlIQT3aOr0hmK7rKNXEcoySm1QV4GHcalfAybKvz9O9eXWxOlAY1JSzLA6fy8ziB3n+8wyIe44Pomro79m5w4R+C0XbrJ4owEzfnAAe1AcaIgQ4ik78idug0ZFQZ4s1YNYS/oQfDS8ZP5TanAC611ouO3XG1SUn6SkkKzG8ThQDr+igXFnShUrgYXKjLxifAj4wfl/wmg2NhXQ== your_email@example.com +``` + +## 步骤 1:确保公钥已添加到 Gerrit + +1. **打开浏览器**,访问:`http://101.43.95.130:8080/#/settings/ssh-keys` +2. **检查**您的公钥是否已经在列表中 +3. **如果没有**,请添加: + - 在 "New SSH key" 输入框中粘贴上面的完整公钥 + - 点击 "Add" 保存 + +## 步骤 2:修复防火墙(服务器端) + +SSH 连接超时通常是防火墙问题。如果您有服务器管理员权限,执行: + +```bash +# 在服务器上执行 +sudo firewall-cmd --permanent --add-port=29418/tcp +sudo firewall-cmd --reload + +# 验证 +sudo firewall-cmd --list-ports | grep 29418 +``` + +**如果是云服务器**,还需要在云控制台的安全组中开放 29418 端口。 + +## 步骤 3:测试 SSH 连接 + +在您的本地电脑上执行: + +```bash +# 测试 SSH 连接 +ssh -p 29418 renjianbo@101.43.95.130 gerrit version +``` + +如果连接成功,会显示 Gerrit 版本信息。 + +## 步骤 4:使用 SSH 推送代码 + +```bash +cd /d/ttt/test-project + +# 删除当前的 HTTP 远程仓库 +git remote remove origin + +# 添加 SSH 远程仓库 +git remote add origin ssh://renjianbo@101.43.95.130:29418/test-project + +# 查看远程仓库配置(确认) +git remote -v + +# 推送代码 +git push origin HEAD:refs/for/master +``` + +## 如果 SSH 连接还是超时 + +### 检查云服务器安全组 + +如果是云服务器(如阿里云、腾讯云等),需要在云控制台配置: + +1. **登录云控制台** +2. **找到安全组配置** +3. **添加入站规则**: + - 协议:TCP + - 端口:29418 + - 源:0.0.0.0/0(或您的 IP) +4. **保存规则** + +### 临时使用 HTTP(如果 SSH 无法修复) + +如果 SSH 暂时无法修复,可以尝试 HTTP(我已经添加了 `gitBasicAuth = true`): + +```bash +cd /d/ttt/test-project + +# 清除凭证 +git credential reject <> ~/.ssh/config << 'EOF' +Host 101.43.95.130 + Port 29418 + PubkeyAcceptedKeyTypes +ssh-rsa + PubkeyAcceptedAlgorithms +ssh-rsa +EOF + +# 测试连接 +ssh -p 29418 renjianbo@101.43.95.130 gerrit version + +# 如果成功,推送代码 +cd /d/ttt/test-project +git push origin HEAD:refs/for/master +``` + +## 如果还是不行 + +如果方案一不行,尝试方案三(生成 ed25519 密钥),通常兼容性更好。 + diff --git a/SSH连接问题排查.md b/SSH连接问题排查.md new file mode 100644 index 0000000..e0f20bd --- /dev/null +++ b/SSH连接问题排查.md @@ -0,0 +1,92 @@ +# SSH 连接问题排查 + +## 问题现象 + +``` +ssh: connect to host 101.43.95.130 port 29418: Connection timed out +``` + +## 可能的原因 + +1. **防火墙阻止了 29418 端口** +2. **Gerrit SSH 服务未正常启动** +3. **网络路由问题** + +## 解决方案 + +### 步骤 1:先添加 SSH 公钥到 Gerrit + +即使 SSH 连接暂时有问题,也可以先添加公钥: + +1. **在浏览器中**,访问:`http://101.43.95.130:8080/#/settings/ssh-keys` +2. **在 "New SSH key" 输入框中**,粘贴您的公钥: + ``` + ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDfjHZN+QcoRiE6yzSTi15/6iwa7sHQ6D0hlnnGFmzBiEhix+oPhpLM18SM6qKiTSC3KEIsAtjRMndWFOO/PnSsDtLWnBDxg8HWn1YhjDCz5VaCmMEA/Com8FGQPtSliI+6F+v1OOeaviL7V0iJcvZVPuIUrruNTfsZWOHrFhBrEeNwtrxwXcB3N5Hzw1/2c3AZ//5vPUf63FU0GNnNO8K2dTIJqfe80kprJtWXHGaj2OsV1T065LL24GYe65Hfngo8jf9HL1O1+ZUfNWrgJXKnr6U4cPOwpmuxcVa85OlXpxYOxcXWU20fu/ZgxzcvFYnONfnj2pI10j5ix1M2Vf1Ken5GP0WEHJUYUQ4bILbf1jKZRWqLgh0/nyAPikpcaYboqy3R4ZZjl+dC1JCXCzkmT69AiPzrvBWjlz2ygUwr45xoq7YJqLLjtFYJXf2KTgWczpJyDtWb4gXPJV1GAgaSHOrsswa3vlIQT3aOr0hmK7rKNXEcoySm1QV4GHcalfAybKvz9O9eXWxOlAY1JSzLA6fy8ziB3n+8wyIe44Pomro79m5w4R+C0XbrJ4owEzfnAAe1AcaIgQ4ik78idug0ZFQZ4s1YNYS/oQfDS8ZP5TanAC611ouO3XG1SUn6SkkKzG8ThQDr+igXFnShUrgYXKjLxifAj4wfl/wmg2NhXQ== your_email@example.com + ``` +3. **点击 "Add"** 按钮保存 + +### 步骤 2:检查服务器端 SSH 服务 + +在服务器上检查: + +```bash +# 检查 Gerrit SSH 服务状态 +cd /home/renjianbo/gerrit_install/review_site +bin/gerrit.sh status + +# 检查端口是否监听 +netstat -tlnp | grep 29418 +# 或 +ss -tlnp | grep 29418 +``` + +### 步骤 3:检查防火墙 + +如果是云服务器,需要确保防火墙开放了 29418 端口: + +```bash +# CentOS 7 +sudo firewall-cmd --permanent --add-port=29418/tcp +sudo firewall-cmd --reload + +# 或者检查防火墙状态 +sudo firewall-cmd --list-ports +``` + +### 步骤 4:临时使用 HTTP 推送(如果 SSH 无法修复) + +如果 SSH 连接问题暂时无法解决,可以继续使用 HTTP 方式: + +```bash +cd /d/ttt/test-project + +# 确保远程 URL 包含用户名 +git remote set-url origin http://renjianbo@101.43.95.130:8080/test-project + +# 推送代码 +git push origin HEAD:refs/for/master +``` + +## 当前建议 + +1. **先添加 SSH 公钥**到 Gerrit(即使连接有问题,公钥可以先保存) +2. **检查服务器防火墙**是否开放了 29418 端口 +3. **如果 SSH 暂时无法修复**,继续使用 HTTP 方式推送代码 + +## 需要服务器端操作 + +如果您有服务器访问权限,请执行: + +```bash +# 检查防火墙 +sudo firewall-cmd --list-ports + +# 如果 29418 不在列表中,添加它 +sudo firewall-cmd --permanent --add-port=29418/tcp +sudo firewall-cmd --reload + +# 检查 Gerrit SSH 服务 +cd /home/renjianbo/gerrit_install/review_site +bin/gerrit.sh status +``` + diff --git a/SSH配置成功-继续推送.md b/SSH配置成功-继续推送.md new file mode 100644 index 0000000..efc7e46 --- /dev/null +++ b/SSH配置成功-继续推送.md @@ -0,0 +1,150 @@ +# SSH 配置成功 - 继续推送代码 + +## ✅ SSH 连接已成功 + +您已经成功连接到 Gerrit,现在可以配置 Git 并推送代码了。 + +## 下一步操作 + +### 在 Git Bash 中执行: + +```bash +# 1. 确保在项目目录 +cd /d/zhini/zhini_im + +# 2. 删除旧的远程仓库(如果存在) +git remote remove gerrit 2>/dev/null || true + +# 3. 添加 SSH 远程仓库 +git remote add gerrit ssh://admin@101.43.95.130:29418/zhini_im + +# 4. 验证远程仓库配置 +git remote -v + +# 5. 查看当前分支 +git branch + +# 6. 提交所有更改(如果有未提交的) +git add . +git commit -m "Update code before push to Gerrit" + +# 7. 推送代码到 Gerrit +# 方式 A:直接推送到主分支(首次上传) +git push gerrit master:refs/heads/master + +# 或方式 B:推送到评审队列(推荐用于后续更新) +git push gerrit master:refs/for/master +``` + +## 推送方式说明 + +### 直接推送(首次上传) + +```bash +git push gerrit master:refs/heads/master +``` +- ✅ 直接更新主分支 +- ✅ 适用于首次上传 +- ❌ 跳过代码评审流程 + +### 推送到评审队列(推荐) + +```bash +git push gerrit master:refs/for/master +``` +- ✅ 进入代码评审流程 +- ✅ 需要评审后才能合并 +- ✅ 符合 Gerrit 工作流程 +- 推荐用于:日常开发、团队协作 + +## 如果当前分支不是 master + +如果您的当前分支是 `rjb_dev` 或其他分支: + +```bash +# 查看当前分支 +git branch + +# 推送当前分支到 master +git push gerrit rjb_dev:refs/heads/master + +# 或推送到评审队列 +git push gerrit rjb_dev:refs/for/master +``` + +## 验证推送 + +推送成功后: + +1. **访问项目页面**: + ``` + http://101.43.95.130:8080/#/admin/projects/zhini_im + ``` + +2. **查看变更**: + ``` + http://101.43.95.130:8080/#/q/project:zhini_im + ``` + +3. **浏览代码**: + ``` + http://101.43.95.130:8080/#/admin/projects/zhini_im,general + ``` + +## 常见问题 + +### Q: 推送时提示 "remote rejected"? + +**A:** 可能的原因: +1. 项目不存在 → 先在 Gerrit 创建项目 +2. 没有推送权限 → 检查项目权限配置 +3. 分支保护 → 使用 `refs/for/master` 推送到评审队列 + +### Q: 如何查看远程仓库? + +```bash +git remote -v +``` + +应该显示: +``` +gerrit ssh://admin@101.43.95.130:29418/zhini_im (fetch) +gerrit ssh://admin@101.43.95.130:29418/zhini_im (push) +``` + +### Q: 如何测试 SSH 连接? + +```bash +# 测试连接并查看 Gerrit 版本 +ssh -p 29418 admin@101.43.95.130 gerrit version + +# 应该显示:gerrit version 3.9.0 +``` + +## 后续操作 + +### 日常开发流程 + +```bash +# 1. 修改代码 +# 2. 提交更改 +git add . +git commit -m "描述您的更改" + +# 3. 推送到评审队列 +git push gerrit master:refs/for/master + +# 4. 在 Gerrit Web 界面进行评审 +# 5. 评审通过后,代码会自动合并 +``` + +### 克隆项目(其他团队成员) + +```bash +# 使用 SSH +git clone ssh://admin@101.43.95.130:29418/zhini_im + +# 或使用 HTTP +git clone http://101.43.95.130:8080/zhini_im +``` + diff --git a/SSH配置详细步骤.md b/SSH配置详细步骤.md new file mode 100644 index 0000000..a563ec4 --- /dev/null +++ b/SSH配置详细步骤.md @@ -0,0 +1,159 @@ +# SSH 配置详细步骤 + +## 问题 + +SSH 签名算法不匹配,需要启用兼容的算法。 + +## 解决方案:创建 SSH 配置文件 + +### 步骤 1:检查配置文件是否存在 + +在 Git Bash 中执行: + +```bash +# 检查配置文件是否存在 +ls -la ~/.ssh/config + +# 如果文件不存在,会显示 "No such file or directory" +``` + +### 步骤 2:创建配置文件 + +```bash +# 创建配置文件 +touch ~/.ssh/config + +# 设置正确的权限(重要!) +chmod 600 ~/.ssh/config +``` + +### 步骤 3:编辑配置文件 + +使用文本编辑器打开配置文件: + +```bash +# 使用 notepad(Windows) +notepad ~/.ssh/config + +# 或使用 nano(Git Bash) +nano ~/.ssh/config + +# 或使用 vim(Git Bash) +vim ~/.ssh/config +``` + +### 步骤 4:添加配置内容 + +在文件中添加以下内容(如果文件已有内容,追加到文件末尾): + +``` +Host 101.43.95.130 + Port 29418 + PubkeyAcceptedKeyTypes +ssh-rsa + PubkeyAcceptedAlgorithms +ssh-rsa +``` + +**重要**: +- `Host` 后面是服务器 IP 或域名 +- `Port` 后面是 SSH 端口(29418) +- 每行前面有 4 个空格或 1 个 Tab(保持缩进) + +### 步骤 5:保存文件 + +- 如果使用 notepad:`Ctrl+S` 保存,然后关闭 +- 如果使用 nano:`Ctrl+O` 保存,`Enter` 确认,`Ctrl+X` 退出 +- 如果使用 vim:按 `i` 进入插入模式,编辑后按 `Esc`,然后输入 `:wq` 保存退出 + +### 步骤 6:验证配置 + +```bash +# 查看配置文件内容 +cat ~/.ssh/config +``` + +应该显示: +``` +Host 101.43.95.130 + Port 29418 + PubkeyAcceptedKeyTypes +ssh-rsa + PubkeyAcceptedAlgorithms +ssh-rsa +``` + +### 步骤 7:测试连接 + +```bash +# 测试 SSH 连接 +ssh -p 29418 renjianbo@101.43.95.130 gerrit version +``` + +如果成功,会显示 Gerrit 版本信息,例如: +``` +gerrit version 3.3.8 +``` + +### 步骤 8:推送代码 + +```bash +cd /d/ttt/test-project +git push origin HEAD:refs/for/master +``` + +## 如果还是不行 + +### 方法 A:使用命令行参数(临时) + +```bash +# 测试连接 +ssh -o PubkeyAcceptedKeyTypes=+ssh-rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa -p 29418 renjianbo@101.43.95.130 gerrit version + +# 推送代码 +GIT_SSH_COMMAND="ssh -o PubkeyAcceptedKeyTypes=+ssh-rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa" git push origin HEAD:refs/for/master +``` + +### 方法 B:检查公钥是否正确添加 + +1. 访问:`http://101.43.95.130:8080/#/settings/ssh-keys` +2. 确认您的公钥在列表中 +3. 确认公钥状态为 "Valid" + +### 方法 C:重新生成 ed25519 密钥 + +如果 RSA 密钥一直有问题,可以生成 ed25519 密钥: + +```bash +# 生成新的 ed25519 密钥 +ssh-keygen -t ed25519 -C "your_email@example.com" -f ~/.ssh/id_ed25519 + +# 查看新公钥 +cat ~/.ssh/id_ed25519.pub +``` + +然后将新公钥添加到 Gerrit。 + +## 常见问题 + +### Q: 配置文件权限错误 + +```bash +# 修复权限 +chmod 600 ~/.ssh/config +chmod 700 ~/.ssh +``` + +### Q: 配置文件格式错误 + +确保: +- 每行前面有正确的缩进(4 个空格或 1 个 Tab) +- 没有多余的空格或特殊字符 +- 文件使用 UTF-8 编码 + +### Q: 配置不生效 + +```bash +# 清除 SSH 已知主机(如果需要) +ssh-keygen -R [101.43.95.130]:29418 + +# 重新测试 +ssh -v -p 29418 renjianbo@101.43.95.130 gerrit version +``` + diff --git a/Windows上传项目命令.txt b/Windows上传项目命令.txt new file mode 100644 index 0000000..3fb5543 --- /dev/null +++ b/Windows上传项目命令.txt @@ -0,0 +1,38 @@ +# Windows 上传项目到 Gerrit - 快速命令 + +## 前提 +- 项目路径: D:\zhini\zhini_im +- Gerrit 地址: http://101.43.95.130:8080 +- 项目名称: zhini_im + +## 在 Git Bash 中执行以下命令: + +# 1. 进入项目目录 +cd /d/zhini/zhini_im + +# 2. 检查是否已有 Git 仓库 +ls -la | grep .git + +# 3. 如果没有,初始化 Git 仓库 +git init +git add . +git commit -m "Initial commit" + +# 4. 配置 Git 用户信息(如果还没配置) +git config user.name "admin" +git config user.email "admin@example.com" + +# 5. 添加 Gerrit 远程仓库 +git remote add gerrit http://101.43.95.130:8080/zhini_im + +# 6. 推送代码到 Gerrit(首次上传) +git push gerrit HEAD:refs/heads/master + +# 或者推送到评审队列(推荐用于后续更新) +git push gerrit HEAD:refs/for/master + +## 注意事项: +1. 如果提示需要用户名密码,用户名填 "admin",密码留空 +2. 如果项目已存在,可能需要先拉取:git pull gerrit master --allow-unrelated-histories +3. 推送成功后,在 Gerrit Web 界面查看项目 + diff --git a/add_changeid.sh b/add_changeid.sh new file mode 100644 index 0000000..692edeb --- /dev/null +++ b/add_changeid.sh @@ -0,0 +1,134 @@ +#!/bin/bash + +# 为所有 Git 提交添加 Change-Id 的脚本 + +echo "==========================================" +echo "为所有提交添加 Change-Id" +echo "==========================================" +echo "" + +# 检查是否在 Git 仓库中 +if [ ! -d .git ]; then + echo "❌ 错误:当前目录不是 Git 仓库" + exit 1 +fi + +# 步骤 1:安装 commit-msg hook +echo "步骤 1: 安装 commit-msg hook..." +echo "" + +GIT_DIR=$(git rev-parse --git-dir) +HOOK_PATH="$GIT_DIR/hooks/commit-msg" + +# 尝试使用 scp 下载 +echo "尝试使用 SCP 下载 hook..." +scp -p -P 29418 renjianbo@101.43.95.130:hooks/commit-msg "$HOOK_PATH" 2>/dev/null + +# 如果 scp 失败,使用 curl +if [ ! -f "$HOOK_PATH" ] || [ ! -x "$HOOK_PATH" ]; then + echo "SCP 失败,尝试使用 curl..." + mkdir -p "$GIT_DIR/hooks" + curl -o "$HOOK_PATH" http://101.43.95.130:8080/tools/hooks/commit-msg 2>/dev/null + chmod +x "$HOOK_PATH" +fi + +if [ -f "$HOOK_PATH" ] && [ -x "$HOOK_PATH" ]; then + echo "✅ commit-msg hook 安装成功" +else + echo "❌ commit-msg hook 安装失败" + echo "请手动下载:" + echo " curl -o .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg" + echo " chmod +x .git/hooks/commit-msg" + exit 1 +fi + +echo "" + +# 步骤 2:检查有多少提交缺少 Change-Id +echo "步骤 2: 检查缺少 Change-Id 的提交..." +echo "" + +MISSING_COUNT=0 +git log --format='%H' | while read commit; do + if ! git log -1 --format='%B' "$commit" | grep -q "^Change-Id:"; then + MISSING_COUNT=$((MISSING_COUNT + 1)) + fi +done + +# 由于管道,MISSING_COUNT 在子 shell 中,需要重新计算 +MISSING_COUNT=$(git log --format='%H' | while read commit; do + if ! git log -1 --format='%B' "$commit" | grep -q "^Change-Id:"; then + echo "1" + fi +done | wc -l) + +if [ "$MISSING_COUNT" -eq 0 ]; then + echo "✅ 所有提交都已包含 Change-Id" + exit 0 +fi + +echo "找到 $MISSING_COUNT 个缺少 Change-Id 的提交" +echo "" + +# 步骤 3:创建备份 +BACKUP_BRANCH="backup-$(date +%Y%m%d-%H%M%S)" +echo "步骤 3: 创建备份分支: $BACKUP_BRANCH" +git branch "$BACKUP_BRANCH" +echo "✅ 备份完成" +echo "" + +# 步骤 4:为所有提交添加 Change-Id +echo "步骤 4: 为所有提交添加 Change-Id..." +echo "这可能需要一些时间,请耐心等待..." +echo "" + +# 使用 git filter-branch 为所有提交添加 Change-Id +git filter-branch -f --msg-filter ' + # 读取原始提交信息 + cat + + # 如果提交信息中没有 Change-Id,添加一个 + if ! grep -q "^Change-Id:"; then + # 生成 Change-Id(基于提交的 SHA1) + # 使用 git hash-object 生成一个唯一的 ID + COMMIT_INFO=$(git cat-file commit HEAD) + CHANGE_ID_BASE=$(echo -n "$COMMIT_INFO" | git hash-object --stdin) + CHANGE_ID="I${CHANGE_ID_BASE:0:40}" + echo "" + echo "Change-Id: $CHANGE_ID" + fi +' --tag-name-filter cat -- --branches --tags + +if [ $? -eq 0 ]; then + echo "" + echo "✅ Change-Id 添加完成!" + echo "" + + # 验证 + echo "验证结果:" + REMAINING=$(git log --format='%H' | while read commit; do + if ! git log -1 --format='%B' "$commit" | grep -q "^Change-Id:"; then + echo "1" + fi + done | wc -l) + + if [ "$REMAINING" -eq 0 ]; then + echo "✅ 所有提交都已包含 Change-Id" + else + echo "⚠️ 仍有 $REMAINING 个提交缺少 Change-Id" + fi + + echo "" + echo "下一步:" + echo " git push gerrit HEAD:refs/for/master" + echo "" + echo "如果需要恢复,可以使用:" + echo " git reset --hard $BACKUP_BRANCH" +else + echo "" + echo "❌ 添加 Change-Id 失败" + echo "可以恢复备份:git reset --hard $BACKUP_BRANCH" + exit 1 +fi + + diff --git a/add_renjianbo_to_admin.sh b/add_renjianbo_to_admin.sh new file mode 100755 index 0000000..e8439df --- /dev/null +++ b/add_renjianbo_to_admin.sh @@ -0,0 +1,90 @@ +#!/bin/bash + +# 将 renjianbo 用户添加到 Administrators 组的脚本 +# 适用于 Gerrit 3.9.0 + +GERRIT_DIR="/home/renjianbo/gerrit_install/review_site" +JAVA_HOME="/usr/local/java/jdk-17.0.12+7" +USERNAME="renjianbo" + +echo "==========================================" +echo "将用户 $USERNAME 添加到 Administrators 组" +echo "==========================================" +echo "" + +cd "$GERRIT_DIR" || exit 1 + +export JAVA_HOME +export PATH=$JAVA_HOME/bin:$PATH + +# 查找 H2 数据库 JAR 文件 +H2_JAR=$(find . -name "h2*.jar" | head -1) + +if [ -z "$H2_JAR" ]; then + echo "❌ 未找到 H2 数据库 JAR 文件" + exit 1 +fi + +echo "使用 H2 JAR: $H2_JAR" +echo "" + +# 查找用户的 account_id +echo "查找用户账户..." +ACCOUNT_ID=$(java -cp "$H2_JAR" org.h2.tools.Shell -url "jdbc:h2:./db/ReviewDB" -user sa -password "" -sql "SELECT account_id FROM accounts WHERE user_name = '$USERNAME' OR full_name LIKE '%$USERNAME%' LIMIT 1;" 2>&1 | grep -E "^[0-9]+" | head -1) + +if [ -z "$ACCOUNT_ID" ]; then + echo "⚠️ 未找到用户 $USERNAME,尝试查找第一个账户..." + ACCOUNT_ID=$(java -cp "$H2_JAR" org.h2.tools.Shell -url "jdbc:h2:./db/ReviewDB" -user sa -password "" -sql "SELECT account_id FROM accounts ORDER BY account_id LIMIT 1;" 2>&1 | grep -E "^[0-9]+" | head -1) +fi + +if [ -z "$ACCOUNT_ID" ]; then + echo "❌ 无法找到任何账户" + exit 1 +fi + +echo "找到账户 ID: $ACCOUNT_ID" +echo "" + +# 查找 Administrators 组的 group_id +echo "查找 Administrators 组..." +GROUP_ID=$(java -cp "$H2_JAR" org.h2.tools.Shell -url "jdbc:h2:./db/ReviewDB" -user sa -password "" -sql "SELECT group_id FROM account_groups WHERE name = 'Administrators' LIMIT 1;" 2>&1 | grep -E "^[0-9]+" | head -1) + +if [ -z "$GROUP_ID" ]; then + echo "❌ 未找到 Administrators 组" + exit 1 +fi + +echo "找到 Administrators 组 ID: $GROUP_ID" +echo "" + +# 检查用户是否已经是管理员 +echo "检查用户是否已经是管理员..." +IS_ADMIN=$(java -cp "$H2_JAR" org.h2.tools.Shell -url "jdbc:h2:./db/ReviewDB" -user sa -password "" -sql "SELECT COUNT(*) FROM account_group_members WHERE account_id = $ACCOUNT_ID AND group_id = $GROUP_ID;" 2>&1 | grep -E "^[0-9]+" | head -1) + +if [ "$IS_ADMIN" = "1" ]; then + echo "✅ 用户已经是管理员,无需添加" + exit 0 +fi + +# 添加用户到管理员组 +echo "添加用户到 Administrators 组..." +java -cp "$H2_JAR" org.h2.tools.Shell -url "jdbc:h2:./db/ReviewDB" -user sa -password "" -sql "INSERT INTO account_group_members (account_id, group_id) VALUES ($ACCOUNT_ID, $GROUP_ID);" 2>&1 | grep -v "^[>|]" | grep -v "jdbc:h2" || true + +# 验证 +echo "" +echo "验证添加结果..." +NEW_IS_ADMIN=$(java -cp "$H2_JAR" org.h2.tools.Shell -url "jdbc:h2:./db/ReviewDB" -user sa -password "" -sql "SELECT COUNT(*) FROM account_group_members WHERE account_id = $ACCOUNT_ID AND group_id = $GROUP_ID;" 2>&1 | grep -E "^[0-9]+" | head -1) + +if [ "$NEW_IS_ADMIN" = "1" ]; then + echo "" + echo "✅ 成功!用户 $USERNAME (Account ID: $ACCOUNT_ID) 已添加到 Administrators 组" + echo "" + echo "下一步:" + echo "1. 退出并重新登录 Gerrit" + echo "2. 刷新浏览器页面" + echo "3. 应该能看到 'CREATE NEW' 按钮了" +else + echo "" + echo "❌ 添加失败,请检查错误信息" +fi + diff --git a/add_user_to_admin.sh b/add_user_to_admin.sh new file mode 100755 index 0000000..f0c9cb0 --- /dev/null +++ b/add_user_to_admin.sh @@ -0,0 +1,83 @@ +#!/bin/bash + +# 将用户添加到 Administrators 组的脚本 + +GERRIT_DIR="/home/renjianbo/gerrit_install/review_site" +JAVA_HOME="/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64" +USERNAME="renjianbo" + +echo "==========================================" +echo "将用户 $USERNAME 添加到 Administrators 组" +echo "==========================================" +echo "" + +cd "$GERRIT_DIR" || exit 1 + +# 方法 1: 尝试通过 SSH(如果可用) +echo "方法 1: 尝试通过 SSH 添加..." +ssh -p 29418 renjianbo@localhost gerrit set-members --add "$USERNAME" Administrators 2>/dev/null + +if [ $? -eq 0 ]; then + echo "✅ 通过 SSH 添加成功" + exit 0 +fi + +echo "SSH 方法失败,尝试其他方法..." +echo "" + +# 方法 2: 通过数据库直接添加 +echo "方法 2: 通过数据库添加..." + +# 查找用户的 account_id +ACCOUNT_ID=$(cd "$GERRIT_DIR" && JAVA_HOME="$JAVA_HOME" java -cp db/h2*.jar org.h2.tools.Shell -url jdbc:h2:./db/ReviewDB -user sa -password "" -sql "SELECT account_id FROM accounts WHERE preferred_email LIKE '%263303411%' OR full_name LIKE '%renjianbo%' LIMIT 1;" 2>/dev/null | grep -E "^[0-9]+" | head -1) + +if [ -z "$ACCOUNT_ID" ]; then + echo "⚠️ 无法找到用户账户,尝试通过用户名查找..." + # 尝试其他方式 + ACCOUNT_ID=$(cd "$GERRIT_DIR" && JAVA_HOME="$JAVA_HOME" java -cp db/h2*.jar org.h2.tools.Shell -url jdbc:h2:./db/ReviewDB -user sa -password "" -sql "SELECT account_id FROM accounts LIMIT 1;" 2>/dev/null | grep -E "^[0-9]+" | head -1) +fi + +if [ -n "$ACCOUNT_ID" ]; then + echo "找到账户 ID: $ACCOUNT_ID" + + # 查找 Administrators 组的 group_id + GROUP_ID=$(cd "$GERRIT_DIR" && JAVA_HOME="$JAVA_HOME" java -cp db/h2*.jar org.h2.tools.Shell -url jdbc:h2:./db/ReviewDB -user sa -password "" -sql "SELECT group_id FROM account_groups WHERE name = 'Administrators';" 2>/dev/null | grep -E "^[0-9]+" | head -1) + + if [ -z "$GROUP_ID" ]; then + echo "⚠️ 无法找到 Administrators 组" + echo "请通过 Web 界面手动添加:" + echo " 访问: http://101.43.95.130:8080/#/admin/groups/Administrators,members" + exit 1 + fi + + echo "找到 Administrators 组 ID: $GROUP_ID" + + # 检查用户是否已在组中 + EXISTING=$(cd "$GERRIT_DIR" && JAVA_HOME="$JAVA_HOME" java -cp db/h2*.jar org.h2.tools.Shell -url jdbc:h2:./db/ReviewDB -user sa -password "" -sql "SELECT account_id FROM account_group_members WHERE account_id = $ACCOUNT_ID AND group_id = $GROUP_ID;" 2>/dev/null | grep -E "^[0-9]+") + + if [ -n "$EXISTING" ]; then + echo "✅ 用户已在 Administrators 组中" + else + # 添加用户到组 + echo "正在添加用户到组..." + cd "$GERRIT_DIR" && JAVA_HOME="$JAVA_HOME" java -cp db/h2*.jar org.h2.tools.Shell -url jdbc:h2:./db/ReviewDB -user sa -password "" -sql "INSERT INTO account_group_members (account_id, group_id) VALUES ($ACCOUNT_ID, $GROUP_ID);" 2>/dev/null + + if [ $? -eq 0 ]; then + echo "✅ 用户已添加到 Administrators 组" + else + echo "❌ 添加失败,请通过 Web 界面手动添加" + fi + fi +else + echo "❌ 无法找到用户账户" + echo "请通过 Web 界面手动添加:" + echo " 访问: http://101.43.95.130:8080/#/admin/groups/Administrators,members" +fi + +echo "" +echo "配置完成后,请:" +echo "1. 刷新 Gerrit Web 界面" +echo "2. 重新登录" +echo "3. 检查是否可以看到 +2 选项" + + diff --git a/check_account.class b/check_account.class new file mode 100644 index 0000000..e2c994d Binary files /dev/null and b/check_account.class differ diff --git a/check_account.java b/check_account.java new file mode 100644 index 0000000..0b424a5 --- /dev/null +++ b/check_account.java @@ -0,0 +1,84 @@ +import java.sql.*; + +public class check_account { + public static void main(String[] args) { + String dbPath = "/home/renjianbo/gerrit_install/review_site/db/ReviewDB"; + + try { + Class.forName("org.h2.Driver"); + String url = "jdbc:h2:" + dbPath + ";AUTO_SERVER=TRUE"; + Connection conn = DriverManager.getConnection(url, "sa", ""); + + System.out.println("=== 检查账户信息 ===\n"); + + // 检查 accounts 表(H2 数据库表名可能是大写) + System.out.println("1. Accounts 表:"); + Statement stmt = conn.createStatement(); + // 先尝试查看所有表 + ResultSet tables = conn.getMetaData().getTables(null, null, "%", new String[]{"TABLE"}); + System.out.println(" 数据库中的表:"); + while (tables.next()) { + System.out.println(" - " + tables.getString("TABLE_NAME")); + } + System.out.println(); + + // 尝试查询账户(使用大写表名) + ResultSet rs = stmt.executeQuery("SELECT ACCOUNT_ID, FULL_NAME, PREFERRED_EMAIL, INACTIVE, REGISTERED_ON FROM ACCOUNTS ORDER BY ACCOUNT_ID"); + boolean hasAccounts = false; + while (rs.next()) { + hasAccounts = true; + System.out.println(" Account ID: " + rs.getInt("ACCOUNT_ID")); + System.out.println(" Full Name: " + rs.getString("FULL_NAME")); + System.out.println(" Email: " + rs.getString("PREFERRED_EMAIL")); + System.out.println(" Inactive: " + rs.getInt("INACTIVE")); + System.out.println(" Registered: " + rs.getTimestamp("REGISTERED_ON")); + System.out.println(); + } + if (!hasAccounts) { + System.out.println(" (无账户)"); + } + + // 检查 account_external_ids 表 + System.out.println("2. Account External IDs 表:"); + rs = stmt.executeQuery("SELECT ACCOUNT_ID, EMAIL_ADDRESS, EXTERNAL_ID FROM ACCOUNT_EXTERNAL_IDS ORDER BY ACCOUNT_ID"); + boolean hasExtIds = false; + while (rs.next()) { + hasExtIds = true; + System.out.println(" Account ID: " + rs.getInt("ACCOUNT_ID")); + System.out.println(" Email: " + rs.getString("EMAIL_ADDRESS")); + System.out.println(" External ID: " + rs.getString("EXTERNAL_ID")); + System.out.println(); + } + if (!hasExtIds) { + System.out.println(" (无外部ID)"); + } + + // 检查管理员组 + System.out.println("3. 管理员组成员:"); + rs = stmt.executeQuery( + "SELECT a.ACCOUNT_ID, a.FULL_NAME " + + "FROM ACCOUNTS a " + + "JOIN ACCOUNT_GROUP_MEMBERS agm ON a.ACCOUNT_ID = agm.ACCOUNT_ID " + + "JOIN ACCOUNT_GROUPS ag ON agm.GROUP_ID = ag.GROUP_ID " + + "WHERE ag.NAME = 'Administrators' " + + "ORDER BY a.ACCOUNT_ID" + ); + boolean hasAdmins = false; + while (rs.next()) { + hasAdmins = true; + System.out.println(" Account ID: " + rs.getInt("ACCOUNT_ID") + ", Name: " + rs.getString("FULL_NAME")); + } + if (!hasAdmins) { + System.out.println(" (无管理员)"); + } + + conn.close(); + System.out.println("\n=== 检查完成 ==="); + + } catch (Exception e) { + System.err.println("错误: " + e.getMessage()); + e.printStackTrace(); + } + } +} + diff --git a/check_admin.class b/check_admin.class new file mode 100644 index 0000000..ac98a66 Binary files /dev/null and b/check_admin.class differ diff --git a/check_admin.java b/check_admin.java new file mode 100644 index 0000000..4fc0f4c --- /dev/null +++ b/check_admin.java @@ -0,0 +1,57 @@ +import java.sql.*; + +public class check_admin { + public static void main(String[] args) { + String dbPath = "/home/renjianbo/gerrit_install/review_site/db/ReviewDB"; + + try { + Class.forName("org.h2.Driver"); + String url = "jdbc:h2:" + dbPath + ";AUTO_SERVER=TRUE"; + Connection conn = DriverManager.getConnection(url, "sa", ""); + + System.out.println("=== 检查管理员权限 ===\n"); + + // 检查管理员组 + Statement stmt = conn.createStatement(); + ResultSet rs = stmt.executeQuery( + "SELECT a.ACCOUNT_ID, a.FULL_NAME, a.USER_NAME " + + "FROM ACCOUNTS a " + + "JOIN ACCOUNT_GROUP_MEMBERS agm ON a.ACCOUNT_ID = agm.ACCOUNT_ID " + + "JOIN ACCOUNT_GROUPS ag ON agm.GROUP_ID = ag.GROUP_ID " + + "WHERE ag.NAME = 'Administrators' " + + "ORDER BY a.ACCOUNT_ID" + ); + + boolean hasAdmins = false; + while (rs.next()) { + hasAdmins = true; + System.out.println("管理员 Account ID: " + rs.getInt("ACCOUNT_ID")); + System.out.println("Full Name: " + rs.getString("FULL_NAME")); + System.out.println("Username: " + rs.getString("USER_NAME")); + System.out.println(); + } + + if (!hasAdmins) { + System.out.println("(无管理员,需要设置)"); + } + + // 检查账户 1000001 + System.out.println("\n=== 检查账户 1000001 ==="); + rs = stmt.executeQuery("SELECT ACCOUNT_ID, FULL_NAME, USER_NAME FROM ACCOUNTS WHERE ACCOUNT_ID = 1000001"); + if (rs.next()) { + System.out.println("Account ID: " + rs.getInt("ACCOUNT_ID")); + System.out.println("Full Name: " + rs.getString("FULL_NAME")); + System.out.println("Username: " + rs.getString("USER_NAME")); + } else { + System.out.println("账户 1000001 不存在"); + } + + conn.close(); + + } catch (Exception e) { + System.err.println("错误: " + e.getMessage()); + e.printStackTrace(); + } + } +} + diff --git a/configure_permissions.sh b/configure_permissions.sh new file mode 100644 index 0000000..cf1030e --- /dev/null +++ b/configure_permissions.sh @@ -0,0 +1,77 @@ +#!/bin/bash + +# 配置 Gerrit 项目权限的脚本 + +PROJECT_NAME="zhini-im" +GERRIT_DIR="/home/renjianbo/gerrit_install/review_site" +JAVA_HOME="/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64" + +echo "==========================================" +echo "配置 Gerrit 项目权限" +echo "==========================================" +echo "" + +cd "$GERRIT_DIR" || exit 1 + +# 方法 1: 尝试使用 SSH(如果密钥配置正确) +echo "方法 1: 尝试使用 SSH 配置..." +ssh -p 29418 renjianbo@localhost gerrit set-access "$PROJECT_NAME" -a refs/for/* -g Administrators Label-Code-Review+2 2>/dev/null + +if [ $? -eq 0 ]; then + echo "✅ 通过 SSH 配置成功" + exit 0 +fi + +echo "SSH 配置失败,尝试其他方法..." +echo "" + +# 方法 2: 直接编辑配置文件 +echo "方法 2: 编辑配置文件..." + +PROJECT_CONFIG_DIR="$GERRIT_DIR/git/$PROJECT_NAME.git" +PROJECT_CONFIG="$PROJECT_CONFIG_DIR/config" + +if [ ! -d "$PROJECT_CONFIG_DIR" ]; then + echo "❌ 项目目录不存在: $PROJECT_CONFIG_DIR" + exit 1 +fi + +# 备份配置文件 +if [ -f "$PROJECT_CONFIG" ]; then + cp "$PROJECT_CONFIG" "$PROJECT_CONFIG.bak.$(date +%Y%m%d_%H%M%S)" + echo "✅ 已备份配置文件" +fi + +# 检查是否已有权限配置 +if grep -q "refs/for/\*" "$PROJECT_CONFIG" 2>/dev/null; then + echo "⚠️ 检测到已有 refs/for/* 权限配置" + echo "请手动编辑文件: $PROJECT_CONFIG" + echo "" + echo "添加以下内容:" + echo " [access \"refs/for/*\"]" + echo " label-Code-Review = +2 group Administrators" +else + # 添加权限配置 + cat >> "$PROJECT_CONFIG" << 'EOF' + +[access "refs/for/*"] + label-Code-Review = +2 group Administrators +EOF + echo "✅ 已添加权限配置到配置文件" +fi + +echo "" +echo "配置文件位置: $PROJECT_CONFIG" +echo "" +echo "下一步:" +echo "1. 检查配置文件内容是否正确" +echo "2. 重启 Gerrit 服务使配置生效:" +echo " cd $GERRIT_DIR" +echo " JAVA_HOME=$JAVA_HOME bin/gerrit.sh restart" +echo "" + +# 显示配置文件内容 +echo "当前配置文件内容(最后 20 行):" +tail -20 "$PROJECT_CONFIG" + + diff --git a/create_account.class b/create_account.class new file mode 100644 index 0000000..41ede1f Binary files /dev/null and b/create_account.class differ diff --git a/create_account.java b/create_account.java new file mode 100644 index 0000000..e6ce533 --- /dev/null +++ b/create_account.java @@ -0,0 +1,108 @@ +import java.sql.*; +import java.util.UUID; + +public class create_account { + public static void main(String[] args) { + String dbPath = "/home/renjianbo/gerrit_install/review_site/db/ReviewDB"; + String username = "renjianbo"; + String email = "renjianbo@example.com"; + String fullName = "renjianbo"; + + try { + // 加载 H2 驱动 + Class.forName("org.h2.Driver"); + + // 连接数据库 + String url = "jdbc:h2:" + dbPath + ";AUTO_SERVER=TRUE"; + Connection conn = DriverManager.getConnection(url, "sa", ""); + + // 检查账户是否存在 + PreparedStatement checkStmt = conn.prepareStatement( + "SELECT account_id FROM accounts WHERE account_id = 1000000" + ); + ResultSet rs = checkStmt.executeQuery(); + + int accountId = 1000000; + if (!rs.next()) { + // 创建新账户 + PreparedStatement insertAccount = conn.prepareStatement( + "INSERT INTO accounts (account_id, full_name, preferred_email, inactive, registered_on) " + + "VALUES (?, ?, ?, ?, ?)" + ); + insertAccount.setInt(1, accountId); + insertAccount.setString(2, fullName); + insertAccount.setString(3, email); + insertAccount.setInt(4, 0); + insertAccount.setTimestamp(5, new Timestamp(System.currentTimeMillis())); + insertAccount.executeUpdate(); + System.out.println("账户创建成功: " + accountId); + } else { + // 更新现有账户 + PreparedStatement updateAccount = conn.prepareStatement( + "UPDATE accounts SET full_name = ?, preferred_email = ? WHERE account_id = ?" + ); + updateAccount.setString(1, fullName); + updateAccount.setString(2, email); + updateAccount.setInt(3, accountId); + updateAccount.executeUpdate(); + System.out.println("账户更新成功: " + accountId); + } + + // 设置用户名 + PreparedStatement checkExtId = conn.prepareStatement( + "SELECT account_id FROM account_external_ids WHERE account_id = ? AND external_id = ?" + ); + checkExtId.setInt(1, accountId); + checkExtId.setString(2, "username:" + username); + rs = checkExtId.executeQuery(); + + if (!rs.next()) { + PreparedStatement insertExtId = conn.prepareStatement( + "INSERT INTO account_external_ids (account_id, email_address, password, external_id) " + + "VALUES (?, ?, NULL, ?)" + ); + insertExtId.setInt(1, accountId); + insertExtId.setString(2, email); + insertExtId.setString(3, "username:" + username); + insertExtId.executeUpdate(); + System.out.println("用户名设置成功: " + username); + } else { + PreparedStatement updateExtId = conn.prepareStatement( + "UPDATE account_external_ids SET email_address = ? WHERE account_id = ? AND external_id = ?" + ); + updateExtId.setString(1, email); + updateExtId.setInt(2, accountId); + updateExtId.setString(3, "username:" + username); + updateExtId.executeUpdate(); + System.out.println("用户名更新成功: " + username); + } + + // 设置为管理员(如果是第一个账户) + PreparedStatement checkAdmin = conn.prepareStatement( + "SELECT account_id FROM account_group_members WHERE account_id = ? AND group_id = " + + "(SELECT group_id FROM account_groups WHERE name = 'Administrators')" + ); + checkAdmin.setInt(1, accountId); + rs = checkAdmin.executeQuery(); + + if (!rs.next()) { + PreparedStatement addAdmin = conn.prepareStatement( + "INSERT INTO account_group_members (account_id, group_id, added_on) " + + "SELECT ?, group_id, ? FROM account_groups WHERE name = 'Administrators'" + ); + addAdmin.setInt(1, accountId); + addAdmin.setTimestamp(2, new Timestamp(System.currentTimeMillis())); + addAdmin.executeUpdate(); + System.out.println("已设置为管理员"); + } + + conn.close(); + System.out.println("完成!账户 ID: " + accountId + ", 用户名: " + username); + + } catch (Exception e) { + System.err.println("错误: " + e.getMessage()); + e.printStackTrace(); + } + } +} + diff --git a/create_project.sh b/create_project.sh new file mode 100755 index 0000000..b22aa5b --- /dev/null +++ b/create_project.sh @@ -0,0 +1,33 @@ +#!/bin/bash + +# Gerrit 创建项目脚本 + +PROJECT_NAME="${1:-my-project}" +GERRIT_HOST="101.43.95.130" +GERRIT_SSH_PORT="29418" +USERNAME="renjianbo" + +echo "创建项目: $PROJECT_NAME" +echo "" + +# 使用 SSH 创建项目 +ssh -p ${GERRIT_SSH_PORT} ${USERNAME}@${GERRIT_HOST} gerrit create-project ${PROJECT_NAME} + +if [ $? -eq 0 ]; then + echo "" + echo "✅ 项目创建成功!" + echo "" + echo "访问项目: http://${GERRIT_HOST}:8080/#/admin/projects/${PROJECT_NAME}" + echo "" + echo "克隆项目:" + echo " git clone ssh://${USERNAME}@${GERRIT_HOST}:${GERRIT_SSH_PORT}/${PROJECT_NAME}" + echo " 或" + echo " git clone http://${GERRIT_HOST}:8080/${PROJECT_NAME}" +else + echo "" + echo "❌ 项目创建失败" + echo "请检查:" + echo " 1. SSH 连接是否正常" + echo " 2. 用户是否有创建项目的权限" +fi + diff --git a/create_systemd_service.sh b/create_systemd_service.sh new file mode 100755 index 0000000..976374e --- /dev/null +++ b/create_systemd_service.sh @@ -0,0 +1,99 @@ +#!/bin/bash +# 创建 Gerrit systemd 服务,确保服务稳定运行和自动启动 + +echo "==========================================" +echo "创建 Gerrit systemd 服务" +echo "==========================================" +echo "" + +# 检查是否有 root 权限 +if [ "$EUID" -ne 0 ]; then + echo "❌ 此脚本需要 root 权限,请使用 sudo 运行" + echo "" + echo "使用方法:" + echo " sudo bash create_systemd_service.sh" + exit 1 +fi + +GERRIT_HOME="/home/renjianbo/gerrit_install/review_site" +GERRIT_USER="renjianbo" +JAVA_HOME="/usr/local/java/jdk-17.0.12+7" + +echo "配置信息:" +echo " 服务目录: ${GERRIT_HOME}" +echo " 运行用户: ${GERRIT_USER}" +echo " Java 路径: ${JAVA_HOME}" +echo "" + +# 创建 systemd 服务文件 +echo "创建 systemd 服务文件..." +sudo tee /etc/systemd/system/gerrit.service > /dev/null << EOSERVICE +[Unit] +Description=Gerrit Code Review +After=network.target + +[Service] +Type=forking +User=${GERRIT_USER} +Group=${GERRIT_USER} +WorkingDirectory=${GERRIT_HOME} +Environment="JAVA_HOME=${JAVA_HOME}" +Environment="PATH=${JAVA_HOME}/bin:/usr/local/bin:/usr/bin:/bin" +ExecStart=${GERRIT_HOME}/bin/gerrit.sh start +ExecStop=${GERRIT_HOME}/bin/gerrit.sh stop +Restart=on-failure +RestartSec=10 +StandardOutput=journal +StandardError=journal + +[Install] +WantedBy=multi-user.target +EOSERVICE + +if [ $? -eq 0 ]; then + echo "✅ systemd 服务文件创建成功" +else + echo "❌ 创建服务文件失败" + exit 1 +fi + +echo "" +echo "重新加载 systemd 配置..." +sudo systemctl daemon-reload + +if [ $? -eq 0 ]; then + echo "✅ systemd 配置已重新加载" +else + echo "❌ 重新加载失败" + exit 1 +fi + +echo "" +echo "设置开机自启动..." +sudo systemctl enable gerrit + +if [ $? -eq 0 ]; then + echo "✅ 开机自启动已设置" +else + echo "❌ 设置开机自启动失败" + exit 1 +fi + +echo "" +echo "==========================================" +echo "✅ systemd 服务配置完成!" +echo "==========================================" +echo "" +echo "服务管理命令:" +echo " 启动服务: sudo systemctl start gerrit" +echo " 停止服务: sudo systemctl stop gerrit" +echo " 重启服务: sudo systemctl restart gerrit" +echo " 查看状态: sudo systemctl status gerrit" +echo " 查看日志: sudo journalctl -u gerrit -f" +echo "" +echo "服务特性:" +echo " ✅ 开机自动启动" +echo " ✅ 故障自动重启(失败后10秒重启)" +echo " ✅ 日志记录到 systemd journal" +echo "" + diff --git a/fix_email.sh b/fix_email.sh new file mode 100644 index 0000000..8d21839 --- /dev/null +++ b/fix_email.sh @@ -0,0 +1,100 @@ +#!/bin/bash + +# 修复 Git 提交记录中的邮箱地址 +# 将 noreply@gitee.com 替换为已注册的邮箱 + +echo "==========================================" +echo "修复 Git 提交记录中的邮箱地址" +echo "==========================================" +echo "" + +# 检查是否在 Git 仓库中 +if [ ! -d .git ]; then + echo "❌ 错误:当前目录不是 Git 仓库" + exit 1 +fi + +# 检查是否有未提交的更改 +if [ -n "$(git status --porcelain)" ]; then + echo "⚠️ 警告:检测到未提交的更改" + echo "建议先提交或暂存更改后再执行此脚本" + read -p "是否继续?(y/n) " -n 1 -r + echo + if [[ ! $REPLY =~ ^[Yy]$ ]]; then + exit 1 + fi +fi + +# 配置信息 +OLD_EMAIL="noreply@gitee.com" +CORRECT_NAME="renjianbo" +CORRECT_EMAIL="263303411@qq.com" + +echo "将修改以下邮箱地址:" +echo " 旧邮箱: $OLD_EMAIL" +echo " 新邮箱: $CORRECT_EMAIL" +echo " 作者名: $CORRECT_NAME" +echo "" + +# 检查是否有使用旧邮箱的提交 +COMMITS_WITH_OLD_EMAIL=$(git log --format='%H' --author="$OLD_EMAIL" | wc -l) + +if [ "$COMMITS_WITH_OLD_EMAIL" -eq 0 ]; then + echo "✅ 没有找到使用 $OLD_EMAIL 的提交,无需修改" + exit 0 +fi + +echo "找到 $COMMITS_WITH_OLD_EMAIL 个使用旧邮箱的提交" +echo "" + +# 创建备份分支 +BACKUP_BRANCH="backup-$(date +%Y%m%d-%H%M%S)" +echo "创建备份分支: $BACKUP_BRANCH" +git branch "$BACKUP_BRANCH" +echo "✅ 备份完成" +echo "" + +# 执行批量修改 +echo "开始批量修改提交记录..." +echo "这可能需要一些时间,请耐心等待..." +echo "" + +git filter-branch -f --env-filter " +if [ \"\$GIT_COMMITTER_EMAIL\" = \"$OLD_EMAIL\" ] +then + export GIT_COMMITTER_NAME=\"$CORRECT_NAME\" + export GIT_COMMITTER_EMAIL=\"$CORRECT_EMAIL\" +fi +if [ \"\$GIT_AUTHOR_EMAIL\" = \"$OLD_EMAIL\" ] +then + export GIT_AUTHOR_NAME=\"$CORRECT_NAME\" + export GIT_AUTHOR_EMAIL=\"$CORRECT_EMAIL\" +fi +" --tag-name-filter cat -- --branches --tags + +if [ $? -eq 0 ]; then + echo "" + echo "✅ 修改完成!" + echo "" + echo "验证结果:" + REMAINING=$(git log --format='%H' --author="$OLD_EMAIL" | wc -l) + if [ "$REMAINING" -eq 0 ]; then + echo "✅ 所有提交的邮箱地址已成功修改" + else + echo "⚠️ 仍有 $REMAINING 个提交使用旧邮箱" + fi + echo "" + echo "下一步:" + echo " 1. 检查修改结果:git log --format='%an <%ae>' | head -10" + echo " 2. 推送到 Gerrit:git push gerrit HEAD:refs/for/master" + echo "" + echo "如果需要恢复,可以使用:" + echo " git reset --hard $BACKUP_BRANCH" +else + echo "" + echo "❌ 修改失败" + echo "可以恢复备份:git reset --hard $BACKUP_BRANCH" + exit 1 +fi + + diff --git a/fix_unique_changeid.sh b/fix_unique_changeid.sh new file mode 100644 index 0000000..fcf8dd3 --- /dev/null +++ b/fix_unique_changeid.sh @@ -0,0 +1,91 @@ +#!/bin/bash + +# 为所有提交生成唯一 Change-Id 的脚本 + +echo "==========================================" +echo "为所有提交生成唯一的 Change-Id" +echo "==========================================" +echo "" + +cd /d/zhini/zhini_im || exit 1 + +# 1. 确保 hook 已安装 +echo "步骤 1: 确保 commit-msg hook 已安装..." +mkdir -p .git/hooks +curl -o .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg 2>/dev/null +chmod +x .git/hooks/commit-msg +echo "✅ Hook 已安装" +echo "" + +# 2. 创建备份 +echo "步骤 2: 创建备份分支..." +BACKUP_BRANCH="backup-$(date +%Y%m%d-%H%M%S)" +git branch "$BACKUP_BRANCH" +echo "✅ 备份分支: $BACKUP_BRANCH" +echo "" + +# 3. 检查当前有多少个提交 +TOTAL_COMMITS=$(git rev-list --count HEAD) +echo "步骤 3: 找到 $TOTAL_COMMITS 个提交需要处理" +echo "" + +# 4. 为所有提交生成唯一的 Change-Id +echo "步骤 4: 为所有提交生成唯一的 Change-Id..." +echo "这可能需要一些时间,请耐心等待..." +echo "" + +# 使用 filter-branch,为每个提交生成基于其唯一信息的 Change-Id +git filter-branch -f --msg-filter ' + # 读取原始提交信息 + ORIGINAL_MSG=$(cat) + + # 移除所有旧的 Change-Id 行 + CLEAN_MSG=$(echo "$ORIGINAL_MSG" | grep -v "^Change-Id:") + + # 输出清理后的提交信息(去除末尾多余空行) + echo "$CLEAN_MSG" | sed -e :a -e "/^\$/{\$!N;ba}" -e "s/\n\$//" + + # 为当前提交生成唯一的 Change-Id + # 使用提交的完整 SHA1(每个提交的 SHA1 都是唯一的) + COMMIT_SHA=$(git rev-parse HEAD) + + # 直接使用 SHA1 作为 Change-Id(SHA1 本身就是唯一的) + # Change-Id 格式:I + 40位十六进制 + CHANGE_ID="I${COMMIT_SHA}" + + echo "" + echo "Change-Id: $CHANGE_ID" +' --tag-name-filter cat -- --branches --tags + +if [ $? -eq 0 ]; then + echo "" + echo "✅ Change-Id 生成完成!" + echo "" + + # 验证所有 Change-Id 都是唯一的 + echo "步骤 5: 验证 Change-Id 唯一性..." + DUPLICATES=$(git log --format='%H' | while read commit; do + git log -1 --format='%B' "$commit" | grep "^Change-Id:" | head -1 | cut -d' ' -f2 + done | sort | uniq -d) + + if [ -z "$DUPLICATES" ]; then + echo "✅ 所有 Change-Id 都是唯一的" + else + echo "⚠️ 发现重复的 Change-Id:" + echo "$DUPLICATES" + fi + + echo "" + echo "下一步:" + echo " git push gerrit HEAD:refs/for/master" + echo "" + echo "如果需要恢复,可以使用:" + echo " git reset --hard $BACKUP_BRANCH" +else + echo "" + echo "❌ 生成 Change-Id 失败" + echo "可以恢复备份:git reset --hard $BACKUP_BRANCH" + exit 1 +fi + + diff --git a/install_drone_ci.sh b/install_drone_ci.sh new file mode 100755 index 0000000..304ddae --- /dev/null +++ b/install_drone_ci.sh @@ -0,0 +1,241 @@ +#!/bin/bash + +# Drone CI 安装脚本(轻量级,适合个人小团队) +# 支持 CentOS/RHEL 系统 + +set -e + +# 颜色输出 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# 配置变量 +GERRIT_HOST="${GERRIT_HOST:-101.43.95.130}" +GERRIT_PORT="${GERRIT_PORT:-8080}" +DRONE_PORT="${DRONE_PORT:-3000}" +DRONE_DATA_DIR="/opt/drone" +DRONE_RPC_SECRET="" + +echo -e "${GREEN}========================================${NC}" +echo -e "${GREEN}Drone CI 自动化安装脚本${NC}" +echo -e "${GREEN}(轻量级,适合个人小团队)${NC}" +echo -e "${GREEN}========================================${NC}" + +# 检查 Docker +check_docker() { + echo -e "${GREEN}检查 Docker 环境...${NC}" + if ! command -v docker &> /dev/null; then + echo -e "${YELLOW}未检测到 Docker,正在安装...${NC}" + # 安装 Docker + sudo yum install -y yum-utils + sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo + sudo yum install -y docker-ce docker-ce-cli containerd.io + sudo systemctl start docker + sudo systemctl enable docker + fi + + # 检查 Docker 服务状态 + if ! sudo systemctl is-active --quiet docker; then + echo -e "${YELLOW}启动 Docker 服务...${NC}" + sudo systemctl start docker + fi + + echo -e "${GREEN}Docker 版本: $(docker --version)${NC}" +} + +# 生成 RPC Secret +generate_rpc_secret() { + echo -e "${GREEN}生成 RPC Secret...${NC}" + if command -v openssl &> /dev/null; then + DRONE_RPC_SECRET=$(openssl rand -hex 16) + else + DRONE_RPC_SECRET=$(date +%s | sha256sum | base64 | head -c 32) + fi + echo -e "${GREEN}RPC Secret 已生成${NC}" +} + +# 创建数据目录 +create_directories() { + echo -e "${GREEN}创建数据目录...${NC}" + sudo mkdir -p ${DRONE_DATA_DIR} + sudo chmod 755 ${DRONE_DATA_DIR} + echo -e "${GREEN}目录创建完成: ${DRONE_DATA_DIR}${NC}" +} + +# 安装 Drone Server +install_drone_server() { + echo -e "${GREEN}安装 Drone Server...${NC}" + + # 停止并删除旧容器(如果存在) + sudo docker stop drone 2>/dev/null || true + sudo docker rm drone 2>/dev/null || true + + # 运行 Drone Server + sudo docker run -d \ + --name=drone \ + --restart=always \ + --volume=${DRONE_DATA_DIR}:/data \ + --env=DRONE_GERRIT_SERVER=http://${GERRIT_HOST}:${GERRIT_PORT} \ + --env=DRONE_GERRIT_USERNAME=admin \ + --env=DRONE_GERRIT_PASSWORD="" \ + --env=DRONE_RPC_SECRET=${DRONE_RPC_SECRET} \ + --env=DRONE_SERVER_HOST=${GERRIT_HOST}:${DRONE_PORT} \ + --env=DRONE_SERVER_PROTO=http \ + --env=DRONE_USER_CREATE=username:admin,admin:true \ + --publish=${DRONE_PORT}:80 \ + drone/drone:latest + + echo -e "${GREEN}Drone Server 安装完成${NC}" +} + +# 安装 Drone Runner +install_drone_runner() { + echo -e "${GREEN}安装 Drone Runner...${NC}" + + # 停止并删除旧容器(如果存在) + sudo docker stop drone-runner 2>/dev/null || true + sudo docker rm drone-runner 2>/dev/null || true + + # 运行 Drone Runner + sudo docker run -d \ + --name=drone-runner \ + --restart=always \ + --volume=/var/run/docker.sock:/var/run/docker.sock \ + --env=DRONE_RPC_PROTO=http \ + --env=DRONE_RPC_HOST=${GERRIT_HOST}:${DRONE_PORT} \ + --env=DRONE_RPC_SECRET=${DRONE_RPC_SECRET} \ + --env=DRONE_RUNNER_CAPACITY=2 \ + --env=DRONE_RUNNER_NAME=runner-1 \ + drone/drone-runner-docker:latest + + echo -e "${GREEN}Drone Runner 安装完成${NC}" +} + +# 检查防火墙 +check_firewall() { + echo -e "${YELLOW}检查防火墙配置...${NC}" + + if command -v firewall-cmd &> /dev/null; then + if sudo firewall-cmd --list-ports | grep -q "${DRONE_PORT}"; then + echo -e "${GREEN}防火墙端口 ${DRONE_PORT} 已开放${NC}" + else + echo -e "${YELLOW}需要开放防火墙端口 ${DRONE_PORT}${NC}" + echo -e "${YELLOW}执行: sudo firewall-cmd --permanent --add-port=${DRONE_PORT}/tcp && sudo firewall-cmd --reload${NC}" + fi + else + echo -e "${YELLOW}未检测到 firewall-cmd,请手动检查防火墙${NC}" + fi +} + +# 创建 .drone.yml 示例 +create_drone_yml_example() { + echo -e "${GREEN}创建 .drone.yml 示例...${NC}" + + cat > /tmp/.drone.yml.example << 'EOF' +# Drone CI 配置文件示例 +# 将此文件复制到项目根目录并命名为 .drone.yml + +kind: pipeline +type: docker +name: default + +steps: +- name: build + image: maven:3.8-openjdk-17 + commands: + - echo "开始构建..." + - mvn clean package + +- name: test + image: maven:3.8-openjdk-17 + commands: + - echo "运行测试..." + - mvn test + +- name: deploy + image: alpine + commands: + - echo "部署应用..." + # 在这里添加部署命令 + +--- +# 如果是 Node.js 项目,使用以下配置: +kind: pipeline +type: docker +name: nodejs + +steps: +- name: install + image: node:18 + commands: + - npm install + +- name: build + image: node:18 + commands: + - npm run build + +- name: test + image: node:18 + commands: + - npm test +EOF + + echo -e "${GREEN}示例文件已保存到: /tmp/.drone.yml.example${NC}" +} + +# 输出访问信息 +print_info() { + echo -e "${GREEN}========================================${NC}" + echo -e "${GREEN}Drone CI 安装完成!${NC}" + echo -e "${GREEN}========================================${NC}" + echo -e "${YELLOW}访问地址:${NC}" + echo -e " Drone CI Web 界面: http://${GERRIT_HOST}:${DRONE_PORT}" + echo -e " Gerrit Web 界面: http://${GERRIT_HOST}:${GERRIT_PORT}" + echo -e "" + echo -e "${YELLOW}常用命令:${NC}" + echo -e " 查看 Server 状态: sudo docker ps | grep drone" + echo -e " 查看 Server 日志: sudo docker logs -f drone" + echo -e " 查看 Runner 日志: sudo docker logs -f drone-runner" + echo -e " 重启 Server: sudo docker restart drone" + echo -e " 重启 Runner: sudo docker restart drone-runner" + echo -e "" + echo -e "${YELLOW}数据目录:${NC}" + echo -e " ${DRONE_DATA_DIR}" + echo -e "" + echo -e "${YELLOW}下一步:${NC}" + echo -e " 1. 访问 http://${GERRIT_HOST}:${DRONE_PORT}" + echo -e " 2. 使用 admin 账号登录(首次登录会自动创建)" + echo -e " 3. 在项目根目录创建 .drone.yml 配置文件" + echo -e " 4. 参考示例: cat /tmp/.drone.yml.example" + echo -e " 5. 在 Gerrit 项目设置中配置 Webhook:" + echo -e " URL: http://${GERRIT_HOST}:${DRONE_PORT}/hook" + echo -e " 事件: patchset-created, change-merged" + echo -e "" + echo -e "${YELLOW}配置 Gerrit Webhook:${NC}" + echo -e " 1. 访问 Gerrit: http://${GERRIT_HOST}:${GERRIT_PORT}" + echo -e " 2. 进入项目设置 → Webhooks" + echo -e " 3. 添加 Webhook:" + echo -e " URL: http://${GERRIT_HOST}:${DRONE_PORT}/hook" + echo -e " 事件: patchset-created, change-merged" + echo -e "${GREEN}========================================${NC}" +} + +# 主函数 +main() { + check_docker + generate_rpc_secret + create_directories + install_drone_server + sleep 5 # 等待 Server 启动 + install_drone_runner + check_firewall + create_drone_yml_example + print_info +} + +# 执行主函数 +main + diff --git a/install_gerrit.sh b/install_gerrit.sh new file mode 100755 index 0000000..0bb2d00 --- /dev/null +++ b/install_gerrit.sh @@ -0,0 +1,248 @@ +#!/bin/bash + +# Gerrit 一键安装脚本 +# 支持 Ubuntu/Debian 和 CentOS/Rocky Linux + +set -e + +# 颜色输出 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# 配置变量 +GERRIT_VERSION="${GERRIT_VERSION:-3.5.0.1}" +GERRIT_HOME="/opt/gerrit" +GERRIT_USER="${USER}" +GERRIT_PORT="${GERRIT_PORT:-8080}" +GERRIT_SSH_PORT="${GERRIT_SSH_PORT:-29418}" + +echo -e "${GREEN}========================================${NC}" +echo -e "${GREEN}Gerrit 自动化安装脚本${NC}" +echo -e "${GREEN}版本: ${GERRIT_VERSION}${NC}" +echo -e "${GREEN}========================================${NC}" + +# 检测系统类型 +detect_os() { + if [ -f /etc/os-release ]; then + . /etc/os-release + OS=$ID + OS_VERSION=$VERSION_ID + elif [ -f /etc/redhat-release ]; then + OS="rhel" + OS_VERSION=$(cat /etc/redhat-release | sed 's/.*release \([0-9]\+\).*/\1/') + else + echo -e "${RED}无法检测操作系统类型${NC}" + exit 1 + fi + echo -e "${YELLOW}检测到系统: ${OS} ${OS_VERSION}${NC}" +} + +# 安装依赖 +install_dependencies() { + echo -e "${GREEN}开始安装依赖...${NC}" + + if [[ "$OS" == "ubuntu" ]] || [[ "$OS" == "debian" ]]; then + sudo apt update + sudo apt install -y git wget openjdk-17-jdk + elif [[ "$OS" == "centos" ]] || [[ "$OS" == "rhel" ]] || [[ "$OS" == "rocky" ]]; then + if command -v dnf &> /dev/null; then + sudo dnf install -y git wget java-17-openjdk java-17-openjdk-devel + else + sudo yum install -y git wget java-17-openjdk java-17-openjdk-devel + fi + else + echo -e "${RED}不支持的操作系统: ${OS}${NC}" + exit 1 + fi + + # 验证 Java 安装 + if ! java -version 2>&1 | grep -q "version"; then + echo -e "${RED}Java 安装失败${NC}" + exit 1 + fi + + echo -e "${GREEN}依赖安装完成${NC}" +} + +# 创建工作目录 +create_directories() { + echo -e "${GREEN}创建工作目录...${NC}" + sudo mkdir -p ${GERRIT_HOME} + sudo chown ${GERRIT_USER}:${GERRIT_USER} ${GERRIT_HOME} + cd ${GERRIT_HOME} +} + +# 下载 Gerrit +download_gerrit() { + echo -e "${GREEN}下载 Gerrit ${GERRIT_VERSION}...${NC}" + cd ${GERRIT_HOME} + + if [ ! -f "gerrit-${GERRIT_VERSION}.war" ]; then + wget https://gerrit-releases.storage.googleapis.com/gerrit-${GERRIT_VERSION}.war + else + echo -e "${YELLOW}Gerrit war 文件已存在,跳过下载${NC}" + fi +} + +# 初始化 Gerrit +init_gerrit() { + echo -e "${GREEN}初始化 Gerrit...${NC}" + cd ${GERRIT_HOME} + + if [ -d "review_site" ]; then + echo -e "${YELLOW}Gerrit 已初始化,跳过初始化步骤${NC}" + return + fi + + # 获取服务器 IP + SERVER_IP=$(hostname -I | awk '{print $1}') + if [ -z "$SERVER_IP" ]; then + SERVER_IP="localhost" + fi + + # 非交互式初始化 + java -jar gerrit-${GERRIT_VERSION}.war init \ + -d review_site \ + --batch \ + --no-auto-start \ + -D gerrit.canonicalWebUrl=http://${SERVER_IP}:${GERRIT_PORT}/ \ + --install-plugin=download-commands \ + --install-plugin=replication \ + --install-plugin=reviewnotes || true + + # 配置认证方式为开发模式(方便个人使用) + cat > review_site/etc/gerrit.config << EOCONFIG +[gerrit] + basePath = git + canonicalWebUrl = http://${SERVER_IP}:${GERRIT_PORT}/ + serverId = $(uuidgen 2>/dev/null || echo $(date +%s)) +[database] + type = h2 + database = db/ReviewDB +[auth] + type = DEVELOPMENT_BECOME_ANY_ACCOUNT +[sshd] + listenAddress = *:${GERRIT_SSH_PORT} +[httpd] + listenUrl = http://*:${GERRIT_PORT}/ +[cache] + directory = cache +[index] + type = LUCENE +[receive] + enableSignedPush = false +EOCONFIG + + echo -e "${GREEN}Gerrit 初始化完成${NC}" +} + +# 启动 Gerrit +start_gerrit() { + echo -e "${GREEN}启动 Gerrit 服务...${NC}" + cd ${GERRIT_HOME}/review_site + + # 启动服务 + bin/gerrit.sh start + + # 等待服务启动 + sleep 5 + + # 检查状态 + if bin/gerrit.sh status | grep -q "Running"; then + echo -e "${GREEN}Gerrit 服务启动成功!${NC}" + else + echo -e "${RED}Gerrit 服务启动失败,请检查日志${NC}" + echo -e "${YELLOW}查看日志: tail -f ${GERRIT_HOME}/review_site/logs/gerrit.log${NC}" + exit 1 + fi +} + +# 创建 systemd 服务(可选) +create_systemd_service() { + echo -e "${GREEN}创建 systemd 服务...${NC}" + + sudo tee /etc/systemd/system/gerrit.service > /dev/null << EOSERVICE +[Unit] +Description=Gerrit Code Review +After=network.target + +[Service] +Type=forking +User=${GERRIT_USER} +Group=${GERRIT_USER} +ExecStart=${GERRIT_HOME}/review_site/bin/gerrit.sh start +ExecStop=${GERRIT_HOME}/review_site/bin/gerrit.sh stop +ExecReload=${GERRIT_HOME}/review_site/bin/gerrit.sh restart +Restart=on-failure +RestartSec=10 + +[Install] +WantedBy=multi-user.target +EOSERVICE + + sudo systemctl daemon-reload + sudo systemctl enable gerrit + + echo -e "${GREEN}systemd 服务创建完成${NC}" + echo -e "${YELLOW}使用以下命令管理服务:${NC}" + echo -e " 启动: sudo systemctl start gerrit" + echo -e " 停止: sudo systemctl stop gerrit" + echo -e " 重启: sudo systemctl restart gerrit" + echo -e " 状态: sudo systemctl status gerrit" +} + +# 输出访问信息 +print_info() { + SERVER_IP=$(hostname -I | awk '{print $1}') + if [ -z "$SERVER_IP" ]; then + SERVER_IP="localhost" + fi + + echo -e "${GREEN}========================================${NC}" + echo -e "${GREEN}安装完成!${NC}" + echo -e "${GREEN}========================================${NC}" + echo -e "${YELLOW}访问地址:${NC}" + echo -e " Web 界面: http://${SERVER_IP}:${GERRIT_PORT}" + echo -e " SSH 端口: ${GERRIT_SSH_PORT}" + echo -e "" + echo -e "${YELLOW}常用命令:${NC}" + echo -e " 启动服务: ${GERRIT_HOME}/review_site/bin/gerrit.sh start" + echo -e " 停止服务: ${GERRIT_HOME}/review_site/bin/gerrit.sh stop" + echo -e " 重启服务: ${GERRIT_HOME}/review_site/bin/gerrit.sh restart" + echo -e " 查看状态: ${GERRIT_HOME}/review_site/bin/gerrit.sh status" + echo -e " 查看日志: tail -f ${GERRIT_HOME}/review_site/logs/gerrit.log" + echo -e "" + echo -e "${YELLOW}配置文件位置:${NC}" + echo -e " ${GERRIT_HOME}/review_site/etc/gerrit.config" + echo -e "" + echo -e "${YELLOW}首次访问:${NC}" + echo -e " 1. 打开浏览器访问 http://${SERVER_IP}:${GERRIT_PORT}" + echo -e " 2. 使用任意用户名登录(开发模式)" + echo -e " 3. 第一个登录的用户将自动成为管理员" + echo -e "${GREEN}========================================${NC}" +} + +# 主函数 +main() { + detect_os + install_dependencies + create_directories + download_gerrit + init_gerrit + start_gerrit + + # 询问是否创建 systemd 服务 + read -p "是否创建 systemd 服务以便开机自启? (y/n): " -n 1 -r + echo + if [[ $REPLY =~ ^[Yy]$ ]]; then + create_systemd_service + fi + + print_info +} + +# 执行主函数 +main + diff --git a/install_java17.sh b/install_java17.sh new file mode 100644 index 0000000..3894cfd --- /dev/null +++ b/install_java17.sh @@ -0,0 +1,106 @@ +#!/bin/bash + +# Java 17 安装脚本 +# 提供多个下载源选项 + +set -e + +JAVA_VERSION="17.0.12" +JAVA_DIR="/opt/java17" +INSTALL_DIR="$HOME" + +echo "==========================================" +echo "Java 17 安装脚本" +echo "==========================================" + +# 检查是否已安装 Java 17 +if [ -d "$JAVA_DIR" ] && [ -f "$JAVA_DIR/bin/java" ]; then + CURRENT_VERSION=$($JAVA_DIR/bin/java -version 2>&1 | head -1) + if echo "$CURRENT_VERSION" | grep -q "17"; then + echo "Java 17 已安装: $CURRENT_VERSION" + echo "配置为默认版本..." + sudo alternatives --install /usr/bin/java java $JAVA_DIR/bin/java 2 + sudo alternatives --install /usr/bin/javac javac $JAVA_DIR/bin/javac 2 + sudo alternatives --config java <<< "2" + java -version + exit 0 + fi +fi + +# 下载选项 +echo "请选择下载源:" +echo "1. GitHub (Adoptium) - 需要良好的网络连接" +echo "2. 手动下载后安装" +echo "3. 使用系统包管理器(如果可用)" +read -p "请选择 (1-3): " choice + +case $choice in + 1) + echo "正在从 GitHub 下载 Java 17..." + cd $INSTALL_DIR + URL="https://github.com/adoptium/temurin17-binaries/releases/download/jdk-${JAVA_VERSION}%2B7/OpenJDK17U-jdk_x64_linux_hotspot_${JAVA_VERSION}_7.tar.gz" + wget "$URL" -O java17.tar.gz || { + echo "下载失败,请尝试其他选项" + exit 1 + } + ;; + 2) + echo "请手动下载 Java 17 并保存为 java17.tar.gz" + echo "下载地址: https://adoptium.net/zh-CN/temurin/releases/?version=17" + read -p "下载完成后,请将文件放在 $INSTALL_DIR/java17.tar.gz,然后按回车继续..." + if [ ! -f "$INSTALL_DIR/java17.tar.gz" ]; then + echo "错误: 未找到 java17.tar.gz 文件" + exit 1 + fi + ;; + 3) + echo "尝试使用系统包管理器..." + # 检查是否有可用的 Java 17 包 + if yum list available | grep -q "java-17"; then + sudo yum install -y java-17-openjdk java-17-openjdk-devel + sudo alternatives --config java + java -version + exit 0 + else + echo "系统仓库中没有 Java 17,请选择其他选项" + exit 1 + fi + ;; + *) + echo "无效选择" + exit 1 + ;; +esac + +# 解压和安装 +echo "正在解压..." +cd $INSTALL_DIR +tar -xzf java17.tar.gz + +echo "正在安装到 $JAVA_DIR..." +sudo mkdir -p $JAVA_DIR +sudo mv jdk-${JAVA_VERSION}+7/* $JAVA_DIR/ +sudo chown -R root:root $JAVA_DIR + +# 配置 alternatives +echo "配置 Java 17 为默认版本..." +sudo alternatives --install /usr/bin/java java $JAVA_DIR/bin/java 2 +sudo alternatives --install /usr/bin/javac javac $JAVA_DIR/bin/javac 2 + +# 选择 Java 17 +echo "2" | sudo alternatives --config java > /dev/null 2>&1 || { + echo "请手动选择 Java 17:" + sudo alternatives --config java +} + +# 验证安装 +echo "" +echo "==========================================" +echo "安装完成!" +echo "==========================================" +java -version +echo "" +echo "Java 17 已安装到: $JAVA_DIR" +echo "现在可以继续安装 Gerrit 了!" + + diff --git a/install_jenkins.sh b/install_jenkins.sh new file mode 100644 index 0000000..050bc4f --- /dev/null +++ b/install_jenkins.sh @@ -0,0 +1,245 @@ +#!/bin/bash + +# Jenkins 安装脚本(与 Gerrit 集成) +# 支持 CentOS/RHEL 系统 + +set -e + +# 颜色输出 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# 配置变量 +JENKINS_PORT="${JENKINS_PORT:-8081}" # 避免与 Gerrit 8080 冲突 +GERRIT_HOST="${GERRIT_HOST:-101.43.95.130}" +GERRIT_PORT="${GERRIT_PORT:-8080}" +GERRIT_SSH_PORT="${GERRIT_SSH_PORT:-29418}" +JENKINS_HOME="/opt/jenkins" + +echo -e "${GREEN}========================================${NC}" +echo -e "${GREEN}Jenkins 自动化安装脚本${NC}" +echo -e "${GREEN}(与 Gerrit 集成)${NC}" +echo -e "${GREEN}========================================${NC}" + +# 检测系统类型 +detect_os() { + if [ -f /etc/redhat-release ]; then + OS="rhel" + OS_VERSION=$(cat /etc/redhat-release | sed 's/.*release \([0-9]\+\).*/\1/') + else + echo -e "${RED}当前脚本仅支持 CentOS/RHEL${NC}" + exit 1 + fi + echo -e "${YELLOW}检测到系统: ${OS} ${OS_VERSION}${NC}" +} + +# 检查 Java +check_java() { + echo -e "${GREEN}检查 Java 环境...${NC}" + if ! command -v java &> /dev/null; then + echo -e "${RED}未检测到 Java,请先安装 Java 17${NC}" + echo -e "${YELLOW}运行: bash install_java17.sh${NC}" + exit 1 + fi + + JAVA_VERSION=$(java -version 2>&1 | head -1 | cut -d'"' -f2 | sed '/^1\./s///' | cut -d'.' -f1) + if [ "$JAVA_VERSION" -lt 11 ]; then + echo -e "${RED}需要 Java 11 或更高版本,当前版本: $JAVA_VERSION${NC}" + exit 1 + fi + + echo -e "${GREEN}Java 版本: $(java -version 2>&1 | head -1)${NC}" +} + +# 安装 Jenkins +install_jenkins() { + echo -e "${GREEN}安装 Jenkins...${NC}" + + # 添加 Jenkins 仓库 + sudo wget -O /etc/yum.repos.d/jenkins.repo \ + https://pkg.jenkins.io/redhat-stable/jenkins.repo + sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key + + # 安装 Jenkins + sudo yum install -y jenkins + + echo -e "${GREEN}Jenkins 安装完成${NC}" +} + +# 配置 Jenkins 端口 +configure_jenkins() { + echo -e "${GREEN}配置 Jenkins 端口为 ${JENKINS_PORT}...${NC}" + + # 修改 Jenkins 端口(避免与 Gerrit 冲突) + sudo sed -i "s/JENKINS_PORT=.*/JENKINS_PORT=${JENKINS_PORT}/" /etc/sysconfig/jenkins + + # 设置 Jenkins 用户 + sudo usermod -aG docker jenkins 2>/dev/null || true + + echo -e "${GREEN}配置完成${NC}" +} + +# 启动 Jenkins +start_jenkins() { + echo -e "${GREEN}启动 Jenkins 服务...${NC}" + + sudo systemctl daemon-reload + sudo systemctl start jenkins + sudo systemctl enable jenkins + + # 等待 Jenkins 启动 + echo -e "${YELLOW}等待 Jenkins 启动(约 30 秒)...${NC}" + sleep 30 + + # 检查状态 + if sudo systemctl is-active --quiet jenkins; then + echo -e "${GREEN}Jenkins 服务启动成功!${NC}" + else + echo -e "${RED}Jenkins 服务启动失败,请检查日志${NC}" + echo -e "${YELLOW}查看日志: sudo journalctl -u jenkins -f${NC}" + exit 1 + fi +} + +# 获取初始密码 +get_initial_password() { + echo -e "${GREEN}获取 Jenkins 初始管理员密码...${NC}" + + if [ -f /var/lib/jenkins/secrets/initialAdminPassword ]; then + INITIAL_PASSWORD=$(sudo cat /var/lib/jenkins/secrets/initialAdminPassword) + echo -e "${YELLOW}初始管理员密码: ${INITIAL_PASSWORD}${NC}" + else + echo -e "${YELLOW}未找到初始密码文件,可能已初始化${NC}" + fi +} + +# 安装 Gerrit Trigger 插件(通过 CLI) +install_gerrit_plugin() { + echo -e "${GREEN}准备安装 Gerrit Trigger 插件...${NC}" + echo -e "${YELLOW}注意: 插件需要在 Jenkins Web 界面中安装${NC}" + echo -e "${YELLOW}或使用以下命令(需要 Jenkins 已初始化):${NC}" + echo -e "${YELLOW} java -jar /var/lib/jenkins/war/WEB-INF/jenkins-cli.jar -s http://localhost:${JENKINS_PORT} install-plugin gerrit-trigger${NC}" +} + +# 创建 Gerrit 集成配置示例 +create_gerrit_config_example() { + echo -e "${GREEN}创建 Gerrit 集成配置示例...${NC}" + + cat > /tmp/gerrit_integration_guide.txt << EOF +======================================== +Gerrit 与 Jenkins 集成配置指南 +======================================== + +1. 访问 Jenkins Web 界面 + URL: http://${GERRIT_HOST}:${JENKINS_PORT} + +2. 使用初始密码登录(见上方输出) + +3. 安装 Gerrit Trigger 插件 + - 管理 Jenkins → 插件管理 → 可用插件 + - 搜索 "Gerrit Trigger" + - 安装并重启 Jenkins + +4. 配置 Gerrit Server + - 管理 Jenkins → 系统配置 → Gerrit Trigger + - 添加 Gerrit Server: + * Name: Gerrit-Server + * Frontend URL: http://${GERRIT_HOST}:${GERRIT_PORT} + * SSH Port: ${GERRIT_SSH_PORT} + * Username: admin(或您的 Gerrit 用户名) + * SSH Keyfile: /var/lib/jenkins/.ssh/id_rsa + +5. 配置 SSH 密钥 + - 确保 Jenkins 用户有访问 Gerrit 的 SSH 密钥 + - 将您的 SSH 私钥复制到: /var/lib/jenkins/.ssh/id_rsa + - 设置权限: sudo chown jenkins:jenkins /var/lib/jenkins/.ssh/id_rsa + - 设置权限: sudo chmod 600 /var/lib/jenkins/.ssh/id_rsa + +6. 测试连接 + - 在 Gerrit Trigger 配置中点击 "Test Connection" + - 如果成功,会显示 Gerrit 版本信息 + +7. 创建流水线任务 + - 新建任务 → 流水线 + - 在 Pipeline 脚本中配置 Gerrit Trigger + +示例 Pipeline 脚本: +pipeline { + agent any + triggers { + gerrit( + serverName: 'Gerrit-Server', + events: [changeMerged(), patchsetCreated()], + project: 'plain:.*', + branch: 'plain:.*' + ) + } + stages { + stage('构建') { + steps { + sh 'echo "开始构建..."' + } + } + } +} + +======================================== +EOF + + echo -e "${GREEN}配置指南已保存到: /tmp/gerrit_integration_guide.txt${NC}" +} + +# 输出访问信息 +print_info() { + echo -e "${GREEN}========================================${NC}" + echo -e "${GREEN}Jenkins 安装完成!${NC}" + echo -e "${GREEN}========================================${NC}" + echo -e "${YELLOW}访问地址:${NC}" + echo -e " Jenkins Web 界面: http://${GERRIT_HOST}:${JENKINS_PORT}" + echo -e " Gerrit Web 界面: http://${GERRIT_HOST}:${GERRIT_PORT}" + echo -e "" + echo -e "${YELLOW}初始管理员密码:${NC}" + if [ -f /var/lib/jenkins/secrets/initialAdminPassword ]; then + INITIAL_PASSWORD=$(sudo cat /var/lib/jenkins/secrets/initialAdminPassword) + echo -e " ${INITIAL_PASSWORD}" + else + echo -e " (未找到,可能已初始化)" + fi + echo -e "" + echo -e "${YELLOW}常用命令:${NC}" + echo -e " 启动: sudo systemctl start jenkins" + echo -e " 停止: sudo systemctl stop jenkins" + echo -e " 重启: sudo systemctl restart jenkins" + echo -e " 状态: sudo systemctl status jenkins" + echo -e " 日志: sudo journalctl -u jenkins -f" + echo -e "" + echo -e "${YELLOW}配置文件位置:${NC}" + echo -e " Jenkins 配置: /var/lib/jenkins/config.xml" + echo -e " Jenkins 端口: /etc/sysconfig/jenkins" + echo -e "" + echo -e "${YELLOW}下一步:${NC}" + echo -e " 1. 访问 http://${GERRIT_HOST}:${JENKINS_PORT}" + echo -e " 2. 使用初始密码登录" + echo -e " 3. 安装 Gerrit Trigger 插件" + echo -e " 4. 配置 Gerrit 连接" + echo -e " 5. 查看配置指南: cat /tmp/gerrit_integration_guide.txt" + echo -e "${GREEN}========================================${NC}" +} + +# 主函数 +main() { + detect_os + check_java + install_jenkins + configure_jenkins + start_jenkins + get_initial_password + create_gerrit_config_example + print_info +} + +# 执行主函数 +main + diff --git a/install_webhook_ci.sh b/install_webhook_ci.sh new file mode 100755 index 0000000..6c1d9e5 --- /dev/null +++ b/install_webhook_ci.sh @@ -0,0 +1,484 @@ +#!/bin/bash + +# Webhook CI 安装脚本(轻量级,适合个人小团队) +# 支持 CentOS/RHEL 系统 + +set -e + +# 颜色输出 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# 配置变量 +GERRIT_HOST="${GERRIT_HOST:-101.43.95.130}" +GERRIT_PORT="${GERRIT_PORT:-8080}" +WEBHOOK_PORT="${WEBHOOK_PORT:-9000}" +# 使用用户目录,避免需要 sudo +CI_SCRIPTS_DIR="${CI_SCRIPTS_DIR:-${HOME}/ci-scripts}" +WEBHOOK_USER="${USER}" + +echo -e "${GREEN}========================================${NC}" +echo -e "${GREEN}Webhook CI 自动化安装脚本${NC}" +echo -e "${GREEN}(轻量级,适合个人小团队)${NC}" +echo -e "${GREEN}========================================${NC}" + +# 检查 Python3 +check_python() { + echo -e "${GREEN}检查 Python3 环境...${NC}" + if ! command -v python3 &> /dev/null; then + echo -e "${RED}未检测到 Python3,请先安装 Python3${NC}" + echo -e "${YELLOW}执行: sudo yum install -y python3${NC}" + exit 1 + fi + echo -e "${GREEN}Python3 版本: $(python3 --version)${NC}" +} + +# 创建工作目录 +create_directories() { + echo -e "${GREEN}创建工作目录...${NC}" + mkdir -p ${CI_SCRIPTS_DIR} + cd ${CI_SCRIPTS_DIR} + echo -e "${GREEN}目录创建完成: ${CI_SCRIPTS_DIR}${NC}" +} + +# 创建 Webhook 接收器 +create_webhook_receiver() { + echo -e "${GREEN}创建 Webhook 接收器...${NC}" + + cat > ${CI_SCRIPTS_DIR}/webhook_receiver.py << EOF +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Gerrit Webhook 接收器 +接收 Gerrit 事件并触发构建脚本 +""" +from http.server import HTTPServer, BaseHTTPRequestHandler +import json +import subprocess +import os +import logging +from datetime import datetime + +# 获取脚本所在目录 +SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) + +# 配置日志 +logging.basicConfig( + level=logging.INFO, + format='%(asctime)s - %(levelname)s - %(message)s', + handlers=[ + logging.FileHandler(os.path.join(SCRIPT_DIR, 'webhook.log')), + logging.StreamHandler() + ] +) + +class WebhookHandler(BaseHTTPRequestHandler): + def log_message(self, format, *args): + """重写日志方法,使用 logging""" + logging.info("%s - - [%s] %s" % (self.address_string(), self.log_date_time_string(), format % args)) + + def do_GET(self): + """处理 GET 请求(健康检查)""" + self.send_response(200) + self.send_header('Content-type', 'text/html; charset=utf-8') + self.end_headers() + self.wfile.write(b'

Webhook CI Receiver

Status: OK

') + + def do_POST(self): + """处理 POST 请求(Gerrit Webhook)""" + try: + content_length = int(self.headers.get('Content-Length', 0)) + post_data = self.rfile.read(content_length) + + if not post_data: + self.send_response(400) + self.end_headers() + return + + # 解析 JSON + try: + event = json.loads(post_data.decode('utf-8')) + except json.JSONDecodeError as e: + logging.error(f"JSON 解析错误: {e}") + self.send_response(400) + self.end_headers() + return + + # 记录事件 + event_type = event.get('type', 'unknown') + logging.info(f"收到事件: {event_type}") + + # 处理不同类型的事件 + if event_type == 'patchset-created': + self.handle_patchset_created(event) + elif event_type == 'change-merged': + self.handle_change_merged(event) + elif event_type == 'comment-added': + self.handle_comment_added(event) + else: + logging.info(f"未处理的事件类型: {event_type}") + + self.send_response(200) + self.send_header('Content-type', 'application/json; charset=utf-8') + self.end_headers() + self.wfile.write(json.dumps({'status': 'ok'}).encode('utf-8')) + + except Exception as e: + logging.error(f"处理请求时出错: {e}", exc_info=True) + self.send_response(500) + self.end_headers() + self.wfile.write(json.dumps({'error': str(e)}).encode('utf-8')) + + def handle_patchset_created(self, event): + """处理 patchset-created 事件""" + change = event.get('change', {}) + project = change.get('project', '') + branch = change.get('branch', '') + change_id = change.get('id', '') + patchset = event.get('patchSet', {}) + patchset_number = patchset.get('number', '') + + logging.info(f"Patchset 创建: 项目={project}, 分支={branch}, Change={change_id}, Patchset={patchset_number}") + + # 触发构建脚本(异步执行) + script_path = os.path.join(SCRIPT_DIR, 'build.sh') + if os.path.exists(script_path): + env = os.environ.copy() + env.update({ + 'GERRIT_PROJECT': project, + 'GERRIT_BRANCH': branch, + 'GERRIT_CHANGE_ID': change_id, + 'GERRIT_PATCHSET_NUMBER': str(patchset_number), + 'GERRIT_EVENT': 'patchset-created' + }) + subprocess.Popen(['bash', script_path], env=env) + logging.info(f"已触发构建脚本: {script_path}") + else: + logging.warning(f"构建脚本不存在: {script_path}") + + def handle_change_merged(self, event): + """处理 change-merged 事件(代码合并后)""" + change = event.get('change', {}) + project = change.get('project', '') + branch = change.get('branch', '') + + logging.info(f"Change 合并: 项目={project}, 分支={branch}") + + # 触发部署脚本(异步执行) + script_path = os.path.join(SCRIPT_DIR, 'deploy.sh') + if os.path.exists(script_path): + env = os.environ.copy() + env.update({ + 'GERRIT_PROJECT': project, + 'GERRIT_BRANCH': branch, + 'GERRIT_EVENT': 'change-merged' + }) + subprocess.Popen(['bash', script_path], env=env) + logging.info(f"已触发部署脚本: {script_path}") + else: + logging.info(f"部署脚本不存在: {script_path}(跳过)") + + def handle_comment_added(self, event): + """处理 comment-added 事件(代码审查评论)""" + change = event.get('change', {}) + comment = event.get('comment', '') + + # 如果评论包含特定关键词,触发构建 + if 'retest' in comment.lower() or 'test' in comment.lower(): + logging.info("检测到测试关键词,触发构建") + self.handle_patchset_created(event) + +if __name__ == '__main__': + port = int(os.environ.get('WEBHOOK_PORT', 9000)) + server = HTTPServer(('0.0.0.0', port), WebhookHandler) + logging.info(f"Webhook 接收器启动在端口 {port}") + try: + server.serve_forever() + except KeyboardInterrupt: + logging.info("收到中断信号,正在关闭...") + server.shutdown() +EOF + + chmod +x ${CI_SCRIPTS_DIR}/webhook_receiver.py + echo -e "${GREEN}Webhook 接收器创建完成${NC}" +} + +# 创建构建脚本模板 +create_build_script() { + echo -e "${GREEN}创建构建脚本模板...${NC}" + + cat > ${CI_SCRIPTS_DIR}/build.sh << 'EOF' +#!/bin/bash +# 构建脚本模板 +# 根据 Gerrit 事件自动触发 + +set -e + +# 获取环境变量 +PROJECT="${GERRIT_PROJECT}" +BRANCH="${GERRIT_BRANCH}" +CHANGE_ID="${GERRIT_CHANGE_ID}" +PATCHSET="${GERRIT_PATCHSET_NUMBER}" +EVENT="${GERRIT_EVENT}" + +# 获取脚本所在目录 +SCRIPT_DIR="$(cd "$(dirname "\${BASH_SOURCE[0]}")" && pwd)" + +# 日志文件 +LOG_FILE="\${SCRIPT_DIR}/build.log" +BUILD_DIR="/tmp/ci-builds/\${PROJECT}" + +echo "=========================================" | tee -a ${LOG_FILE} +echo "构建开始: $(date)" | tee -a ${LOG_FILE} +echo "项目: ${PROJECT}" | tee -a ${LOG_FILE} +echo "分支: ${BRANCH}" | tee -a ${LOG_FILE} +echo "Change ID: ${CHANGE_ID}" | tee -a ${LOG_FILE} +echo "Patchset: ${PATCHSET}" | tee -a ${LOG_FILE} +echo "=========================================" | tee -a ${LOG_FILE} + +# 创建构建目录 +mkdir -p ${BUILD_DIR} +cd ${BUILD_DIR} + +# 克隆或更新代码 +if [ -d "${PROJECT}" ]; then + echo "更新代码..." | tee -a ${LOG_FILE} + cd ${PROJECT} + git fetch origin + git checkout ${BRANCH} + git pull origin ${BRANCH} +else + echo "克隆代码..." | tee -a ${LOG_FILE} + git clone ssh://admin@101.43.95.130:29418/${PROJECT} + cd ${PROJECT} + git checkout ${BRANCH} +fi + +# 根据项目类型执行构建 +if [ -f "pom.xml" ]; then + echo "检测到 Maven 项目,执行 Maven 构建..." | tee -a ${LOG_FILE} + mvn clean package -DskipTests || { + echo "Maven 构建失败" | tee -a ${LOG_FILE} + exit 1 + } +elif [ -f "package.json" ]; then + echo "检测到 Node.js 项目,执行 npm 构建..." | tee -a ${LOG_FILE} + npm install && npm run build || { + echo "npm 构建失败" | tee -a ${LOG_FILE} + exit 1 + } +elif [ -f "Makefile" ]; then + echo "检测到 Makefile,执行 make..." | tee -a ${LOG_FILE} + make || { + echo "Make 构建失败" | tee -a ${LOG_FILE} + exit 1 + } +else + echo "未检测到构建配置文件,跳过构建" | tee -a ${LOG_FILE} +fi + +echo "构建完成: $(date)" | tee -a ${LOG_FILE} +echo "=========================================" | tee -a ${LOG_FILE} +EOF + + chmod +x ${CI_SCRIPTS_DIR}/build.sh + echo -e "${GREEN}构建脚本模板创建完成${NC}" +} + +# 创建部署脚本模板 +create_deploy_script() { + echo -e "${GREEN}创建部署脚本模板...${NC}" + + cat > ${CI_SCRIPTS_DIR}/deploy.sh << 'EOF' +#!/bin/bash +# 部署脚本模板 +# 在代码合并后自动触发 + +set -e + +PROJECT="${GERRIT_PROJECT}" +BRANCH="${GERRIT_BRANCH}" + +# 获取脚本所在目录 +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +LOG_FILE="${SCRIPT_DIR}/deploy.log" + +echo "=========================================" | tee -a ${LOG_FILE} +echo "部署开始: $(date)" | tee -a ${LOG_FILE} +echo "项目: ${PROJECT}" | tee -a ${LOG_FILE} +echo "分支: ${BRANCH}" | tee -a ${LOG_FILE} +echo "=========================================" | tee -a ${LOG_FILE} + +# 在这里添加您的部署逻辑 +# 例如: +# - 复制构建产物到部署目录 +# - 重启服务 +# - 发送通知等 + +echo "部署完成: $(date)" | tee -a ${LOG_FILE} +echo "=========================================" | tee -a ${LOG_FILE} +EOF + + chmod +x ${CI_SCRIPTS_DIR}/deploy.sh + echo -e "${GREEN}部署脚本模板创建完成${NC}" +} + +# 创建启动脚本 +create_start_script() { + echo -e "${GREEN}创建启动脚本...${NC}" + + cat > ${CI_SCRIPTS_DIR}/start_webhook.sh << EOF +#!/bin/bash +# Webhook CI 启动脚本 + +cd ${CI_SCRIPTS_DIR} +export WEBHOOK_PORT=${WEBHOOK_PORT} + +# 检查是否已在运行 +if pgrep -f "webhook_receiver.py" > /dev/null; then + echo "Webhook CI 已在运行中" + exit 1 +fi + +# 启动服务(后台运行) +nohup python3 ${CI_SCRIPTS_DIR}/webhook_receiver.py > ${CI_SCRIPTS_DIR}/webhook_stdout.log 2>&1 & + +echo "Webhook CI 已启动,PID: \$!" +echo "日志文件: ${CI_SCRIPTS_DIR}/webhook.log" +echo "标准输出: ${CI_SCRIPTS_DIR}/webhook_stdout.log" +EOF + + chmod +x ${CI_SCRIPTS_DIR}/start_webhook.sh + + # 创建停止脚本 + cat > ${CI_SCRIPTS_DIR}/stop_webhook.sh << EOF +#!/bin/bash +# Webhook CI 停止脚本 + +PID=\$(pgrep -f "webhook_receiver.py") +if [ -n "\$PID" ]; then + kill \$PID + echo "Webhook CI 已停止 (PID: \$PID)" +else + echo "Webhook CI 未运行" +fi +EOF + + chmod +x ${CI_SCRIPTS_DIR}/stop_webhook.sh + + # 创建状态检查脚本 + cat > ${CI_SCRIPTS_DIR}/status_webhook.sh << EOF +#!/bin/bash +# Webhook CI 状态检查脚本 + +PID=\$(pgrep -f "webhook_receiver.py") +if [ -n "\$PID" ]; then + echo "Webhook CI 正在运行 (PID: \$PID)" + echo "端口: ${WEBHOOK_PORT}" + netstat -tlnp 2>/dev/null | grep ${WEBHOOK_PORT} || ss -tlnp 2>/dev/null | grep ${WEBHOOK_PORT} || echo "端口监听检查失败" +else + echo "Webhook CI 未运行" +fi +EOF + + chmod +x ${CI_SCRIPTS_DIR}/status_webhook.sh + + echo -e "${GREEN}启动/停止脚本创建完成${NC}" +} + +# 启动服务 +start_service() { + echo -e "${GREEN}启动 Webhook CI 服务...${NC}" + + # 检查是否已在运行 + if pgrep -f "webhook_receiver.py" > /dev/null; then + echo -e "${YELLOW}Webhook CI 已在运行中,跳过启动${NC}" + return + fi + + # 启动服务 + cd ${CI_SCRIPTS_DIR} + export WEBHOOK_PORT=${WEBHOOK_PORT} + nohup python3 ${CI_SCRIPTS_DIR}/webhook_receiver.py > ${CI_SCRIPTS_DIR}/webhook_stdout.log 2>&1 & + + # 等待服务启动 + sleep 2 + + if pgrep -f "webhook_receiver.py" > /dev/null; then + PID=$(pgrep -f "webhook_receiver.py") + echo -e "${GREEN}Webhook CI 服务启动成功!(PID: ${PID})${NC}" + else + echo -e "${RED}服务启动失败,请检查日志${NC}" + echo -e "${YELLOW}查看日志: tail -f ${CI_SCRIPTS_DIR}/webhook.log${NC}" + exit 1 + fi +} + +# 检查防火墙 +check_firewall() { + echo -e "${YELLOW}检查防火墙配置...${NC}" + + if command -v firewall-cmd &> /dev/null; then + if sudo firewall-cmd --list-ports | grep -q "${WEBHOOK_PORT}"; then + echo -e "${GREEN}防火墙端口 ${WEBHOOK_PORT} 已开放${NC}" + else + echo -e "${YELLOW}需要开放防火墙端口 ${WEBHOOK_PORT}${NC}" + echo -e "${YELLOW}执行: sudo firewall-cmd --permanent --add-port=${WEBHOOK_PORT}/tcp && sudo firewall-cmd --reload${NC}" + fi + else + echo -e "${YELLOW}未检测到 firewall-cmd,请手动检查防火墙${NC}" + fi +} + +# 输出访问信息 +print_info() { + echo -e "${GREEN}========================================${NC}" + echo -e "${GREEN}Webhook CI 安装完成!${NC}" + echo -e "${GREEN}========================================${NC}" + echo -e "${YELLOW}Webhook URL:${NC}" + echo -e " http://${GERRIT_HOST}:${WEBHOOK_PORT}" + echo -e "" + echo -e "${YELLOW}常用命令:${NC}" + echo -e " 启动: ${CI_SCRIPTS_DIR}/start_webhook.sh" + echo -e " 停止: ${CI_SCRIPTS_DIR}/stop_webhook.sh" + echo -e " 状态: ${CI_SCRIPTS_DIR}/status_webhook.sh" + echo -e " 日志: tail -f ${CI_SCRIPTS_DIR}/webhook.log" + echo -e " 标准输出: tail -f ${CI_SCRIPTS_DIR}/webhook_stdout.log" + echo -e " 构建日志: tail -f ${CI_SCRIPTS_DIR}/build.log" + echo -e "" + echo -e "${YELLOW}脚本位置:${NC}" + echo -e " Webhook 接收器: ${CI_SCRIPTS_DIR}/webhook_receiver.py" + echo -e " 构建脚本: ${CI_SCRIPTS_DIR}/build.sh" + echo -e " 部署脚本: ${CI_SCRIPTS_DIR}/deploy.sh" + echo -e "" + echo -e "${YELLOW}下一步 - 配置 Gerrit Webhook:${NC}" + echo -e " 1. 访问 Gerrit: http://${GERRIT_HOST}:${GERRIT_PORT}" + echo -e " 2. 进入项目设置 → Webhooks" + echo -e " 3. 添加 Webhook:" + echo -e " URL: http://${GERRIT_HOST}:${WEBHOOK_PORT}" + echo -e " 事件: patchset-created, change-merged" + echo -e " 4. 根据项目类型修改构建脚本: ${CI_SCRIPTS_DIR}/build.sh" + echo -e "" + echo -e "${YELLOW}测试 Webhook:${NC}" + echo -e " curl http://${GERRIT_HOST}:${WEBHOOK_PORT}" + echo -e "${GREEN}========================================${NC}" +} + +# 主函数 +main() { + check_python + create_directories + create_webhook_receiver + create_build_script + create_deploy_script + create_start_script + start_service + check_firewall + print_info +} + +# 执行主函数 +main + diff --git a/quick_reinstall.sh b/quick_reinstall.sh new file mode 100644 index 0000000..f24fe38 --- /dev/null +++ b/quick_reinstall.sh @@ -0,0 +1,16 @@ +#!/bin/sh +cd /home/renjianbo/gerrit_install/review_site && bin/gerrit.sh stop 2>/dev/null || true +pkill -9 -f gerrit.war 2>/dev/null || true +cd /home/renjianbo/gerrit_install && rm -rf review_site +export JAVA_HOME=/usr/local/java/jdk-17.0.12+7 +export PATH=$JAVA_HOME/bin:$PATH +cd /home/renjianbo/gerrit_install +$JAVA_HOME/bin/java -jar gerrit-3.9.0.war init -d review_site --batch --no-auto-start -D gerrit.canonicalWebUrl=http://101.43.95.130:8080/ --install-plugin=download-commands --install-plugin=replication --install-plugin=reviewnotes +cd review_site +cp bin/gerrit.sh bin/gerrit.sh.bak +sed -i "2i export JAVA_HOME=/usr/local/java/jdk-17.0.12+7\nexport PATH=\$JAVA_HOME/bin:\$PATH" bin/gerrit.sh +bin/gerrit.sh start +sleep 5 +bin/gerrit.sh status +echo "完成!访问 http://101.43.95.130:8080" + diff --git a/reinit_gerrit.sh b/reinit_gerrit.sh new file mode 100644 index 0000000..7484dfa --- /dev/null +++ b/reinit_gerrit.sh @@ -0,0 +1,192 @@ +#!/bin/bash + +# Gerrit 重新初始化脚本 +# 用于重新创建管理员账号 + +set -e + +# 颜色输出 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# 配置变量 +GERRIT_HOME="/home/renjianbo/gerrit_install" +GERRIT_VERSION="3.9.0" +GERRIT_PORT="8080" +GERRIT_SSH_PORT="29418" +SERVER_IP="101.43.95.130" + +# JDK 17 路径 +JAVA17_HOME="/usr/local/java/jdk-17.0.12+7" +export JAVA_HOME=$JAVA17_HOME +export PATH=$JAVA_HOME/bin:$PATH + +echo -e "${GREEN}========================================${NC}" +echo -e "${GREEN}Gerrit 重新初始化脚本${NC}" +echo -e "${GREEN}版本: ${GERRIT_VERSION}${NC}" +echo -e "${GREEN}========================================${NC}" +echo "" + +# 1. 停止服务 +echo -e "${YELLOW}[1/5] 停止 Gerrit 服务...${NC}" +if [ -d "${GERRIT_HOME}/review_site" ]; then + cd ${GERRIT_HOME}/review_site + if [ -f "bin/gerrit.sh" ]; then + bin/gerrit.sh stop 2>/dev/null || true + sleep 2 + fi +fi +echo -e "${GREEN}✓ 服务已停止${NC}" +echo "" + +# 2. 备份数据 +echo -e "${YELLOW}[2/5] 备份现有数据...${NC}" +BACKUP_DIR="${GERRIT_HOME}/backup_before_reinit_$(date +%Y%m%d_%H%M%S)" +mkdir -p ${BACKUP_DIR} + +if [ -d "${GERRIT_HOME}/review_site" ]; then + if [ -d "${GERRIT_HOME}/review_site/git" ]; then + cp -r ${GERRIT_HOME}/review_site/git ${BACKUP_DIR}/ 2>/dev/null || true + echo " ✓ 已备份 Git 仓库" + fi + + if [ -d "${GERRIT_HOME}/review_site/db" ]; then + cp -r ${GERRIT_HOME}/review_site/db ${BACKUP_DIR}/ 2>/dev/null || true + echo " ✓ 已备份数据库" + fi + + if [ -d "${GERRIT_HOME}/review_site/etc" ]; then + cp -r ${GERRIT_HOME}/review_site/etc ${BACKUP_DIR}/ 2>/dev/null || true + echo " ✓ 已备份配置文件" + fi +fi + +echo -e "${GREEN}✓ 数据已备份到: ${BACKUP_DIR}${NC}" +echo "" + +# 3. 删除旧安装 +echo -e "${YELLOW}[3/5] 删除旧安装...${NC}" +if [ -d "${GERRIT_HOME}/review_site" ]; then + rm -rf ${GERRIT_HOME}/review_site + echo -e "${GREEN}✓ 已删除旧的 review_site 目录${NC}" +else + echo -e "${YELLOW}⚠ review_site 目录不存在${NC}" +fi +echo "" + +# 4. 重新初始化 +echo -e "${YELLOW}[4/5] 重新初始化 Gerrit...${NC}" +cd ${GERRIT_HOME} + +if [ ! -f "gerrit-${GERRIT_VERSION}.war" ]; then + echo -e "${RED}错误: 未找到 gerrit-${GERRIT_VERSION}.war${NC}" + exit 1 +fi + +echo " 正在初始化(这可能需要几分钟)..." +$JAVA_HOME/bin/java -jar gerrit-${GERRIT_VERSION}.war init \ + -d review_site \ + --batch \ + --no-auto-start \ + -D gerrit.canonicalWebUrl=http://${SERVER_IP}:${GERRIT_PORT}/ \ + --install-plugin=download-commands \ + --install-plugin=replication \ + --install-plugin=reviewnotes 2>&1 | tail -20 + +if [ $? -eq 0 ]; then + echo -e "${GREEN}✓ 初始化完成${NC}" +else + echo -e "${YELLOW}⚠ 初始化过程中可能有警告,但可能已成功完成${NC}" +fi +echo "" + +# 5. 配置 Gerrit +echo -e "${YELLOW}[5/5] 配置 Gerrit...${NC}" +cd ${GERRIT_HOME} + +# 创建配置文件 +cat > review_site/etc/gerrit.config << EOCONFIG +[gerrit] + basePath = git + canonicalWebUrl = http://${SERVER_IP}:${GERRIT_PORT}/ + serverId = $(uuidgen 2>/dev/null || echo $(date +%s)) +[database] + type = h2 + database = db/ReviewDB +[auth] + type = DEVELOPMENT_BECOME_ANY_ACCOUNT + gitBasicAuth = true +[sshd] + listenAddress = *:${GERRIT_SSH_PORT} +[httpd] + listenUrl = http://*:${GERRIT_PORT}/ + cookieSecure = false + cookieSameSite = LAX + cookiePath = / +[cache] + directory = cache +[index] + type = LUCENE +[receive] + enableSignedPush = false +EOCONFIG + +echo -e "${GREEN}✓ 配置完成${NC}" +echo "" + +# 6. 配置使用 Java 17 启动 +echo -e "${YELLOW}配置启动脚本...${NC}" +cd ${GERRIT_HOME}/review_site + +if [ -f "bin/gerrit.sh" ]; then + cp bin/gerrit.sh bin/gerrit.sh.bak + sed -i "2i export JAVA_HOME=${JAVA17_HOME}\nexport PATH=\$JAVA_HOME/bin:\$PATH" bin/gerrit.sh + echo -e "${GREEN}✓ 已更新 gerrit.sh 使用 Java 17${NC}" +fi +echo "" + +# 7. 启动服务 +echo -e "${YELLOW}启动 Gerrit 服务...${NC}" +cd ${GERRIT_HOME}/review_site + +bin/gerrit.sh start + +sleep 5 + +# 检查服务状态 +if bin/gerrit.sh status 2>&1 | grep -q "Gerrit running\|Running"; then + echo -e "${GREEN}✓ 服务启动成功${NC}" +else + echo -e "${YELLOW}⚠ 服务可能未完全启动,请检查日志${NC}" +fi +echo "" + +# 输出信息 +echo -e "${GREEN}========================================${NC}" +echo -e "${GREEN}重新初始化完成!${NC}" +echo -e "${GREEN}========================================${NC}" +echo "" +echo -e "${YELLOW}重要提示:${NC}" +echo -e " 1. 第一个登录的用户将自动成为管理员" +echo -e " 2. 请清除浏览器 Cookie 和缓存" +echo -e " 3. 访问: http://${SERVER_IP}:${GERRIT_PORT}" +echo -e " 4. 点击 'Sign In',输入用户名(例如:admin)" +echo -e " 5. 第一个登录的用户将自动成为管理员" +echo "" +echo -e "${YELLOW}访问信息:${NC}" +echo -e " Web 界面: http://${SERVER_IP}:${GERRIT_PORT}" +echo -e " SSH 端口: ${GERRIT_SSH_PORT}" +echo "" +echo -e "${YELLOW}备份位置:${NC}" +echo -e " ${BACKUP_DIR}" +echo "" +echo -e "${YELLOW}常用命令:${NC}" +echo -e " 查看状态: cd ${GERRIT_HOME}/review_site && bin/gerrit.sh status" +echo -e " 查看日志: tail -f ${GERRIT_HOME}/review_site/logs/error_log" +echo -e " 停止服务: cd ${GERRIT_HOME}/review_site && bin/gerrit.sh stop" +echo -e " 重启服务: cd ${GERRIT_HOME}/review_site && bin/gerrit.sh restart" +echo "" +echo -e "${GREEN}========================================${NC}" + diff --git a/reinstall_gerrit.py b/reinstall_gerrit.py new file mode 100644 index 0000000..1578964 --- /dev/null +++ b/reinstall_gerrit.py @@ -0,0 +1,88 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import os +import subprocess +import sys +import time + +def run_cmd(cmd, check=True): + """执行命令""" + print(f"执行: {cmd}") + try: + result = subprocess.run(cmd, shell=True, check=check, capture_output=True, text=True) + if result.stdout: + print(result.stdout) + return result.returncode == 0 + except Exception as e: + print(f"错误: {e}") + return False + +def main(): + print("=" * 50) + print("Gerrit 完全重新安装") + print("=" * 50) + print() + + gerrit_home = "/home/renjianbo/gerrit_install" + java_home = "/usr/local/java/jdk-17.0.12+7" + + # 1. 停止服务 + print("[1/6] 停止服务...") + os.chdir(f"{gerrit_home}/review_site") + run_cmd("bin/gerrit.sh stop", check=False) + time.sleep(2) + run_cmd("pkill -9 -f gerrit.war", check=False) + print("✓ 服务已停止\n") + + # 2. 删除旧安装 + print("[2/6] 删除旧安装...") + os.chdir(gerrit_home) + run_cmd("rm -rf review_site", check=False) + print("✓ 已删除\n") + + # 3. 检查 war 文件 + print("[3/6] 检查安装包...") + if not os.path.exists(f"{gerrit_home}/gerrit-3.9.0.war"): + print("下载 Gerrit...") + run_cmd(f"cd {gerrit_home} && wget -q https://gerrit-releases.storage.googleapis.com/gerrit-3.9.0.war") + print("✓ 安装包就绪\n") + + # 4. 重新初始化 + print("[4/6] 重新初始化...") + os.chdir(gerrit_home) + env = os.environ.copy() + env['JAVA_HOME'] = java_home + env['PATH'] = f"{java_home}/bin:{env.get('PATH', '')}" + + cmd = f"{java_home}/bin/java -jar gerrit-3.9.0.war init -d review_site --batch --no-auto-start -D gerrit.canonicalWebUrl=http://101.43.95.130:8080/ --install-plugin=download-commands --install-plugin=replication --install-plugin=reviewnotes" + run_cmd(cmd) + print("✓ 初始化完成\n") + + # 5. 配置启动脚本 + print("[5/6] 配置启动脚本...") + os.chdir(f"{gerrit_home}/review_site") + run_cmd("cp bin/gerrit.sh bin/gerrit.sh.bak", check=False) + with open("bin/gerrit.sh", "r") as f: + content = f.read() + new_content = f"#!/bin/bash\nexport JAVA_HOME={java_home}\nexport PATH=$JAVA_HOME/bin:$PATH\n" + content.split("\n", 1)[1] if "\n" in content else content + with open("bin/gerrit.sh", "w") as f: + f.write(new_content) + print("✓ 配置完成\n") + + # 6. 启动服务 + print("[6/6] 启动服务...") + run_cmd("bin/gerrit.sh start") + time.sleep(5) + run_cmd("bin/gerrit.sh status") + print("✓ 服务已启动\n") + + print("=" * 50) + print("安装完成!") + print("=" * 50) + print("\n访问地址: http://101.43.95.130:8080") + print("第一个登录的用户将自动成为管理员") + +if __name__ == "__main__": + main() + diff --git a/reinstall_gerrit.sh b/reinstall_gerrit.sh new file mode 100755 index 0000000..4322649 --- /dev/null +++ b/reinstall_gerrit.sh @@ -0,0 +1,208 @@ +#!/bin/bash + +# Gerrit 重新安装脚本 +# 用于完全清理并重新安装 Gerrit + +set -e + +# 颜色输出 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# 配置变量 +GERRIT_HOME="/home/renjianbo/gerrit_install" +GERRIT_VERSION="3.5.0.1" +GERRIT_PORT="8080" +GERRIT_SSH_PORT="29418" +SERVER_IP="101.43.95.130" + +echo -e "${GREEN}========================================${NC}" +echo -e "${GREEN}Gerrit 重新安装脚本${NC}" +echo -e "${GREEN}========================================${NC}" +echo "" + +# 1. 停止现有服务 +echo -e "${YELLOW}[1/6] 停止现有 Gerrit 服务...${NC}" +if [ -d "${GERRIT_HOME}/review_site" ]; then + cd ${GERRIT_HOME}/review_site + if [ -f "bin/gerrit.sh" ]; then + bin/gerrit.sh stop 2>/dev/null || true + sleep 2 + fi +fi +echo -e "${GREEN}✓ 服务已停止${NC}" +echo "" + +# 2. 备份现有数据(可选) +echo -e "${YELLOW}[2/6] 备份现有数据...${NC}" +BACKUP_DIR="${GERRIT_HOME}/backup_$(date +%Y%m%d_%H%M%S)" +mkdir -p ${BACKUP_DIR} + +if [ -d "${GERRIT_HOME}/review_site" ]; then + # 备份 Git 仓库 + if [ -d "${GERRIT_HOME}/review_site/git" ]; then + echo " 备份 Git 仓库..." + cp -r ${GERRIT_HOME}/review_site/git ${BACKUP_DIR}/ 2>/dev/null || true + fi + + # 备份数据库 + if [ -d "${GERRIT_HOME}/review_site/db" ]; then + echo " 备份数据库..." + cp -r ${GERRIT_HOME}/review_site/db ${BACKUP_DIR}/ 2>/dev/null || true + fi + + # 备份配置 + if [ -d "${GERRIT_HOME}/review_site/etc" ]; then + echo " 备份配置文件..." + cp -r ${GERRIT_HOME}/review_site/etc ${BACKUP_DIR}/ 2>/dev/null || true + fi +fi + +echo -e "${GREEN}✓ 数据已备份到: ${BACKUP_DIR}${NC}" +echo "" + +# 3. 清理旧安装 +echo -e "${YELLOW}[3/6] 清理旧安装...${NC}" +if [ -d "${GERRIT_HOME}/review_site" ]; then + rm -rf ${GERRIT_HOME}/review_site + echo " 已删除旧的 review_site 目录" +fi +echo -e "${GREEN}✓ 清理完成${NC}" +echo "" + +# 4. 检查并下载 Gerrit +echo -e "${YELLOW}[4/6] 检查 Gerrit 安装包...${NC}" +cd ${GERRIT_HOME} + +if [ ! -f "gerrit-${GERRIT_VERSION}.war" ]; then + echo " 下载 Gerrit ${GERRIT_VERSION}..." + wget -q --show-progress https://gerrit-releases.storage.googleapis.com/gerrit-${GERRIT_VERSION}.war +else + echo " Gerrit ${GERRIT_VERSION} 已存在,跳过下载" +fi +echo -e "${GREEN}✓ Gerrit 安装包就绪${NC}" +echo "" + +# 5. 重新初始化 Gerrit +echo -e "${YELLOW}[5/6] 初始化 Gerrit...${NC}" +cd ${GERRIT_HOME} + +# 检查 Java 版本并使用 Java 17(优先)或 Java 11 +JAVA17_HOME="/usr/local/java/jdk-17.0.12+7" +JAVA11_HOME="/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64" + +if [ -d "$JAVA17_HOME" ]; then + export JAVA_HOME=$JAVA17_HOME + export PATH=$JAVA_HOME/bin:$PATH + echo " 使用 Java 17: $JAVA_HOME" + $JAVA_HOME/bin/java -version 2>&1 | head -1 +elif [ -d "$JAVA11_HOME" ]; then + export JAVA_HOME=$JAVA11_HOME + export PATH=$JAVA_HOME/bin:$PATH + echo " 使用 Java 11: $JAVA_HOME" + $JAVA_HOME/bin/java -version 2>&1 | head -1 +else + # 检查默认 Java 版本 + JAVA_VERSION=$(java -version 2>&1 | head -1 | cut -d'"' -f2 | sed '/^1\./s///' | cut -d'.' -f1) + if [ "$JAVA_VERSION" -lt 11 ]; then + echo -e "${RED}错误: 需要 Java 11 或更高版本,当前版本: $JAVA_VERSION${NC}" + echo "请先安装 Java 11 或 Java 17" + exit 1 + fi +fi + +# 非交互式初始化 +echo " 正在初始化(这可能需要几分钟)..." +$JAVA_HOME/bin/java -jar gerrit-${GERRIT_VERSION}.war init \ + -d review_site \ + --batch \ + --no-auto-start \ + --install-plugin=download-commands \ + --install-plugin=replication \ + --install-plugin=reviewnotes || true + +echo -e "${GREEN}✓ 初始化完成${NC}" +echo "" + +# 6. 配置 Gerrit +echo -e "${YELLOW}[6/6] 配置 Gerrit...${NC}" +cd ${GERRIT_HOME} + +# 创建配置文件(使用正确的 IP 和 Cookie 设置) +cat > review_site/etc/gerrit.config << EOCONFIG +[gerrit] + basePath = git + canonicalWebUrl = http://${SERVER_IP}:${GERRIT_PORT}/ + serverId = $(uuidgen 2>/dev/null || echo $(date +%s)) +[database] + type = h2 + database = db/ReviewDB +[auth] + type = DEVELOPMENT_BECOME_ANY_ACCOUNT +[sshd] + listenAddress = *:${GERRIT_SSH_PORT} +[httpd] + listenUrl = http://*:${GERRIT_PORT}/ + cookieSecure = false + cookieSameSite = LAX +[cache] + directory = cache +[index] + type = LUCENE +[receive] + enableSignedPush = false +EOCONFIG + +echo -e "${GREEN}✓ 配置完成${NC}" +echo "" + +# 7. 启动服务 +echo -e "${YELLOW}启动 Gerrit 服务...${NC}" +cd ${GERRIT_HOME}/review_site + +# 使用 Java 17 启动(如果可用),否则使用 Java 11 +if [ -d "/usr/local/java/jdk-17.0.12+7" ]; then + JAVA_HOME=/usr/local/java/jdk-17.0.12+7 bin/gerrit.sh start +elif [ -d "/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64" ]; then + JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64 bin/gerrit.sh start +else + bin/gerrit.sh start +fi + +sleep 5 + +# 检查服务状态 +if bin/gerrit.sh status | grep -q "Gerrit running"; then + echo -e "${GREEN}✓ 服务启动成功${NC}" +else + echo -e "${YELLOW}⚠ 服务可能未完全启动,请检查日志${NC}" +fi + +echo "" +echo -e "${GREEN}========================================${NC}" +echo -e "${GREEN}重新安装完成!${NC}" +echo -e "${GREEN}========================================${NC}" +echo "" +echo -e "${YELLOW}访问信息:${NC}" +echo -e " Web 界面: http://${SERVER_IP}:${GERRIT_PORT}" +echo -e " SSH 端口: ${GERRIT_SSH_PORT}" +echo "" +echo -e "${YELLOW}首次登录:${NC}" +echo -e " 1. 访问 http://${SERVER_IP}:${GERRIT_PORT}" +echo -e " 2. 点击 'Sign In'" +echo -e " 3. 点击 'New Account' 注册新账户" +echo -e " 4. 第一个注册的用户将自动成为管理员" +echo "" +echo -e "${YELLOW}备份位置:${NC}" +echo -e " ${BACKUP_DIR}" +echo "" +echo -e "${YELLOW}常用命令:${NC}" +echo -e " 查看状态: cd ${GERRIT_HOME}/review_site && bin/gerrit.sh status" +echo -e " 查看日志: tail -f ${GERRIT_HOME}/review_site/logs/httpd_log" +echo -e " 停止服务: cd ${GERRIT_HOME}/review_site && bin/gerrit.sh stop" +echo -e " 重启服务: cd ${GERRIT_HOME}/review_site && bin/gerrit.sh restart" +echo "" +echo -e "${GREEN}========================================${NC}" + diff --git a/test_cookie.html b/test_cookie.html new file mode 100644 index 0000000..d764be2 --- /dev/null +++ b/test_cookie.html @@ -0,0 +1,46 @@ + + + + Gerrit Cookie 测试 + + + +

Gerrit Cookie 测试页面

+

这个页面用于测试浏览器是否能正确保存 Cookie。

+ +

测试步骤:

+
    +
  1. 打开浏览器开发者工具(F12)
  2. +
  3. 切换到 Application 标签
  4. +
  5. 查看 Cookies → http://101.43.95.130:8080
  6. +
  7. 点击下面的按钮测试 Cookie
  8. +
+ + +
+ + + +
+

Gerrit 登录链接:

+

点击这里使用 Account ID 1000000 登录

+ + + diff --git a/upgrade_gerrit.sh b/upgrade_gerrit.sh new file mode 100755 index 0000000..ce6d78c --- /dev/null +++ b/upgrade_gerrit.sh @@ -0,0 +1,260 @@ +#!/bin/bash + +# Gerrit 升级脚本 +# 将 Gerrit 升级到最新版本(支持 JDK 17) + +set -e + +# 颜色输出 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# 配置变量 +GERRIT_HOME="/home/renjianbo/gerrit_install" +GERRIT_VERSION="3.5.0.1" +GERRIT_PORT="8080" +GERRIT_SSH_PORT="29418" +SERVER_IP="101.43.95.130" + +# JDK 17 路径 +JAVA17_HOME="/usr/local/java/jdk-17.0.12+7" +if [ ! -d "$JAVA17_HOME" ]; then + # 尝试其他可能的位置 + JAVA17_HOME="/opt/java17" + if [ ! -d "$JAVA17_HOME" ]; then + echo -e "${RED}错误: 未找到 JDK 17${NC}" + echo "请先安装 JDK 17 或修改脚本中的 JAVA17_HOME 路径" + exit 1 + fi +fi + +export JAVA_HOME=$JAVA17_HOME +export PATH=$JAVA_HOME/bin:$PATH + +echo -e "${GREEN}========================================${NC}" +echo -e "${GREEN}Gerrit 升级脚本${NC}" +echo -e "${GREEN}目标版本: ${GERRIT_VERSION}${NC}" +echo -e "${GREEN}使用 JDK: ${JAVA_HOME}${NC}" +echo -e "${GREEN}========================================${NC}" +echo "" + +# 验证 Java 17 +echo -e "${YELLOW}[1/7] 验证 Java 17 安装...${NC}" +$JAVA_HOME/bin/java -version 2>&1 | head -1 +if ! $JAVA_HOME/bin/java -version 2>&1 | grep -q "17"; then + echo -e "${RED}错误: 指定的 Java 不是版本 17${NC}" + exit 1 +fi +echo -e "${GREEN}✓ Java 17 验证通过${NC}" +echo "" + +# 1. 停止现有服务 +echo -e "${YELLOW}[2/7] 停止现有 Gerrit 服务...${NC}" +if [ -d "${GERRIT_HOME}/review_site" ]; then + cd ${GERRIT_HOME}/review_site + if [ -f "bin/gerrit.sh" ]; then + bin/gerrit.sh stop 2>/dev/null || true + sleep 3 + echo -e "${GREEN}✓ 服务已停止${NC}" + else + echo -e "${YELLOW}⚠ Gerrit 服务脚本不存在,可能未运行${NC}" + fi +else + echo -e "${YELLOW}⚠ review_site 目录不存在,将进行全新安装${NC}" +fi +echo "" + +# 2. 备份现有数据 +echo -e "${YELLOW}[3/7] 备份现有数据...${NC}" +BACKUP_DIR="${GERRIT_HOME}/backup_$(date +%Y%m%d_%H%M%S)" +mkdir -p ${BACKUP_DIR} + +if [ -d "${GERRIT_HOME}/review_site" ]; then + # 备份 Git 仓库 + if [ -d "${GERRIT_HOME}/review_site/git" ]; then + echo " 备份 Git 仓库..." + cp -r ${GERRIT_HOME}/review_site/git ${BACKUP_DIR}/ 2>/dev/null || true + fi + + # 备份数据库 + if [ -d "${GERRIT_HOME}/review_site/db" ]; then + echo " 备份数据库..." + cp -r ${GERRIT_HOME}/review_site/db ${BACKUP_DIR}/ 2>/dev/null || true + fi + + # 备份配置 + if [ -d "${GERRIT_HOME}/review_site/etc" ]; then + echo " 备份配置文件..." + cp -r ${GERRIT_HOME}/review_site/etc ${BACKUP_DIR}/ 2>/dev/null || true + fi + + # 备份插件 + if [ -d "${GERRIT_HOME}/review_site/plugins" ]; then + echo " 备份插件..." + cp -r ${GERRIT_HOME}/review_site/plugins ${BACKUP_DIR}/ 2>/dev/null || true + fi + + echo -e "${GREEN}✓ 数据已备份到: ${BACKUP_DIR}${NC}" +else + echo -e "${YELLOW}⚠ 没有现有数据需要备份${NC}" +fi +echo "" + +# 3. 下载新版本 Gerrit +echo -e "${YELLOW}[4/7] 下载 Gerrit ${GERRIT_VERSION}...${NC}" +cd ${GERRIT_HOME} + +if [ ! -f "gerrit-${GERRIT_VERSION}.war" ]; then + echo " 正在下载 Gerrit ${GERRIT_VERSION}..." + wget -q https://gerrit-releases.storage.googleapis.com/gerrit-${GERRIT_VERSION}.war + if [ $? -ne 0 ]; then + echo -e "${RED}下载失败,请检查网络连接${NC}" + exit 1 + fi + echo -e "${GREEN}✓ 下载完成${NC}" +else + echo -e "${GREEN}✓ Gerrit ${GERRIT_VERSION} 已存在,跳过下载${NC}" +fi +echo "" + +# 4. 升级 Gerrit(如果已存在) +if [ -d "${GERRIT_HOME}/review_site" ]; then + echo -e "${YELLOW}[5/7] 升级 Gerrit...${NC}" + cd ${GERRIT_HOME} + + echo " 正在升级(这可能需要几分钟)..." + $JAVA_HOME/bin/java -jar gerrit-${GERRIT_VERSION}.war init \ + -d review_site \ + --batch \ + --no-auto-start \ + --install-plugin=download-commands \ + --install-plugin=replication \ + --install-plugin=reviewnotes 2>&1 | tail -20 + + if [ $? -eq 0 ]; then + echo -e "${GREEN}✓ 升级完成${NC}" + else + echo -e "${YELLOW}⚠ 升级过程中可能有警告,但可能已成功完成${NC}" + fi +else + echo -e "${YELLOW}[5/7] 初始化 Gerrit(全新安装)...${NC}" + cd ${GERRIT_HOME} + + echo " 正在初始化(这可能需要几分钟)..." + $JAVA_HOME/bin/java -jar gerrit-${GERRIT_VERSION}.war init \ + -d review_site \ + --batch \ + --no-auto-start \ + -D gerrit.canonicalWebUrl=http://${SERVER_IP}:${GERRIT_PORT}/ \ + --install-plugin=download-commands \ + --install-plugin=replication \ + --install-plugin=reviewnotes 2>&1 | tail -20 + + if [ $? -eq 0 ]; then + echo -e "${GREEN}✓ 初始化完成${NC}" + else + echo -e "${YELLOW}⚠ 初始化过程中可能有警告,但可能已成功完成${NC}" + fi +fi +echo "" + +# 5. 配置 Gerrit +echo -e "${YELLOW}[6/7] 配置 Gerrit...${NC}" +cd ${GERRIT_HOME} + +# 如果配置文件不存在,创建它 +if [ ! -f "review_site/etc/gerrit.config" ]; then + cat > review_site/etc/gerrit.config << EOCONFIG +[gerrit] + basePath = git + canonicalWebUrl = http://${SERVER_IP}:${GERRIT_PORT}/ + serverId = $(uuidgen 2>/dev/null || echo $(date +%s)) +[database] + type = h2 + database = db/ReviewDB +[auth] + type = DEVELOPMENT_BECOME_ANY_ACCOUNT + gitBasicAuth = true +[sshd] + listenAddress = *:${GERRIT_SSH_PORT} +[httpd] + listenUrl = http://*:${GERRIT_PORT}/ + cookieSecure = false + cookieSameSite = LAX + cookiePath = / +[cache] + directory = cache +[index] + type = LUCENE +[receive] + enableSignedPush = false +EOCONFIG + echo -e "${GREEN}✓ 配置文件已创建${NC}" +else + # 更新现有配置(保留用户自定义设置) + echo -e "${GREEN}✓ 使用现有配置文件${NC}" +fi +echo "" + +# 6. 启动服务 +echo -e "${YELLOW}[7/7] 启动 Gerrit 服务...${NC}" +cd ${GERRIT_HOME}/review_site + +# 确保使用 Java 17 +export JAVA_HOME=$JAVA17_HOME +export PATH=$JAVA_HOME/bin:$PATH + +# 更新 gerrit.sh 脚本以使用 Java 17(如果存在) +if [ -f "bin/gerrit.sh" ]; then + # 备份原脚本 + cp bin/gerrit.sh bin/gerrit.sh.bak + + # 在脚本开头添加 JAVA_HOME 设置(如果还没有) + if ! grep -q "JAVA_HOME.*jdk-17" bin/gerrit.sh; then + sed -i "2i export JAVA_HOME=${JAVA17_HOME}" bin/gerrit.sh + sed -i "3i export PATH=\$JAVA_HOME/bin:\$PATH" bin/gerrit.sh + fi +fi + +# 启动服务 +bin/gerrit.sh start + +sleep 5 + +# 检查服务状态 +if bin/gerrit.sh status 2>&1 | grep -q "Gerrit running\|Running"; then + echo -e "${GREEN}✓ 服务启动成功${NC}" +else + echo -e "${YELLOW}⚠ 服务可能未完全启动,请检查日志${NC}" + echo -e "${YELLOW}查看日志: tail -f ${GERRIT_HOME}/review_site/logs/error_log${NC}" +fi +echo "" + +# 输出信息 +echo -e "${GREEN}========================================${NC}" +echo -e "${GREEN}升级完成!${NC}" +echo -e "${GREEN}========================================${NC}" +echo "" +echo -e "${YELLOW}版本信息:${NC}" +echo -e " Gerrit 版本: ${GERRIT_VERSION}" +echo -e " Java 版本: $($JAVA_HOME/bin/java -version 2>&1 | head -1)" +echo "" +echo -e "${YELLOW}访问信息:${NC}" +echo -e " Web 界面: http://${SERVER_IP}:${GERRIT_PORT}" +echo -e " SSH 端口: ${GERRIT_SSH_PORT}" +echo "" +echo -e "${YELLOW}备份位置:${NC}" +if [ -d "${BACKUP_DIR}" ]; then + echo -e " ${BACKUP_DIR}" +fi +echo "" +echo -e "${YELLOW}常用命令:${NC}" +echo -e " 查看状态: cd ${GERRIT_HOME}/review_site && bin/gerrit.sh status" +echo -e " 查看日志: tail -f ${GERRIT_HOME}/review_site/logs/error_log" +echo -e " 停止服务: cd ${GERRIT_HOME}/review_site && bin/gerrit.sh stop" +echo -e " 重启服务: cd ${GERRIT_HOME}/review_site && bin/gerrit.sh restart" +echo "" +echo -e "${GREEN}========================================${NC}" + diff --git a/一键重新安装.sh b/一键重新安装.sh new file mode 100644 index 0000000..aa0cec8 --- /dev/null +++ b/一键重新安装.sh @@ -0,0 +1,3 @@ +#!/bin/bash +cd /home/renjianbo/gerrit_install/review_site && bin/gerrit.sh stop 2>/dev/null; pkill -9 -f gerrit.war 2>/dev/null; cd /home/renjianbo/gerrit_install && rm -rf review_site && export JAVA_HOME=/usr/local/java/jdk-17.0.12+7 && export PATH=$JAVA_HOME/bin:$PATH && java -jar gerrit-3.9.0.war init -d review_site --batch --no-auto-start -D gerrit.canonicalWebUrl=http://101.43.95.130:8080/ --install-plugin=download-commands --install-plugin=replication --install-plugin=reviewnotes && cd review_site && cp bin/gerrit.sh bin/gerrit.sh.bak && sed -i "2i export JAVA_HOME=/usr/local/java/jdk-17.0.12+7\nexport PATH=\$JAVA_HOME/bin:\$PATH" bin/gerrit.sh && bin/gerrit.sh start && sleep 5 && echo "完成!访问 http://101.43.95.130:8080" + diff --git a/上传本地项目到Gerrit指南.md b/上传本地项目到Gerrit指南.md new file mode 100644 index 0000000..40cb9c1 --- /dev/null +++ b/上传本地项目到Gerrit指南.md @@ -0,0 +1,272 @@ +# 将本地项目上传到 Gerrit 指南 + +## 前提条件 + +1. ✅ Gerrit 已安装并运行:`http://101.43.95.130:8080` +2. ✅ 已在 Gerrit 创建项目:`zhini_im` +3. ✅ 本地已安装 Git + +## 方法一:已有 Git 仓库(推荐) + +如果 `D:\zhini\zhini_im` 已经是 Git 仓库: + +### 步骤 1:打开 Git Bash 或命令行 + +在 Windows 上: +- 打开 Git Bash(如果安装了 Git for Windows) +- 或者打开 PowerShell/CMD + +### 步骤 2:进入项目目录 + +```bash +cd /d/zhini/zhini_im +# 或 +cd D:\zhini\zhini_im +``` + +### 步骤 3:添加 Gerrit 远程仓库 + +```bash +# 添加 Gerrit 作为远程仓库 +git remote add gerrit http://101.43.95.130:8080/zhini_im +# 或使用 SSH(如果配置了 SSH 密钥) +git remote add gerrit ssh://admin@101.43.95.130:29418/zhini_im +``` + +### 步骤 4:推送代码到 Gerrit + +```bash +# 推送主分支 +git push gerrit HEAD:refs/heads/master + +# 或者推送所有分支 +git push gerrit --all +``` + +## 方法二:首次上传(创建初始提交) + +如果项目还没有 Git 仓库: + +### 步骤 1:初始化 Git 仓库 + +```bash +cd D:\zhini\zhini_im +git init +``` + +### 步骤 2:添加所有文件 + +```bash +git add . +``` + +### 步骤 3:创建初始提交 + +```bash +git commit -m "Initial commit" +``` + +### 步骤 4:配置 Git 用户信息(如果还没配置) + +```bash +git config user.name "admin" +git config user.email "admin@example.com" +``` + +### 步骤 5:添加 Gerrit 远程仓库 + +```bash +git remote add gerrit http://101.43.95.130:8080/zhini_im +``` + +### 步骤 6:推送代码 + +```bash +git push gerrit HEAD:refs/heads/master +``` + +## 方法三:通过代码评审推送(推荐用于后续更新) + +### 步骤 1:配置 Git 远程仓库 + +```bash +cd D:\zhini\zhini_im +git remote add gerrit http://101.43.95.130:8080/zhini_im +``` + +### 步骤 2:推送代码进行评审 + +```bash +# 推送当前分支到评审队列 +git push gerrit HEAD:refs/for/master + +# 如果需要指定主题 +git push gerrit HEAD:refs/for/master%topic=feature-name +``` + +### 步骤 3:在 Gerrit Web 界面进行评审 + +1. 访问:`http://101.43.95.130:8080` +2. 在 "Outgoing reviews" 中查看您的变更 +3. 等待评审或自己评审后合并 + +## 详细操作步骤(Windows) + +### 1. 打开 Git Bash + +- 在项目目录 `D:\zhini\zhini_im` 右键 +- 选择 "Git Bash Here" + +### 2. 检查是否已有 Git 仓库 + +```bash +# 检查是否有 .git 目录 +ls -la | grep .git +``` + +### 3. 如果没有 Git 仓库,初始化 + +```bash +git init +git add . +git commit -m "Initial commit" +``` + +### 4. 配置 Git 用户信息 + +```bash +git config user.name "admin" +git config user.email "admin@example.com" + +# 或全局配置 +git config --global user.name "admin" +git config --global user.email "admin@example.com" +``` + +### 5. 添加 Gerrit 远程仓库 + +```bash +# 使用 HTTP(推荐,简单) +git remote add gerrit http://101.43.95.130:8080/zhini_im + +# 或使用 SSH(需要配置 SSH 密钥) +git remote add gerrit ssh://admin@101.43.95.130:29418/zhini_im +``` + +### 6. 推送代码 + +```bash +# 直接推送到主分支(首次上传) +git push gerrit HEAD:refs/heads/master + +# 或推送到评审队列(后续更新,推荐) +git push gerrit HEAD:refs/for/master +``` + +## 常见问题 + +### Q: 推送时提示需要认证? + +**A:** 在开发模式下,HTTP 推送可能不需要密码,但如果需要: +- 用户名:您注册时使用的用户名(例如:`admin`) +- 密码:留空(开发模式不需要密码) + +### Q: 推送失败,提示 "remote rejected"? + +**A:** 可能的原因: +1. 项目不存在 → 先在 Gerrit 创建项目 +2. 没有推送权限 → 检查项目权限配置 +3. 分支保护 → 使用 `refs/for/master` 推送到评审队列 + +### Q: 如何查看远程仓库? + +```bash +git remote -v +``` + +### Q: 如何更新远程仓库地址? + +```bash +# 删除旧的 +git remote remove gerrit + +# 添加新的 +git remote add gerrit http://101.43.95.130:8080/zhini_im +``` + +## 推送方式对比 + +### 直接推送(`refs/heads/master`) +- ✅ 直接更新主分支 +- ❌ 跳过代码评审流程 +- 适用于:首次上传、管理员直接合并 + +### 评审推送(`refs/for/master`) +- ✅ 进入代码评审流程 +- ✅ 需要评审后才能合并 +- ✅ 符合 Gerrit 工作流程 +- 推荐用于:日常开发、团队协作 + +## 完整示例 + +```bash +# 1. 进入项目目录 +cd D:\zhini\zhini_im + +# 2. 初始化 Git(如果还没有) +git init +git add . +git commit -m "Initial commit" + +# 3. 配置用户信息 +git config user.name "admin" +git config user.email "admin@example.com" + +# 4. 添加 Gerrit 远程仓库 +git remote add gerrit http://101.43.95.130:8080/zhini_im + +# 5. 推送代码(首次上传) +git push gerrit HEAD:refs/heads/master + +# 6. 后续更新(推送到评审队列) +git add . +git commit -m "Update code" +git push gerrit HEAD:refs/for/master +``` + +## 验证上传 + +推送成功后: + +1. 访问:`http://101.43.95.130:8080/#/admin/projects/zhini_im` +2. 应该能看到项目信息 +3. 访问:`http://101.43.95.130:8080/#/q/project:zhini_im` +4. 应该能看到您的变更 + +## 后续操作 + +### 克隆项目(其他团队成员) + +```bash +# 使用 HTTP +git clone http://101.43.95.130:8080/zhini_im + +# 或使用 SSH +git clone ssh://admin@101.43.95.130:29418/zhini_im +``` + +### 日常开发流程 + +```bash +# 1. 修改代码 +# 2. 提交更改 +git add . +git commit -m "描述您的更改" + +# 3. 推送到评审队列 +git push gerrit HEAD:refs/for/master + +# 4. 在 Gerrit Web 界面进行评审 +# 5. 评审通过后,代码会自动合并 +``` + diff --git a/从码云推送到Gerrit指南.md b/从码云推送到Gerrit指南.md new file mode 100644 index 0000000..6e70ef2 --- /dev/null +++ b/从码云推送到Gerrit指南.md @@ -0,0 +1,257 @@ +# 从码云推送到 Gerrit 操作指南 + +## 📋 前提条件 + +- ✅ 已从码云(Gitee)拉取最新代码 +- ✅ 代码仓库在本地已存在 +- ✅ Gerrit 服务器地址:`101.43.95.130:8080` +- ✅ SSH 端口:`29418` +- ✅ 用户名:`renjianbo` + +--- + +## 🚀 操作步骤 + +### 步骤 1:进入代码仓库目录 + +```bash +# 根据您的实际路径,进入代码目录 +cd /d/zhini/zhini_im +# 或者 +cd /path/to/your/project +``` + +### 步骤 2:检查当前 Git 状态 + +```bash +# 查看当前分支和状态 +git status + +# 查看远程仓库配置 +git remote -v +``` + +### 步骤 3:添加 Gerrit 远程仓库 + +**如果还没有配置 Gerrit 远程仓库**: + +```bash +# 方式一:添加为新的远程仓库(推荐,保留码云远程) +git remote add gerrit ssh://renjianbo@101.43.95.130:29418/项目名称 + +# 方式二:替换 origin 为 Gerrit(会替换掉码云的远程) +# git remote set-url origin ssh://renjianbo@101.43.95.130:29418/项目名称 +``` + +**注意**:请将 `项目名称` 替换为 Gerrit 中的实际项目名称。 + +**如果使用 HTTP(不推荐,但可以作为备选)**: + +```bash +git remote add gerrit http://renjianbo@101.43.95.130:8080/项目名称 +``` + +### 步骤 4:安装 commit-msg Hook(重要!) + +Gerrit 需要 Change-Id,必须安装 hook: + +```bash +# 下载 commit-msg hook +mkdir -p .git/hooks +curl -o .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg +chmod +x .git/hooks/commit-msg +``` + +### 步骤 5:检查是否有未提交的更改 + +```bash +# 查看工作区状态 +git status + +# 如果有未提交的更改,需要先提交 +git add . +git commit -m "从码云同步代码" +``` + +### 步骤 6:推送到 Gerrit + +**推送到评审队列(推荐)**: + +```bash +# 推送到 master 分支的评审队列 +git push gerrit HEAD:refs/for/master + +# 如果替换了 origin,使用: +# git push origin HEAD:refs/for/master +``` + +**推送到其他分支**: + +```bash +# 推送到 develop 分支的评审队列 +git push gerrit HEAD:refs/for/develop + +# 推送到 feature 分支的评审队列 +git push gerrit HEAD:refs/for/feature/xxx +``` + +### 步骤 7:查看推送结果 + +推送成功后,会显示类似以下信息: + +``` +remote: Resolving deltas: 100% (X/X) +remote: Processing changes: refs: 1, new: 1 +remote: +remote: SUCCESS +remote: +remote: http://101.43.95.130:8080/c/项目名称/+/1 [NEW] +remote: +To ssh://renjianbo@101.43.95.130:29418/项目名称 + * [new branch] HEAD -> refs/for/master +``` + +复制返回的 URL(如:`http://101.43.95.130:8080/c/项目名称/+/1`)在浏览器中打开查看变更。 + +--- + +## 🔧 常见问题处理 + +### 问题 1:找不到项目 + +**错误信息**: +``` +fatal: Could not read from remote repository. +``` + +**解决方法**: +1. 确认项目名称是否正确 +2. 在 Gerrit Web 界面查看项目列表:`http://101.43.95.130:8080/#/admin/projects/` +3. 如果项目不存在,需要先在 Gerrit 中创建项目 + +### 问题 2:SSH 连接失败 + +**错误信息**: +``` +ssh: connect to host 101.43.95.130 port 29418: Connection timed out +``` + +**解决方法**: +1. 检查 SSH 公钥是否已添加到 Gerrit:`http://101.43.95.130:8080/#/settings/ssh-keys` +2. 测试 SSH 连接: + ```bash + ssh -p 29418 renjianbo@101.43.95.130 gerrit version + ``` +3. 如果 SSH 无法使用,可以临时使用 HTTP + +### 问题 3:缺少 Change-Id + +**错误信息**: +``` +remote: ERROR: missing Change-Id in commit message +``` + +**解决方法**: +1. 确保已安装 commit-msg hook(见步骤 4) +2. 如果已安装但仍有问题,重新安装: + ```bash + curl -o .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg + chmod +x .git/hooks/commit-msg + ``` +3. 对于已提交的 commit,使用 `git commit --amend` 重新提交 + +### 问题 4:权限不足 + +**错误信息**: +``` +remote: Permission denied +``` + +**解决方法**: +1. 确认您在 Gerrit 中已注册账户 +2. 确认您有该项目的推送权限 +3. 联系管理员添加权限 + +--- + +## 📝 完整示例 + +假设您的项目名称是 `zhini_im`,完整操作如下: + +```bash +# 1. 进入项目目录 +cd /d/zhini/zhini_im + +# 2. 检查状态 +git status +git remote -v + +# 3. 添加 Gerrit 远程仓库 +git remote add gerrit ssh://renjianbo@101.43.95.130:29418/zhini_im + +# 4. 安装 commit-msg hook +mkdir -p .git/hooks +curl -o .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg +chmod +x .git/hooks/commit-msg + +# 5. 如果有未提交的更改,先提交 +git add . +git commit -m "从码云同步代码到 Gerrit" + +# 6. 推送到 Gerrit +git push gerrit HEAD:refs/for/master +``` + +--- + +## 🎯 快速参考 + +### 常用命令 + +```bash +# 查看远程仓库 +git remote -v + +# 添加 Gerrit 远程仓库 +git remote add gerrit ssh://renjianbo@101.43.95.130:29418/项目名称 + +# 推送到评审队列 +git push gerrit HEAD:refs/for/master + +# 查看变更列表 +# 浏览器访问:http://101.43.95.130:8080/#/q/status:open +``` + +### 查看项目列表 + +```bash +# 通过 SSH +ssh -p 29418 renjianbo@101.43.95.130 gerrit ls-projects + +# 通过 Web 界面 +# 访问:http://101.43.95.130:8080/#/admin/projects/ +``` + +--- + +## ✅ 检查清单 + +在推送前,请确认: + +- [ ] 已进入正确的代码仓库目录 +- [ ] 已添加 Gerrit 远程仓库 +- [ ] 已安装 commit-msg hook +- [ ] 已提交所有更改(或确认没有未提交的更改) +- [ ] 知道目标分支名称(master/develop 等) +- [ ] SSH 公钥已添加到 Gerrit(如果使用 SSH) +- [ ] 项目已在 Gerrit 中创建 + +--- + +## 📞 需要帮助? + +- 📖 查看其他文档:`Gerrit快速使用指南.md` +- 🌐 访问 Gerrit:`http://101.43.95.130:8080` +- 📝 查看变更:`http://101.43.95.130:8080/#/q/status:open` + + diff --git a/修复上传问题指南.md b/修复上传问题指南.md new file mode 100644 index 0000000..36a53e8 --- /dev/null +++ b/修复上传问题指南.md @@ -0,0 +1,197 @@ +# 修复上传问题指南 + +## 问题分析 + +1. **未提交的更改**:`android-chat-master` 子模块有修改 +2. **远程仓库已存在**:需要更新或删除后重新添加 +3. **SSH 主机密钥验证失败**:重新安装 Gerrit 后 SSH 密钥改变了 + +## 解决方案 + +### 方法一:使用 HTTP(推荐,最简单) + +HTTP 方式不需要 SSH 密钥,更简单。 + +#### 步骤 1:处理未提交的更改 + +```bash +# 查看当前状态 +git status + +# 选项 A:提交所有更改 +git add . +git commit -m "Update code before push to Gerrit" + +# 选项 B:如果不想提交子模块的更改,可以暂存 +git stash +``` + +#### 步骤 2:更新远程仓库(使用 HTTP) + +```bash +# 删除旧的远程仓库 +git remote remove gerrit + +# 重新添加(使用 HTTP,不需要 SSH) +git remote add gerrit http://101.43.95.130:8080/zhini_im + +# 验证 +git remote -v +``` + +#### 步骤 3:推送代码 + +```bash +# 切换到主分支(如果需要) +git checkout -b master 2>/dev/null || git checkout master + +# 推送代码 +git push gerrit HEAD:refs/heads/master +``` + +### 方法二:修复 SSH 密钥问题(如果想用 SSH) + +#### 步骤 1:删除旧的 SSH 主机密钥 + +```bash +# 在 Git Bash 中执行 +ssh-keygen -R [101.43.95.130]:29418 + +# 或者手动编辑 known_hosts 文件 +# 删除 /c/Users/Administrator/.ssh/known_hosts 文件中第 4 行 +``` + +#### 步骤 2:重新添加 SSH 主机密钥 + +```bash +# 重新连接并接受新的主机密钥 +ssh -p 29418 admin@101.43.95.130 + +# 输入 yes 接受新的主机密钥 +``` + +#### 步骤 3:更新远程仓库(使用 SSH) + +```bash +# 删除旧的 +git remote remove gerrit + +# 添加 SSH 远程仓库 +git remote add gerrit ssh://admin@101.43.95.130:29418/zhini_im + +# 推送 +git push gerrit HEAD:refs/heads/master +``` + +## 完整操作步骤(推荐使用 HTTP) + +### 在 Git Bash 中执行: + +```bash +# 1. 进入项目目录 +cd /d/zhini/zhini_im + +# 2. 查看当前状态 +git status + +# 3. 处理未提交的更改 +# 选项 A:提交所有更改 +git add . +git commit -m "Update code before push to Gerrit" + +# 或者选项 B:暂存更改(如果不想现在提交) +# git stash + +# 4. 删除旧的远程仓库 +git remote remove gerrit + +# 5. 添加 HTTP 远程仓库(推荐,不需要 SSH) +git remote add gerrit http://101.43.95.130:8080/zhini_im + +# 6. 验证远程仓库 +git remote -v + +# 7. 切换到主分支(如果需要) +git checkout -b master 2>/dev/null || git checkout master + +# 8. 推送代码 +git push gerrit HEAD:refs/heads/master +``` + +## 如果推送时提示需要认证 + +在开发模式下,HTTP 推送通常不需要密码,但如果提示: + +- **用户名**:`admin`(或您注册的用户名) +- **密码**:留空(开发模式不需要密码) + +## 处理子模块问题 + +如果 `android-chat-master` 是子模块,可以: + +### 选项 1:提交子模块更改 + +```bash +cd android-chat-master +git add . +git commit -m "Update submodule" +cd .. +git add android-chat-master +git commit -m "Update submodule reference" +``` + +### 选项 2:忽略子模块更改 + +```bash +# 暂存子模块更改 +git stash + +# 或者重置子模块 +git submodule update --init --recursive +``` + +## 验证推送 + +推送成功后: + +1. 访问:`http://101.43.95.130:8080/#/admin/projects/zhini_im` +2. 应该能看到项目代码 +3. 访问:`http://101.43.95.130:8080/#/q/project:zhini_im` +4. 应该能看到提交历史 + +## 常见错误处理 + +### 错误:remote gerrit already exists + +```bash +# 删除旧的远程仓库 +git remote remove gerrit + +# 重新添加 +git remote add gerrit http://101.43.95.130:8080/zhini_im +``` + +### 错误:Host key verification failed + +**解决方案 1:使用 HTTP(推荐)** +```bash +git remote set-url gerrit http://101.43.95.130:8080/zhini_im +``` + +**解决方案 2:修复 SSH 密钥** +```bash +ssh-keygen -R [101.43.95.130]:29418 +ssh -p 29418 admin@101.43.95.130 # 接受新密钥 +``` + +### 错误:Changes not staged for commit + +```bash +# 提交所有更改 +git add . +git commit -m "Update code" + +# 或暂存更改 +git stash +``` + diff --git a/修复邮箱地址问题.md b/修复邮箱地址问题.md new file mode 100644 index 0000000..bc7c5f5 --- /dev/null +++ b/修复邮箱地址问题.md @@ -0,0 +1,161 @@ +# 修复 Gerrit 推送邮箱地址问题 + +## 问题描述 + +推送代码时出现错误: +``` +ERROR: commit 356c4cc: email address noreply@gitee.com is not registered in your account +``` + +这是因为从码云拉取的代码中,提交记录的作者邮箱是 `noreply@gitee.com`,但 Gerrit 要求提交者的邮箱必须在账户中注册。 + +## 解决方案 + +### 方案一:修改提交记录的作者信息(推荐) + +将所有提交记录的作者邮箱改为已注册的邮箱 `263303411@qq.com`: + +```bash +cd /d/zhini/zhini_im + +# 使用 git filter-branch 批量修改所有提交的作者信息 +git filter-branch --env-filter ' +OLD_EMAIL="noreply@gitee.com" +CORRECT_NAME="renjianbo" +CORRECT_EMAIL="263303411@qq.com" + +if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ] +then + export GIT_COMMITTER_NAME="$CORRECT_NAME" + export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL" +fi +if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ] +then + export GIT_AUTHOR_NAME="$CORRECT_NAME" + export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL" +fi +' --tag-name-filter cat -- --branches --tags +``` + +**注意**:这个命令会重写 Git 历史,如果已经推送到其他远程仓库,需要强制推送。 + +### 方案二:只修改最近的提交(如果只有少量提交) + +如果只有最近的几个提交有问题,可以逐个修改: + +```bash +cd /d/zhini/zhini_im + +# 修改最后一次提交 +git commit --amend --author="renjianbo <263303411@qq.com>" --no-edit + +# 如果有多个提交需要修改,使用交互式 rebase +git rebase -i HEAD~10 # 修改最近10个提交 +# 在编辑器中,将要修改的提交前的 'pick' 改为 'edit' +# 然后对每个提交执行: +git commit --amend --author="renjianbo <263303411@qq.com>" --no-edit +git rebase --continue +``` + +### 方案三:在 Gerrit 中注册邮箱地址 + +1. 访问:`http://101.43.95.130:8080/settings#EmailAddresses` +2. 添加邮箱地址:`noreply@gitee.com` +3. 验证邮箱(如果需要) +4. 然后重新推送 + +**注意**:通常不推荐注册 `noreply@gitee.com`,因为这是码云的自动邮箱,不是真实邮箱。 + +## 推荐操作步骤 + +### 步骤 1:检查有多少提交使用了错误的邮箱 + +```bash +cd /d/zhini/zhini_im + +# 查看所有提交的邮箱 +git log --format='%H %an <%ae>' | grep -i noreply@gitee.com +``` + +### 步骤 2:批量修改所有提交(如果有很多提交) + +```bash +# 先备份当前分支(可选但推荐) +git branch backup-rjb_dev + +# 批量修改所有提交的作者信息 +git filter-branch -f --env-filter ' +if [ "$GIT_COMMITTER_EMAIL" = "noreply@gitee.com" ] +then + export GIT_COMMITTER_NAME="renjianbo" + export GIT_COMMITTER_EMAIL="263303411@qq.com" +fi +if [ "$GIT_AUTHOR_EMAIL" = "noreply@gitee.com" ] +then + export GIT_AUTHOR_NAME="renjianbo" + export GIT_AUTHOR_EMAIL="263303411@qq.com" +fi +' --tag-name-filter cat -- --branches --tags + +# 清理备份(可选,确认修改正确后) +# git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d +``` + +### 步骤 3:重新推送 + +```bash +# 由于历史被重写,需要强制推送 +git push gerrit HEAD:refs/for/master --force +``` + +## 如果使用方案二(只修改部分提交) + +```bash +cd /d/zhini/zhini_im + +# 查看提交历史,找到有问题的提交 +git log --oneline --format='%h %an <%ae>' | head -20 + +# 假设要修改最近 5 个提交 +git rebase -i HEAD~5 + +# 在编辑器中,将需要修改的提交前的 'pick' 改为 'edit' +# 保存并关闭编辑器 + +# 对每个标记为 'edit' 的提交执行: +git commit --amend --author="renjianbo <263303411@qq.com>" --no-edit +git rebase --continue + +# 重复直到所有提交都修改完成 + +# 重新推送 +git push gerrit HEAD:refs/for/master +``` + +## 验证修改结果 + +```bash +# 检查是否还有 noreply@gitee.com 的提交 +git log --format='%H %an <%ae>' | grep -i noreply@gitee.com + +# 如果没有任何输出,说明所有提交都已修改 +``` + +## 注意事项 + +1. **修改 Git 历史**:`git filter-branch` 会重写 Git 历史,如果代码已经推送到其他远程仓库,需要通知团队成员重新克隆。 + +2. **备份**:在执行批量修改前,建议先创建备份分支。 + +3. **强制推送**:修改历史后,需要使用 `--force` 推送,但 Gerrit 可能不允许强制推送到 `refs/for/*`,如果遇到问题,可以尝试: + ```bash + git push gerrit HEAD:refs/for/master + ``` + +4. **邮箱配置**:确保本地 Git 配置使用正确的邮箱: + ```bash + git config user.name "renjianbo" + git config user.email "263303411@qq.com" + ``` + + diff --git a/修复重复Change-Id.md b/修复重复Change-Id.md new file mode 100644 index 0000000..3c96a3b --- /dev/null +++ b/修复重复Change-Id.md @@ -0,0 +1,188 @@ +# 修复重复的 Change-Id 问题 + +## 问题 + +推送时出现错误: +``` +same Change-Id in multiple changes. +Squash the commits with the same Change-Id or ensure Change-Ids are unique for each commit +``` + +这是因为多个提交使用了相同的 Change-Id。Gerrit 要求每个提交都有唯一的 Change-Id。 + +## 解决方案 + +### 方法一:使用 commit-msg hook 重新生成(推荐) + +commit-msg hook 会基于提交内容自动生成唯一的 Change-Id: + +```bash +cd /d/zhini/zhini_im + +# 1. 确保 hook 已安装 +mkdir -p .git/hooks +curl -o .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg +chmod +x .git/hooks/commit-msg + +# 2. 使用 filter-branch 重新为所有提交生成 Change-Id +git filter-branch -f --msg-filter ' + # 读取原始提交信息 + ORIGINAL_MSG=$(cat) + + # 移除旧的 Change-Id(如果存在) + CLEAN_MSG=$(echo "$ORIGINAL_MSG" | sed "/^Change-Id:/d" | sed "/^$/N;/^\n$/d") + + # 输出清理后的提交信息 + echo "$CLEAN_MSG" + + # 使用 commit-msg hook 生成新的 Change-Id + # hook 会基于提交内容(树对象、父提交、作者等)生成唯一的 Change-Id + echo "" + # 临时保存提交信息 + echo "$CLEAN_MSG" > /tmp/commit_msg.txt + + # 模拟提交过程,让 hook 生成 Change-Id + # 这里我们需要手动生成,基于提交的 SHA1 和内容 + COMMIT_SHA=$(git rev-parse HEAD) + TREE_SHA=$(git rev-parse HEAD^{tree}) + PARENT_SHA=$(git rev-parse HEAD^ 2>/dev/null || echo "") + + # 生成基于提交内容的唯一 Change-Id + CHANGE_ID_BASE=$(echo -n "$COMMIT_SHA$TREE_SHA$PARENT_SHA" | git hash-object --stdin) + CHANGE_ID="I${CHANGE_ID_BASE:0:40}" + + echo "Change-Id: $CHANGE_ID" +' --tag-name-filter cat -- --branches --tags +``` + +### 方法二:使用 git rebase(更可靠) + +这个方法会真正运行 commit-msg hook: + +```bash +cd /d/zhini/zhini_im + +# 1. 确保 hook 已安装 +mkdir -p .git/hooks +curl -o .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg +chmod +x .git/hooks/commit-msg + +# 2. 创建备份 +git branch backup-before-rebase + +# 3. 从第一个提交开始 rebase +FIRST_COMMIT=$(git rev-list --max-parents=0 HEAD) +git rebase -i --root + +# 在编辑器中: +# - 将所有 'pick' 改为 'reword' +# - 保存并关闭 +# +# 对每个提交: +# - 提交信息编辑器会自动打开 +# - 不要修改内容,直接保存退出 +# - commit-msg hook 会自动为每个提交生成唯一的 Change-Id +# - 继续下一个提交 +``` + +### 方法三:使用脚本自动处理(最简单) + +创建一个脚本来自动为每个提交生成唯一的 Change-Id: + +```bash +cd /d/zhini/zhini_im + +# 确保 hook 已安装 +mkdir -p .git/hooks +curl -o .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg +chmod +x .git/hooks/commit-msg + +# 使用 filter-branch,为每个提交生成基于其内容的唯一 Change-Id +git filter-branch -f --msg-filter ' + # 读取原始提交信息 + ORIGINAL_MSG=$(cat) + + # 移除所有旧的 Change-Id 行 + CLEAN_MSG=$(echo "$ORIGINAL_MSG" | sed "/^Change-Id:/d") + + # 输出清理后的提交信息(去除末尾多余空行) + echo "$CLEAN_MSG" | sed -e :a -e "/^\$/{\$!N;ba}" -e "s/\n\$//" + + # 为当前提交生成唯一的 Change-Id + # 基于:提交 SHA1 + 树对象 SHA1 + 父提交 SHA1 + 作者信息 + COMMIT_SHA=$(git rev-parse HEAD) + TREE_SHA=$(git rev-parse HEAD^{tree}) + PARENT_SHA=$(git rev-parse HEAD^ 2>/dev/null || echo "root") + AUTHOR=$(git log -1 --format="%an <%ae> %at" HEAD) + + # 组合所有信息生成唯一哈希 + UNIQUE_STRING="${COMMIT_SHA}${TREE_SHA}${PARENT_SHA}${AUTHOR}" + CHANGE_ID_BASE=$(echo -n "$UNIQUE_STRING" | git hash-object --stdin | cut -c1-40) + CHANGE_ID="I${CHANGE_ID_BASE}" + + echo "" + echo "Change-Id: $CHANGE_ID" +' --tag-name-filter cat -- --branches --tags +``` + +## 推荐操作步骤 + +执行以下命令: + +```bash +cd /d/zhini/zhini_im + +# 1. 确保 hook 已安装 +mkdir -p .git/hooks +curl -o .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg +chmod +x .git/hooks/commit-msg + +# 2. 创建备份 +git branch backup-before-fix-changeid + +# 3. 为所有提交重新生成唯一的 Change-Id +git filter-branch -f --msg-filter ' + ORIGINAL_MSG=$(cat) + # 移除旧的 Change-Id + CLEAN_MSG=$(echo "$ORIGINAL_MSG" | sed "/^Change-Id:/d" | sed -e :a -e "/^\$/{\$!N;ba}" -e "s/\n\$//") + echo "$CLEAN_MSG" + + # 生成基于提交内容的唯一 Change-Id + COMMIT_SHA=$(git rev-parse HEAD) + TREE_SHA=$(git rev-parse HEAD^{tree}) + PARENT_SHA=$(git rev-parse HEAD^ 2>/dev/null || echo "root") + AUTHOR_TIME=$(git log -1 --format="%an|%ae|%at|%cn|%ce|%ct" HEAD) + + UNIQUE_STRING="${COMMIT_SHA}${TREE_SHA}${PARENT_SHA}${AUTHOR_TIME}" + CHANGE_ID_BASE=$(echo -n "$UNIQUE_STRING" | shasum -a 1 | cut -c1-40) + CHANGE_ID="I${CHANGE_ID_BASE}" + + echo "" + echo "Change-Id: $CHANGE_ID" +' --tag-name-filter cat -- --branches --tags + +# 4. 验证所有 Change-Id 都是唯一的 +git log --format='%H %s' | while read commit subject; do + changeid=$(git log -1 --format='%B' "$commit" | grep "^Change-Id:" | head -1) + echo "$commit $changeid" +done | sort -k2 | uniq -d -f1 + +# 如果没有输出,说明所有 Change-Id 都是唯一的 + +# 5. 重新推送 +git push gerrit HEAD:refs/for/master +``` + +## 验证 Change-Id 唯一性 + +```bash +# 检查是否有重复的 Change-Id +git log --format='%H' | while read commit; do + changeid=$(git log -1 --format='%B' "$commit" | grep "^Change-Id:" | head -1 | cut -d' ' -f2) + echo "$changeid $commit" +done | sort | uniq -d + +# 如果没有输出,说明所有 Change-Id 都是唯一的 +``` + + diff --git a/创建项目指南.md b/创建项目指南.md new file mode 100644 index 0000000..b3c2f42 --- /dev/null +++ b/创建项目指南.md @@ -0,0 +1,97 @@ +# Gerrit 创建项目指南 + +## 当前状态 + +✅ 您已成功登录(显示 "RENJIANBO") +✅ 可以访问 Repositories 页面 + +## 创建项目的方法 + +### 方法一:通过 Web 界面创建(推荐) + +#### 步骤 1:找到创建项目按钮 + +在 Repositories 页面,查找以下位置: + +1. **页面右上角**:查找 **"Create Project"** 或 **"+"** 按钮 +2. **或者**:点击右上角用户名 **"RENJIANBO"** → **"Settings"** → 查看左侧是否有 **"Administration"** 选项 +3. **或者**:直接访问创建项目页面: + ``` + http://101.43.95.130:8080/#/admin/projects/create + ``` + +#### 步骤 2:填写项目信息 + +如果找到了创建项目的页面,填写: + +- **Project Name**: 输入项目名称(例如:`my-project`) +- **Parent**: 选择 `All-Projects`(默认) +- **Description**: 项目描述(可选) +- **Submit Type**: 选择 `Merge If Necessary`(推荐) +- **Create initial empty commit**: ✅ 勾选(推荐) + +#### 步骤 3:创建项目 + +点击 **"Create Project"** 按钮 + +### 方法二:通过命令行创建(如果 Web 界面没有按钮) + +如果 Web 界面找不到创建按钮,可以使用命令行: + +```bash +# 在服务器上执行 +cd /home/renjianbo/gerrit_install/review_site +ssh -p 29418 renjianbo@localhost gerrit create-project my-project +``` + +### 方法三:手动创建 Git 仓库(如果以上都不行) + +如果以上方法都不行,可以手动创建: + +```bash +# 在服务器上执行 +cd /home/renjianbo/gerrit_install/review_site/git +mkdir my-project.git +cd my-project.git +git init --bare +``` + +然后刷新 Web 界面,项目应该会出现在列表中。 + +## 创建项目后的操作 + +项目创建成功后: + +1. **克隆项目到本地**: + ```bash + git clone ssh://renjianbo@101.43.95.130:29418/my-project + # 或使用 HTTP + git clone http://101.43.95.130:8080/my-project + ``` + +2. **推送代码进行评审**: + ```bash + cd my-project + echo "# My Project" > README.md + git add README.md + git commit -m "Add README file" + git push origin HEAD:refs/for/master + ``` + +## 如果找不到创建按钮 + +可能的原因: +1. 用户不是管理员(第一个登录的用户应该是管理员) +2. 权限配置问题 + +解决方案: +- 检查 Settings → Administration 是否存在 +- 如果不存在,可能需要手动添加管理员权限 + +## 需要帮助? + +如果以上方法都不行,请告诉我: +1. 在 Repositories 页面是否看到 "Create Project" 按钮 +2. Settings 页面左侧是否有 "Administration" 选项 +3. 访问 `http://101.43.95.130:8080/#/admin/projects/create` 的结果 + diff --git a/处理SSH主机密钥验证.md b/处理SSH主机密钥验证.md new file mode 100644 index 0000000..7f9bbc3 --- /dev/null +++ b/处理SSH主机密钥验证.md @@ -0,0 +1,147 @@ +# 处理 SSH 主机密钥验证问题 + +## 问题说明 + +当您看到以下提示时: +``` +The authenticity of host '[101.43.95.130]:29419' can't be established. +ED25519 key fingerprint is SHA256:DH/rryTaDvEpfj6SmXgTJaZtULX1kksBF6DGOvDZjks. +Are you sure you want to continue connecting (yes/no/[fingerprint])? +``` + +**这是正常的 SSH 安全验证**,不是错误! + +## 原因 + +- 您之前连接过 `29418` 端口,SSH 已经保存了该端口的主机密钥 +- 现在使用 `29419` 端口,SSH 将其视为新的主机(不同端口 = 不同主机) +- SSH 需要您确认是否信任这个新主机 + +## 解决方案 + +### 方法 1:直接接受(推荐) + +在提示时直接输入 `yes` 并回车: + +```bash +Are you sure you want to continue connecting (yes/no/[fingerprint])? yes +``` + +SSH 会自动将新主机密钥保存到 `~/.ssh/known_hosts` 文件中。 + +### 方法 2:预先添加主机密钥 + +如果您想提前添加,可以在 Git Bash 中执行: + +```bash +# 先删除旧的 29418 端口记录(可选) +ssh-keygen -R [101.43.95.130]:29418 + +# 手动添加 29419 端口的主机密钥 +ssh-keyscan -p 29419 101.43.95.130 >> ~/.ssh/known_hosts +``` + +### 方法 3:更新 known_hosts 文件 + +手动编辑 `known_hosts` 文件: + +```bash +# 在 Git Bash 中打开文件 +notepad ~/.ssh/known_hosts + +# 或者使用文本编辑器 +# 找到包含 101.43.95.130:29418 的行,可以删除或保留 +# SSH 会自动为 29419 端口创建新条目 +``` + +## 重要说明 + +### ✅ 不需要重新配置 SSH 密钥 + +- **SSH 公钥/私钥对**(`id_rsa` 和 `id_rsa.pub`)**不需要重新生成** +- 这些密钥已经配置好了,可以继续使用 +- 只需要接受新的**主机密钥**(服务器端的密钥) + +### 两种密钥的区别 + +1. **SSH 密钥对**(您的密钥): + - 用于身份认证(证明您是您) + - 已经添加到 Gerrit 中 + - 不需要重新配置 + +2. **主机密钥**(服务器的密钥): + - 用于验证服务器身份(证明服务器是真正的服务器) + - 每个端口都有独立的主机密钥 + - 第一次连接时需要接受 + +## 完整操作步骤 + +### 步骤 1:接受主机密钥 + +在 Git Bash 中,当看到提示时输入 `yes`: + +```bash +$ git push origin HEAD:refs/for/master +The authenticity of host '[101.43.95.130]:29419' can't be established. +ED25519 key fingerprint is SHA256:DH/rryTaDvEpfj6SmXgTJaZtULX1kksBF6DGOvDZjks. +Are you sure you want to continue connecting (yes/no/[fingerprint])? yes +``` + +### 步骤 2:验证连接 + +接受后,SSH 会保存主机密钥,然后继续推送。如果一切正常,您会看到推送成功的消息。 + +### 步骤 3:后续使用 + +以后使用 29419 端口时,不会再提示,因为主机密钥已经保存。 + +## 验证指纹(可选但推荐) + +为了安全,您可以验证指纹是否匹配: + +1. **在服务器上查看主机密钥指纹**: + ```bash + # 在服务器上执行 + ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub + ``` + +2. **与提示中的指纹对比**: + - 提示中的指纹:`SHA256:DH/rryTaDvEpfj6SmXgTJaZtULX1kksBF6DGOvDZjks` + - 如果匹配,说明是真正的服务器,可以安全接受 + +## 常见问题 + +### Q: 输入 yes 后还是失败? + +**A:** 可能的原因: +1. SSH 公钥未添加到 Gerrit → 检查 `http://101.43.95.130:8080/#/settings/ssh-keys` +2. 用户名错误 → 确认 Git remote URL 中的用户名 +3. 项目不存在 → 确认项目名称是否正确 + +### Q: 可以跳过主机密钥验证吗? + +**A:** 不推荐!这会降低安全性。但如果是测试环境,可以临时设置: + +```bash +# 在 ~/.ssh/config 中添加(不推荐生产环境) +Host 101.43.95.130 + StrictHostKeyChecking no + UserKnownHostsFile /dev/null +``` + +### Q: 如何查看已保存的主机密钥? + +**A:** +```bash +# 查看 known_hosts 文件 +cat ~/.ssh/known_hosts | grep 101.43.95.130 +``` + +## 总结 + +- ✅ **直接输入 `yes` 接受主机密钥**即可 +- ✅ **不需要重新配置 SSH 密钥**(公钥/私钥对) +- ✅ 这是正常的安全验证流程 +- ✅ 接受后,后续使用不会再提示 + + diff --git a/如何进行+2评审指南.md b/如何进行+2评审指南.md new file mode 100644 index 0000000..826b09c --- /dev/null +++ b/如何进行+2评审指南.md @@ -0,0 +1,193 @@ +# 如何进行 +2 Code-Review 评审 + +## 📋 什么是 +2 Code-Review? + +**+2 Code-Review** 是 Gerrit 中的最高评审评分,表示**批准合并**。通常需要管理员权限或具有相应权限的用户才能给出。 + +## 🌐 方法一:通过 Web 界面(推荐) + +### 步骤 1:打开变更页面 + +1. 访问变更 URL,例如: + - `http://101.43.95.130:8080/c/zhini-im/+/4` + - 或访问所有变更列表:`http://101.43.95.130:8080/#/q/status:open` + +2. 点击要评审的变更进入详情页 + +### 步骤 2:进行评审 + +1. **查看代码差异** + - 在变更页面查看所有文件修改 + - 可以点击代码行添加行内评论 + +2. **添加评审投票** + - 滚动到页面底部,找到 **"Review"** 区域 + - 在 **"Code-Review"** 下拉菜单中选择 **"+2"** + - (可选)在评论框中添加评审意见 + - 点击 **"POST"** 按钮提交评审 + +### 步骤 3:合并变更 + +当变更获得 **+2 Code-Review** 后: +- 如果还启用了 **Verified** 标签,需要 **+1 Verified** 才能自动合并 +- 或者可以点击 **"Submit"** 按钮手动合并 + +## 💻 方法二:通过 SSH 命令行 + +### 使用 gerrit review 命令 + +```bash +# 基本语法 +ssh -p 29418 renjianbo@101.43.95.130 gerrit review , --code-review +2 + +# 示例:给 Change 4 的第一个补丁集 +2 +ssh -p 29418 renjianbo@101.43.95.130 gerrit review 4,1 --code-review +2 + +# 示例:给 Change 4 的最新补丁集 +2(使用 --current) +ssh -p 29418 renjianbo@101.43.95.130 gerrit review 4 --code-review +2 + +# 同时添加评论 +ssh -p 29418 renjianbo@101.43.95.130 gerrit review 4 --code-review +2 --message "LGTM, 批准合并" +``` + +### 批量给多个变更 +2 + +```bash +# 给 Change 4-14 都 +2 +for i in {4..14}; do + ssh -p 29418 renjianbo@101.43.95.130 gerrit review $i --code-review +2 +done +``` + +## 🔐 权限要求 + +### 检查是否有 +2 权限 + +1. **查看您的权限**: + - 访问:`http://101.43.95.130:8080/#/settings` + - 查看您所属的用户组 + +2. **检查项目权限**: + - 访问:`http://101.43.95.130:8080/#/admin/projects/zhini-im,access` + - 查看 "Code-Review" 权限配置 + +### 如果没有 +2 权限,如何配置 + +如果您是管理员,可以配置权限: + +1. **访问项目权限页面**: + - `http://101.43.95.130:8080/#/admin/projects/zhini-im,access` + +2. **添加 Code-Review +2 权限**: + - 点击 **"Edit"** 按钮 + - 在 **"Reference"** 中选择 `refs/heads/*` 或 `refs/for/*` + - 添加权限: + - **Label Code-Review**: `+2` → 分配给您的用户组(如 `Administrators` 或 `Developers`) + - 保存更改 + +3. **或者通过 SSH 配置**: + +```bash +# 在服务器上执行 +cd /home/renjianbo/gerrit_install/review_site + +# 给 Administrators 组添加 Code-Review +2 权限 +ssh -p 29418 renjianbo@localhost gerrit set-access zhini-im -a refs/heads/* -g Administrators Label-Code-Review+2 + +# 或者给特定用户添加权限 +ssh -p 29418 renjianbo@localhost gerrit set-access zhini-im -a refs/heads/* -u renjianbo Label-Code-Review+2 +``` + +## 📝 完整的评审流程示例 + +### 示例 1:通过 Web 界面 + +1. 打开变更:`http://101.43.95.130:8080/c/zhini-im/+/4` +2. 查看代码差异 +3. 滚动到底部,在 "Review" 区域: + - 选择 **Code-Review: +2** + - 添加评论(可选):"代码质量良好,批准合并" + - 点击 **"POST"** +4. 如果满足合并条件,点击 **"Submit"** 按钮合并 + +### 示例 2:通过 SSH + +```bash +# 给 Change 4 +2 并添加评论 +ssh -p 29418 renjianbo@101.43.95.130 gerrit review 4 --code-review +2 --message "代码质量良好,批准合并" + +# 如果需要同时给 Verified +1 +ssh -p 29418 renjianbo@101.43.95.130 gerrit review 4 --code-review +2 --verified +1 --message "代码质量良好,已验证,批准合并" +``` + +## 🎯 快速参考 + +### 评审投票选项 + +- **Code-Review**: + - `+2` = 批准合并(需要管理员或相应权限) + - `+1` = 看起来不错,但需要其他人批准 + - `0` = 无意见 + - `-1` = 需要修改 + - `-2` = 拒绝 + +- **Verified**: + - `+1` = 验证通过(通常由 CI 系统或管理员给出) + - `0` = 未验证 + - `-1` = 验证失败 + +### 常用 SSH 命令 + +```bash +# 查看变更详情 +ssh -p 29418 renjianbo@101.43.95.130 gerrit query --format=JSON change:4 + +# 给变更 +2 +ssh -p 29418 renjianbo@101.43.95.130 gerrit review 4 --code-review +2 + +# 给变更 +2 并添加评论 +ssh -p 29418 renjianbo@101.43.95.130 gerrit review 4 --code-review +2 --message "LGTM" + +# 提交变更(合并) +ssh -p 29418 renjianbo@101.43.95.130 gerrit review 4 --submit + +# 查看所有待合并的变更 +ssh -p 29418 renjianbo@101.43.95.130 gerrit query --format=JSON status:open is:mergeable +``` + +## ⚠️ 注意事项 + +1. **权限要求**:+2 通常需要管理员权限或项目所有者权限 +2. **自评限制**:通常不能给自己的变更 +2(除非配置了相应权限) +3. **合并条件**:变更需要同时满足: + - Code-Review: +2 + - Verified: +1(如果启用了) +4. **提交者**:即使获得了 +2,通常也需要点击 "Submit" 按钮才能合并 + +## 🔧 如果无法 +2 + +### 检查权限 + +```bash +# 查看您的用户组 +ssh -p 29418 renjianbo@101.43.95.130 gerrit ls-members --group Administrators + +# 查看项目权限 +ssh -p 29418 renjianbo@101.43.95.130 gerrit show-access zhini-im +``` + +### 临时解决方案 + +如果没有 +2 权限,可以: +1. 使用 **+1 Code-Review**(如果允许) +2. 或者配置项目允许直接推送(绕过评审) +3. 或者联系管理员添加权限 + +## 📚 相关链接 + +- **Gerrit 首页**: `http://101.43.95.130:8080` +- **所有变更**: `http://101.43.95.130:8080/#/q/status:open` +- **项目权限**: `http://101.43.95.130:8080/#/admin/projects/zhini-im,access` +- **用户设置**: `http://101.43.95.130:8080/#/settings` + + diff --git a/安装CommitHook指南.md b/安装CommitHook指南.md new file mode 100644 index 0000000..5120e84 --- /dev/null +++ b/安装CommitHook指南.md @@ -0,0 +1,125 @@ +# 安装 Gerrit Commit Hook 指南 + +## 问题 + +错误信息: +``` +ERROR: commit b4917f2: missing Change-Id in message footer +``` + +Gerrit 要求每个提交都必须包含 Change-Id。 + +## 解决方案:安装 commit-msg hook + +### 步骤 1:安装 commit-msg hook + +在您的本地电脑上执行: + +```bash +cd /d/ttt/test-project + +# 安装 commit-msg hook +gitdir=$(git rev-parse --git-dir); scp -p -P 29418 renjianbo@101.43.95.130:hooks/commit-msg ${gitdir}/hooks/ +``` + +**注意**:如果 scp 命令失败,可能需要使用完整路径或配置 SSH。 + +### 步骤 2:修改最后一次提交(添加 Change-Id) + +```bash +# 修改最后一次提交,自动添加 Change-Id +git commit --amend --no-edit +``` + +### 步骤 3:重新推送 + +```bash +# 如果创建了 SSH 配置文件 +git push origin HEAD:refs/for/master + +# 如果还没创建配置文件 +GIT_SSH_COMMAND="ssh -o PubkeyAcceptedKeyTypes=+ssh-rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa" git push origin HEAD:refs/for/master +``` + +## 如果 scp 命令失败 + +### 方法一:使用 curl 下载(推荐) + +```bash +cd /d/ttt/test-project + +# 创建 hooks 目录(如果不存在) +mkdir -p .git/hooks + +# 下载 commit-msg hook +curl -o .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg + +# 设置执行权限 +chmod +x .git/hooks/commit-msg +``` + +### 方法二:手动创建 hook 文件 + +如果以上方法都不行,可以手动创建: + +```bash +cd /d/ttt/test-project + +# 创建 hooks 目录 +mkdir -p .git/hooks + +# 创建 commit-msg hook(简化版) +cat > .git/hooks/commit-msg << 'EOF' +#!/bin/sh +# Gerrit commit-msg hook +CHANGE_ID=$(git log -1 --format='%H' | cut -c1-8) +echo "" >> "$1" +echo "Change-Id: I${CHANGE_ID}0000000000000000000000000000000000000000" >> "$1" +EOF + +# 设置执行权限 +chmod +x .git/hooks/commit-msg +``` + +## 完整操作流程 + +```bash +cd /d/ttt/test-project + +# 方法 1:使用 scp(如果 SSH 配置正确) +gitdir=$(git rev-parse --git-dir); scp -p -P 29418 renjianbo@101.43.95.130:hooks/commit-msg ${gitdir}/hooks/ + +# 方法 2:使用 curl(推荐,更简单) +mkdir -p .git/hooks +curl -o .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg +chmod +x .git/hooks/commit-msg + +# 修改最后一次提交 +git commit --amend --no-edit + +# 推送代码 +git push origin HEAD:refs/for/master +``` + +## 验证 hook 是否安装成功 + +```bash +# 查看 hook 文件是否存在 +ls -la .git/hooks/commit-msg + +# 应该显示文件存在且有执行权限 +``` + +## 以后的使用 + +安装 hook 后,以后的所有提交都会自动包含 Change-Id,不需要手动添加。 + +## 推送成功后的效果 + +推送成功后,Gerrit 会返回变更 URL,例如: +``` +remote: http://101.43.95.130:8080/c/test-project/+/1 [NEW] +``` + +在浏览器中打开即可查看和评审代码变更。 + diff --git a/安装commit-msg-hook.md b/安装commit-msg-hook.md new file mode 100644 index 0000000..531b0cb --- /dev/null +++ b/安装commit-msg-hook.md @@ -0,0 +1,174 @@ +# 安装 Gerrit commit-msg Hook 指南 + +## 问题 + +推送代码时出现错误: +``` +remote: ERROR: commit 5ee73b7: missing Change-Id in message footer +``` + +## 原因 + +Gerrit 要求每个提交都必须包含 `Change-Id`,用于跟踪代码变更。需要安装 `commit-msg` hook 来自动添加。 + +## 解决方案 + +### 方法一:使用 SCP 下载(SSH 方式,推荐) + +在您的项目目录中执行: + +```bash +cd /d/zhini_im_android + +# 下载 commit-msg hook +gitdir=$(git rev-parse --git-dir) +scp -p -P 29419 renjianbo@101.43.95.130:hooks/commit-msg ${gitdir}/hooks/ + +# 如果使用 OpenSSH >= 9.0,需要添加 -O 参数 +# scp -O -p -P 29419 renjianbo@101.43.95.130:hooks/commit-msg ${gitdir}/hooks/ + +# 设置执行权限 +chmod +x ${gitdir}/hooks/commit-msg +``` + +### 方法二:使用 HTTP 下载(如果 SSH 有问题) + +```bash +cd /d/zhini_im_android + +# 下载 commit-msg hook +f="$(git rev-parse --git-dir)/hooks/commit-msg" +curl -o "$f" http://101.43.95.130:8080/tools/hooks/commit-msg +chmod +x "$f" +``` + +### 方法三:手动创建目录并下载 + +```bash +cd /d/zhini_im_android + +# 确保 hooks 目录存在 +mkdir -p .git/hooks + +# 下载 hook(HTTP 方式) +curl -o .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg + +# 设置执行权限 +chmod +x .git/hooks/commit-msg +``` + +## 修复已提交的代码 + +安装 hook 后,需要修改最后一次提交以添加 Change-Id: + +```bash +cd /d/zhini_im_android + +# 修改最后一次提交(会自动添加 Change-Id) +git commit --amend --no-edit + +# 重新推送 +git push origin HEAD:refs/for/master +``` + +## 完整操作步骤 + +### 步骤 1:安装 commit-msg hook + +```bash +cd /d/zhini_im_android + +# 使用 HTTP 方式下载(最简单) +f="$(git rev-parse --git-dir)/hooks/commit-msg" +curl -o "$f" http://101.43.95.130:8080/tools/hooks/commit-msg +chmod +x "$f" +``` + +### 步骤 2:验证 hook 已安装 + +```bash +# 检查文件是否存在 +ls -la .git/hooks/commit-msg + +# 检查文件内容(应该看到 Gerrit commit-msg hook 的代码) +head -20 .git/hooks/commit-msg +``` + +### 步骤 3:修改提交添加 Change-Id + +```bash +# 修改最后一次提交 +git commit --amend --no-edit + +# 查看提交信息,确认 Change-Id 已添加 +git log -1 +``` + +您应该看到提交信息末尾有类似这样的内容: +``` +Change-Id: I1234567890abcdef1234567890abcdef12345678 +``` + +### 步骤 4:重新推送 + +```bash +git push origin HEAD:refs/for/master +``` + +## 验证 + +推送成功后,您会看到类似这样的输出: + +``` +remote: Resolving deltas: 100% (55/55) +remote: Processing changes: refs: 1, new: 1 +remote: +remote: SUCCESS +remote: +remote: http://101.43.95.130:8080/c/zhini_im_android/+/123 [NEW] +remote: +To ssh://101.43.95.130:29419/zhini_im_android + * [new branch] HEAD -> refs/for/master +``` + +## 后续使用 + +安装 hook 后,以后的所有新提交都会自动包含 Change-Id,不需要手动添加。 + +## 常见问题 + +### Q: 如果 scp 命令失败怎么办? + +**A:** 使用 HTTP 方式下载: +```bash +curl -o .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg +chmod +x .git/hooks/commit-msg +``` + +### Q: 如果有多个提交需要修复怎么办? + +**A:** 可以使用交互式 rebase: +```bash +# 假设需要修复最近 3 个提交 +git rebase -i HEAD~3 + +# 在编辑器中,将要修改的提交标记为 "edit" +# 然后对每个提交执行: +git commit --amend --no-edit +git rebase --continue +``` + +### Q: hook 安装后不工作? + +**A:** 检查: +1. 文件权限:`chmod +x .git/hooks/commit-msg` +2. 文件路径:确保在 `.git/hooks/` 目录下 +3. Git 版本:确保 Git 版本支持 hooks + +## 注意事项 + +- ✅ Hook 只需要安装一次,后续提交会自动使用 +- ✅ 如果克隆新项目,需要重新安装 hook +- ✅ Hook 是项目级别的,每个项目都需要单独安装 + + diff --git a/安装前准备-Java17.md b/安装前准备-Java17.md new file mode 100644 index 0000000..d95d128 --- /dev/null +++ b/安装前准备-Java17.md @@ -0,0 +1,75 @@ +# Gerrit 安装前准备 - 安装 Java 17 + +## 当前状态 +- ✅ Gerrit 3.9.0 已下载到: `~/gerrit_install/gerrit-3.9.0.war` +- ❌ 当前 Java 版本: Java 8 (不兼容) +- ⚠️ 需要: Java 11 或 Java 17 (推荐 Java 17) + +## 解决方案 + +### 方案一:安装 Java 17(推荐) + +#### CentOS 7 安装 Java 17 + +```bash +# 方法 1: 使用 AdoptOpenJDK (需要添加仓库) +sudo yum install -y wget +wget https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.12%2B7/OpenJDK17U-jdk_x64_linux_hotspot_17.0.12_7.tar.gz +tar -xzf OpenJDK17U-jdk_x64_linux_hotspot_17.0.12_7.tar.gz +sudo mv jdk-17.0.12+7 /opt/java17 +sudo alternatives --install /usr/bin/java java /opt/java17/bin/java 2 +sudo alternatives --config java # 选择 Java 17 + +# 验证 +java -version +``` + +#### 或者使用更简单的方法(如果系统支持) + +```bash +# 检查是否有 Java 17 可用 +sudo yum search java-17 + +# 如果有,直接安装 +sudo yum install -y java-17-openjdk java-17-openjdk-devel + +# 设置 Java 17 为默认 +sudo alternatives --config java +``` + +### 方案二:使用支持 Java 8 的旧版本 Gerrit + +如果无法安装 Java 17,可以下载 Gerrit 3.3.x(最后一个支持 Java 8 的版本): + +```bash +cd ~/gerrit_install +rm -f gerrit-3.9.0.war +wget https://gerrit-releases.storage.googleapis.com/gerrit-3.3.8.war +java -jar gerrit-3.3.8.war init -d review_site +``` + +**注意**: Gerrit 3.3.x 是较旧的版本,建议使用 Java 17 + Gerrit 3.9.0。 + +## 安装 Java 17 后的步骤 + +安装 Java 17 后,继续执行: + +```bash +cd ~/gerrit_install +java -jar gerrit-3.9.0.war init -d review_site +``` + +## 快速检查命令 + +```bash +# 检查当前 Java 版本 +java -version + +# 检查是否安装了多个 Java 版本 +sudo alternatives --display java + +# 切换 Java 版本 +sudo alternatives --config java +``` + + diff --git a/安装状态说明.md b/安装状态说明.md new file mode 100644 index 0000000..e2000b2 --- /dev/null +++ b/安装状态说明.md @@ -0,0 +1,93 @@ +# Gerrit 安装状态说明 + +## 当前状态 + +### ✅ 已完成 +- Gerrit 3.9.0 已下载: `~/gerrit_install/gerrit-3.9.0.war` (85MB) +- Gerrit 3.3.8 已下载: `~/gerrit_install/gerrit-3.3.8.war` (70MB) +- 系统已安装: Git, wget +- 工作目录已创建: `~/gerrit_install/` + +### ❌ 需要解决 +- **Java 版本不兼容**: 当前 Java 8,需要 Java 11 或 17 + - Gerrit 3.9.0 需要 Java 17 + - Gerrit 3.3.8 需要 Java 11 + - 当前系统只有 Java 8 + +## 解决方案 + +### 必须安装 Java 11 或 Java 17 + +由于所有可用的 Gerrit 版本都需要 Java 11+,您必须先升级 Java。 + +### 推荐方案:安装 Java 17 + +#### CentOS 7 安装 Java 17 步骤: + +```bash +# 1. 下载 OpenJDK 17 +cd ~ +wget https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.12%2B7/OpenJDK17U-jdk_x64_linux_hotspot_17.0.12_7.tar.gz + +# 2. 解压 +tar -xzf OpenJDK17U-jdk_x64_linux_hotspot_17.0.12_7.tar.gz + +# 3. 移动到系统目录(需要 sudo) +sudo mv jdk-17.0.12+7 /opt/java17 + +# 4. 配置 alternatives(需要 sudo) +sudo alternatives --install /usr/bin/java java /opt/java17/bin/java 2 +sudo alternatives --install /usr/bin/javac javac /opt/java17/bin/javac 2 + +# 5. 选择 Java 17 作为默认版本(需要 sudo) +sudo alternatives --config java +# 选择 /opt/java17/bin/java 对应的编号 + +# 6. 验证 +java -version +# 应该显示: openjdk version "17.0.12" +``` + +### 安装 Java 17 后继续安装 Gerrit + +```bash +cd ~/gerrit_install + +# 使用 Gerrit 3.9.0(推荐) +java -jar gerrit-3.9.0.war init -d review_site --batch --no-auto-start + +# 或者使用 Gerrit 3.3.8 +java -jar gerrit-3.3.8.war init -d review_site --batch --no-auto-start +``` + +## 快速检查命令 + +```bash +# 检查当前 Java 版本 +java -version + +# 检查已安装的 Java 版本 +sudo alternatives --display java + +# 查看所有可用的 Java +ls -la /usr/lib/jvm/ +``` + +## 注意事项 + +1. **需要 sudo 权限**: 安装 Java 17 需要管理员权限 +2. **系统兼容性**: CentOS 7 默认仓库没有 Java 17,需要手动下载安装 +3. **版本选择**: 建议使用 Java 17 + Gerrit 3.9.0(最新稳定版) + +## 下一步 + +安装 Java 17 后,请运行: + +```bash +cd ~/gerrit_install +java -jar gerrit-3.9.0.war init -d review_site +``` + +然后按照 `Gerrit安装使用指南.md` 中的说明继续配置和使用。 + + diff --git a/完全重新安装Gerrit.sh b/完全重新安装Gerrit.sh new file mode 100644 index 0000000..0d13f90 --- /dev/null +++ b/完全重新安装Gerrit.sh @@ -0,0 +1,199 @@ +#!/bin/bash + +# Gerrit 完全卸载并重新安装脚本 +# 注意:会删除所有现有数据 + +set -e + +# 颜色输出 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# 配置变量 +GERRIT_HOME="/home/renjianbo/gerrit_install" +GERRIT_VERSION="3.9.0" +GERRIT_PORT="8080" +GERRIT_SSH_PORT="29418" +SERVER_IP="101.43.95.130" + +# JDK 17 路径 +JAVA17_HOME="/usr/local/java/jdk-17.0.12+7" +export JAVA_HOME=$JAVA17_HOME +export PATH=$JAVA_HOME/bin:$PATH + +echo -e "${GREEN}========================================${NC}" +echo -e "${GREEN}Gerrit 完全卸载并重新安装${NC}" +echo -e "${GREEN}版本: ${GERRIT_VERSION}${NC}" +echo -e "${RED}警告:将删除所有现有数据!${NC}" +echo -e "${GREEN}========================================${NC}" +echo "" + +# 1. 停止服务 +echo -e "${YELLOW}[1/6] 停止 Gerrit 服务...${NC}" +if [ -d "${GERRIT_HOME}/review_site" ]; then + cd ${GERRIT_HOME}/review_site + if [ -f "bin/gerrit.sh" ]; then + bin/gerrit.sh stop 2>/dev/null || true + sleep 2 + echo -e "${GREEN}✓ 服务已停止${NC}" + else + echo -e "${YELLOW}⚠ gerrit.sh 不存在${NC}" + fi +else + echo -e "${YELLOW}⚠ review_site 目录不存在${NC}" +fi +echo "" + +# 2. 杀死残留进程 +echo -e "${YELLOW}[2/6] 清理残留进程...${NC}" +pkill -f "gerrit.war daemon" 2>/dev/null || true +sleep 1 +echo -e "${GREEN}✓ 进程清理完成${NC}" +echo "" + +# 3. 删除旧安装 +echo -e "${YELLOW}[3/6] 删除旧安装...${NC}" +if [ -d "${GERRIT_HOME}/review_site" ]; then + rm -rf ${GERRIT_HOME}/review_site + echo -e "${GREEN}✓ 已删除 review_site 目录${NC}" +else + echo -e "${YELLOW}⚠ review_site 目录不存在${NC}" +fi +echo "" + +# 4. 检查 Gerrit war 文件 +echo -e "${YELLOW}[4/6] 检查 Gerrit 安装包...${NC}" +cd ${GERRIT_HOME} + +if [ ! -f "gerrit-${GERRIT_VERSION}.war" ]; then + echo " 下载 Gerrit ${GERRIT_VERSION}..." + wget -q https://gerrit-releases.storage.googleapis.com/gerrit-${GERRIT_VERSION}.war + if [ $? -ne 0 ]; then + echo -e "${RED}下载失败${NC}" + exit 1 + fi + echo -e "${GREEN}✓ 下载完成${NC}" +else + echo -e "${GREEN}✓ Gerrit ${GERRIT_VERSION} 已存在${NC}" +fi +echo "" + +# 5. 重新初始化 +echo -e "${YELLOW}[5/6] 重新初始化 Gerrit...${NC}" +cd ${GERRIT_HOME} + +echo " 正在初始化(这可能需要几分钟)..." +$JAVA_HOME/bin/java -jar gerrit-${GERRIT_VERSION}.war init \ + -d review_site \ + --batch \ + --no-auto-start \ + -D gerrit.canonicalWebUrl=http://${SERVER_IP}:${GERRIT_PORT}/ \ + --install-plugin=download-commands \ + --install-plugin=replication \ + --install-plugin=reviewnotes 2>&1 | tail -20 + +if [ $? -eq 0 ]; then + echo -e "${GREEN}✓ 初始化完成${NC}" +else + echo -e "${YELLOW}⚠ 初始化过程中可能有警告,但可能已成功完成${NC}" +fi +echo "" + +# 6. 配置 Gerrit +echo -e "${YELLOW}[6/6] 配置 Gerrit...${NC}" +cd ${GERRIT_HOME} + +# 创建配置文件 +cat > review_site/etc/gerrit.config << EOCONFIG +[gerrit] + basePath = git + canonicalWebUrl = http://${SERVER_IP}:${GERRIT_PORT}/ + serverId = $(uuidgen 2>/dev/null || echo $(date +%s)) +[database] + type = h2 + database = db/ReviewDB +[auth] + type = DEVELOPMENT_BECOME_ANY_ACCOUNT + gitBasicAuth = true +[sshd] + listenAddress = *:${GERRIT_SSH_PORT} +[httpd] + listenUrl = http://*:${GERRIT_PORT}/ + cookieSecure = false + cookieSameSite = LAX + cookiePath = / +[cache] + directory = cache +[index] + type = LUCENE +[receive] + enableSignedPush = false +EOCONFIG + +echo -e "${GREEN}✓ 配置完成${NC}" +echo "" + +# 7. 配置启动脚本使用 Java 17 +echo -e "${YELLOW}配置启动脚本...${NC}" +cd ${GERRIT_HOME}/review_site + +if [ -f "bin/gerrit.sh" ]; then + cp bin/gerrit.sh bin/gerrit.sh.bak + sed -i "2i export JAVA_HOME=${JAVA17_HOME}\nexport PATH=\$JAVA_HOME/bin:\$PATH" bin/gerrit.sh + echo -e "${GREEN}✓ 已更新 gerrit.sh 使用 Java 17${NC}" +fi +echo "" + +# 8. 启动服务 +echo -e "${YELLOW}启动 Gerrit 服务...${NC}" +cd ${GERRIT_HOME}/review_site + +bin/gerrit.sh start + +sleep 8 + +# 检查服务状态 +if bin/gerrit.sh status 2>&1 | grep -q "Gerrit running\|Running"; then + echo -e "${GREEN}✓ 服务启动成功${NC}" +else + echo -e "${YELLOW}⚠ 检查服务状态...${NC}" + bin/gerrit.sh status 2>&1 | head -10 +fi +echo "" + +# 检查端口 +echo -e "${YELLOW}检查端口监听...${NC}" +if command -v netstat &> /dev/null; then + netstat -tlnp 2>/dev/null | grep ":8080" && echo -e "${GREEN}✓ 端口 8080 正在监听${NC}" || echo -e "${YELLOW}⚠ 端口 8080 未被监听${NC}" +elif command -v ss &> /dev/null; then + ss -tlnp 2>/dev/null | grep ":8080" && echo -e "${GREEN}✓ 端口 8080 正在监听${NC}" || echo -e "${YELLOW}⚠ 端口 8080 未被监听${NC}" +fi +echo "" + +# 输出信息 +echo -e "${GREEN}========================================${NC}" +echo -e "${GREEN}重新安装完成!${NC}" +echo -e "${GREEN}========================================${NC}" +echo "" +echo -e "${YELLOW}重要提示:${NC}" +echo -e " ${GREEN}1. 第一个登录的用户将自动成为管理员${NC}" +echo -e " 2. 请清除浏览器 Cookie 和缓存(重要!)" +echo -e " 3. 访问: http://${SERVER_IP}:${GERRIT_PORT}" +echo -e " 4. 点击 'Sign In',输入用户名(例如:admin)" +echo -e " 5. 第一个登录的用户将自动成为管理员" +echo -e " 6. 登录后应该能看到 'CREATE NEW' 按钮" +echo "" +echo -e "${YELLOW}访问信息:${NC}" +echo -e " Web 界面: http://${SERVER_IP}:${GERRIT_PORT}" +echo -e " SSH 端口: ${GERRIT_SSH_PORT}" +echo "" +echo -e "${YELLOW}常用命令:${NC}" +echo -e " 查看状态: cd ${GERRIT_HOME}/review_site && bin/gerrit.sh status" +echo -e " 查看日志: tail -f ${GERRIT_HOME}/review_site/logs/error_log" +echo -e " 停止服务: cd ${GERRIT_HOME}/review_site && bin/gerrit.sh stop" +echo -e " 重启服务: cd ${GERRIT_HOME}/review_site && bin/gerrit.sh restart" +echo "" +echo -e "${GREEN}========================================${NC}" + diff --git a/开放端口29419-iptables.sh b/开放端口29419-iptables.sh new file mode 100755 index 0000000..1967a0a --- /dev/null +++ b/开放端口29419-iptables.sh @@ -0,0 +1,79 @@ +#!/bin/bash +# 使用 iptables 开放 Gerrit SSH 端口 29419 的脚本 + +echo "==========================================" +echo "使用 iptables 开放 Gerrit SSH 端口 29419" +echo "==========================================" + +# 检查是否有 root 权限 +if [ "$EUID" -ne 0 ]; then + echo "❌ 此脚本需要 root 权限,请使用 sudo 运行" + echo "" + echo "使用方法:" + echo " sudo bash 开放端口29419-iptables.sh" + exit 1 +fi + +echo "" +echo "步骤 1: 检查当前 iptables 规则..." +iptables -L -n | grep 29419 || echo "未找到 29419 端口规则" + +echo "" +echo "步骤 2: 添加 iptables 规则允许端口 29419..." +iptables -I INPUT -p tcp --dport 29419 -j ACCEPT + +if [ $? -eq 0 ]; then + echo "✅ iptables 规则已添加" +else + echo "❌ 添加规则失败" + exit 1 +fi + +echo "" +echo "步骤 3: 保存 iptables 规则..." +# 尝试不同的保存方式 +if command -v iptables-save &> /dev/null; then + # CentOS 7 + if [ -f /etc/sysconfig/iptables ]; then + iptables-save > /etc/sysconfig/iptables + echo "✅ 规则已保存到 /etc/sysconfig/iptables" + else + # 其他系统 + iptables-save > /etc/iptables/rules.v4 2>/dev/null || \ + iptables-save > /etc/iptables.rules 2>/dev/null || \ + echo "⚠️ 请手动保存 iptables 规则" + fi +else + echo "⚠️ 未找到 iptables-save 命令,请手动保存规则" +fi + +echo "" +echo "步骤 4: 验证规则..." +if iptables -L -n | grep -q "29419"; then + echo "✅ 端口 29419 规则已添加" + iptables -L -n | grep 29419 +else + echo "⚠️ 警告:规则可能未正确添加" +fi + +echo "" +echo "步骤 5: 检查端口监听状态..." +if netstat -tlnp 2>/dev/null | grep -q ":29419"; then + echo "✅ Gerrit 服务正在监听端口 29419" + netstat -tlnp | grep 29419 +else + echo "⚠️ 警告:未检测到端口 29419 的监听,请检查 Gerrit 服务状态" +fi + +echo "" +echo "==========================================" +echo "完成!" +echo "==========================================" +echo "" +echo "如果使用云服务器,还需要在云控制台的安全组中开放端口 29419" +echo "" +echo "测试连接:" +echo " ssh -p 29419 renjianbo@101.43.95.130 gerrit version" +echo "" + + diff --git a/开放端口29419.sh b/开放端口29419.sh new file mode 100755 index 0000000..c3ab5bf --- /dev/null +++ b/开放端口29419.sh @@ -0,0 +1,82 @@ +#!/bin/bash +# 开放 Gerrit SSH 端口 29419 的防火墙脚本 + +echo "==========================================" +echo "开放 Gerrit SSH 端口 29419" +echo "==========================================" + +# 检查是否有 root 权限 +if [ "$EUID" -ne 0 ]; then + echo "❌ 此脚本需要 root 权限,请使用 sudo 运行" + echo "" + echo "使用方法:" + echo " sudo bash 开放端口29419.sh" + exit 1 +fi + +# 检查 firewall-cmd 是否可用 +if ! command -v firewall-cmd &> /dev/null; then + echo "❌ 未找到 firewall-cmd 命令" + echo " 可能使用的是 iptables,请手动配置" + exit 1 +fi + +echo "" +echo "步骤 1: 检查当前防火墙状态..." +firewall-cmd --state + +echo "" +echo "步骤 2: 检查当前开放的端口..." +firewall-cmd --list-ports + +echo "" +echo "步骤 3: 添加端口 29419/tcp..." +firewall-cmd --permanent --add-port=29419/tcp + +if [ $? -eq 0 ]; then + echo "✅ 端口 29419/tcp 已添加到防火墙规则" +else + echo "❌ 添加端口失败" + exit 1 +fi + +echo "" +echo "步骤 4: 重新加载防火墙配置..." +firewall-cmd --reload + +if [ $? -eq 0 ]; then + echo "✅ 防火墙配置已重新加载" +else + echo "❌ 重新加载失败" + exit 1 +fi + +echo "" +echo "步骤 5: 验证端口是否已开放..." +if firewall-cmd --list-ports | grep -q "29419/tcp"; then + echo "✅ 端口 29419/tcp 已成功开放" +else + echo "⚠️ 警告:端口可能未正确添加,请手动检查" +fi + +echo "" +echo "步骤 6: 检查端口监听状态..." +if netstat -tlnp 2>/dev/null | grep -q ":29419"; then + echo "✅ Gerrit 服务正在监听端口 29419" + netstat -tlnp | grep 29419 +else + echo "⚠️ 警告:未检测到端口 29419 的监听,请检查 Gerrit 服务状态" +fi + +echo "" +echo "==========================================" +echo "完成!" +echo "==========================================" +echo "" +echo "如果使用云服务器,还需要在云控制台的安全组中开放端口 29419" +echo "" +echo "测试连接:" +echo " ssh -p 29419 renjianbo@101.43.95.130 gerrit version" +echo "" + + diff --git a/开放端口29419说明.md b/开放端口29419说明.md new file mode 100644 index 0000000..ae4a0ba --- /dev/null +++ b/开放端口29419说明.md @@ -0,0 +1,189 @@ +# 开放 Gerrit SSH 端口 29419 指南 + +## 问题描述 + +Gerrit SSH 服务使用端口 29419,但防火墙阻止了外部访问,导致连接超时: +``` +ssh: connect to host 101.43.95.130 port 29419: Connection timed out +``` + +## 解决方案 + +### 方法一:使用 firewall-cmd(推荐,适用于 CentOS 7) + +如果系统使用 `firewalld` 管理防火墙: + +```bash +# 1. 添加端口到防火墙(永久生效) +sudo firewall-cmd --permanent --add-port=29419/tcp + +# 2. 重新加载防火墙配置 +sudo firewall-cmd --reload + +# 3. 验证端口是否已开放 +sudo firewall-cmd --list-ports | grep 29419 +``` + +或者直接运行脚本: +```bash +sudo bash 开放端口29419.sh +``` + +### 方法二:使用 iptables + +如果系统使用 `iptables` 管理防火墙: + +```bash +# 1. 添加 iptables 规则 +sudo iptables -I INPUT -p tcp --dport 29419 -j ACCEPT + +# 2. 保存规则(CentOS 7) +sudo iptables-save > /etc/sysconfig/iptables + +# 3. 验证规则 +sudo iptables -L -n | grep 29419 +``` + +或者直接运行脚本: +```bash +sudo bash 开放端口29419-iptables.sh +``` + +### 方法三:云服务器安全组配置 + +如果使用云服务器(阿里云、腾讯云、AWS 等),还需要在云控制台配置: + +1. **登录云控制台** +2. **找到安全组配置** +3. **添加入站规则**: + - 协议:TCP + - 端口:29419 + - 源:0.0.0.0/0(或指定 IP 范围) + - 动作:允许 + +## 验证步骤 + +### 1. 检查端口监听状态 + +```bash +# 检查 Gerrit 是否在监听端口 29419 +netstat -tlnp | grep 29419 +# 或 +ss -tlnp | grep 29419 +``` + +应该看到类似输出: +``` +tcp6 0 0 :::29419 :::* LISTEN 29768/GerritCodeRev +``` + +### 2. 测试 SSH 连接 + +从客户端测试连接: + +```bash +# 测试 SSH 连接 +ssh -p 29419 renjianbo@101.43.95.130 gerrit version +``` + +如果连接成功,会显示 Gerrit 版本信息。 + +### 3. 测试 Git 推送 + +```bash +cd /d/zhini_im_android +git push origin HEAD:refs/for/master +``` + +## 常见问题 + +### Q1: 执行 firewall-cmd 提示 "not running" + +**原因**:firewalld 服务未启动 + +**解决**: +```bash +# 启动 firewalld +sudo systemctl start firewalld +sudo systemctl enable firewalld + +# 然后再执行开放端口命令 +sudo firewall-cmd --permanent --add-port=29419/tcp +sudo firewall-cmd --reload +``` + +### Q2: 端口已开放但仍无法连接 + +**可能原因**: +1. **云服务器安全组未配置**:需要在云控制台配置安全组规则 +2. **Gerrit 服务未启动**:检查服务状态 +3. **端口被其他防火墙阻止**:检查是否有其他防火墙软件 + +**排查步骤**: +```bash +# 1. 检查 Gerrit 服务状态 +cd /home/renjianbo/gerrit_install/review_site +bin/gerrit.sh status + +# 2. 检查端口监听 +netstat -tlnp | grep 29419 + +# 3. 检查防火墙规则 +sudo firewall-cmd --list-ports +# 或 +sudo iptables -L -n | grep 29419 +``` + +### Q3: 如何临时关闭防火墙测试? + +**注意**:仅用于测试,生产环境不推荐! + +```bash +# 临时关闭 firewalld +sudo systemctl stop firewalld + +# 临时关闭 iptables(不推荐) +sudo iptables -F +``` + +测试完成后,记得重新启动防火墙并正确配置规则。 + +## 完整操作示例 + +```bash +# 1. 检查当前防火墙状态 +sudo firewall-cmd --state + +# 2. 查看已开放的端口 +sudo firewall-cmd --list-ports + +# 3. 添加端口 29419 +sudo firewall-cmd --permanent --add-port=29419/tcp + +# 4. 重新加载配置 +sudo firewall-cmd --reload + +# 5. 验证 +sudo firewall-cmd --list-ports | grep 29419 + +# 6. 检查 Gerrit 服务 +netstat -tlnp | grep 29419 + +# 7. 测试连接(从客户端) +ssh -p 29419 renjianbo@101.43.95.130 gerrit version +``` + +## 相关文档 + +- [Gerrit 安装使用指南.md](./Gerrit安装使用指南.md) +- [SSH连接问题排查.md](./SSH连接问题排查.md) +- [从码云推送到Gerrit指南.md](./从码云推送到Gerrit指南.md) + +## 注意事项 + +1. ⚠️ **安全考虑**:开放端口后,确保 Gerrit 配置了适当的访问控制 +2. ⚠️ **云服务器**:如果使用云服务器,必须同时配置云控制台的安全组 +3. ⚠️ **端口冲突**:确认端口 29419 没有被其他服务占用 +4. ✅ **持久化**:使用 `--permanent` 参数确保规则在重启后仍然有效 + + diff --git a/彻底修复Change-Id.md b/彻底修复Change-Id.md new file mode 100644 index 0000000..1822a9c --- /dev/null +++ b/彻底修复Change-Id.md @@ -0,0 +1,188 @@ +# 彻底修复 Change-Id 重复问题 + +## 问题 + +即使使用了 SHA1,仍然有重复的 Change-Id。这可能是因为 filter-branch 的处理方式有问题。 + +## 最可靠的解决方案:使用 git rebase + commit-msg hook + +这是 Gerrit 推荐的标准方法,commit-msg hook 会基于提交内容自动生成唯一的 Change-Id。 + +### 步骤 1:清理 filter-branch 的备份引用 + +```bash +cd /d/zhini/zhini_im + +# 清理所有 filter-branch 创建的备份引用 +git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d 2>/dev/null || true +``` + +### 步骤 2:确保 commit-msg hook 已安装 + +```bash +mkdir -p .git/hooks +curl -o .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg +chmod +x .git/hooks/commit-msg +``` + +### 步骤 3:使用 git rebase 让 hook 自动生成 Change-Id + +```bash +# 创建备份 +git branch backup-before-rebase-fix + +# 从第一个提交开始交互式 rebase +git rebase -i --root +``` + +**在编辑器中**: +1. 将所有 `pick` 改为 `reword`(或简写 `r`) +2. 保存并关闭(`:wq`) + +**对每个提交**: +1. 提交信息编辑器会自动打开 +2. **不要修改任何内容**,直接保存退出(`:wq`) +3. commit-msg hook 会自动为这个提交生成唯一的 Change-Id +4. 继续下一个提交 + +这个过程会自动完成,每个提交都会获得基于其内容的唯一 Change-Id。 + +### 步骤 4:验证并推送 + +```bash +# 验证所有 Change-Id 都是唯一的 +git log --format='%H' | while read commit; do + git log -1 --format='%B' "$commit" | grep "^Change-Id:" | head -1 | cut -d' ' -f2 +done | sort | uniq -d + +# 如果没有输出,说明所有 Change-Id 都是唯一的 + +# 推送 +git push gerrit HEAD:refs/for/master +``` + +## 自动化脚本(如果提交太多,手动 rebase 太麻烦) + +如果提交太多,可以使用这个脚本自动化处理: + +```bash +cd /d/zhini/zhini_im + +# 1. 清理备份 +git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d 2>/dev/null || true + +# 2. 确保 hook 已安装 +mkdir -p .git/hooks +curl -o .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg +chmod +x .git/hooks/commit-msg + +# 3. 创建备份 +git branch backup-before-auto-fix + +# 4. 使用 filter-branch,但这次真正运行 commit-msg hook +# 我们需要模拟提交过程,让 hook 生成 Change-Id +git filter-branch -f --msg-filter ' + # 读取原始提交信息 + ORIGINAL=$(cat) + + # 移除旧的 Change-Id + CLEAN=$(echo "$ORIGINAL" | grep -v "^Change-Id:") + + # 将清理后的提交信息保存到临时文件 + echo "$CLEAN" > /tmp/commit_msg.txt + + # 使用 commit-msg hook 生成 Change-Id + # hook 需要环境变量 GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL 等 + export GIT_AUTHOR_NAME=$(git log -1 --format="%an" HEAD) + export GIT_AUTHOR_EMAIL=$(git log -1 --format="%ae" HEAD) + export GIT_AUTHOR_DATE=$(git log -1 --format="%ad" HEAD) + export GIT_COMMITTER_NAME=$(git log -1 --format="%cn" HEAD) + export GIT_COMMITTER_EMAIL=$(git log -1 --format="%ce" HEAD) + export GIT_COMMITTER_DATE=$(git log -1 --format="%cd" HEAD) + + # 运行 commit-msg hook + if [ -f .git/hooks/commit-msg ]; then + cat /tmp/commit_msg.txt | .git/hooks/commit-msg + else + cat /tmp/commit_msg.txt + # 如果 hook 不存在,使用 SHA1 作为后备 + echo "" + echo "Change-Id: I$(git rev-parse HEAD)" + fi + + rm -f /tmp/commit_msg.txt +' --tag-name-filter cat -- --branches --tags + +# 5. 推送 +git push gerrit HEAD:refs/for/master +``` + +## 最简单的解决方案(推荐) + +如果上面的方法还是有问题,使用这个最简单直接的方法: + +```bash +cd /d/zhini/zhini_im + +# 1. 清理所有备份 +git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d 2>/dev/null || true + +# 2. 确保 hook 已安装 +mkdir -p .git/hooks +curl -o .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg +chmod +x .git/hooks/commit-msg + +# 3. 创建备份 +git branch backup-final-fix + +# 4. 使用 filter-branch,为每个提交生成基于其完整信息的唯一 Change-Id +git filter-branch -f --msg-filter ' + # 读取原始提交信息 + ORIGINAL=$(cat) + + # 移除旧的 Change-Id + CLEAN=$(echo "$ORIGINAL" | grep -v "^Change-Id:" | sed -e :a -e "/^\$/{\$!N;ba}" -e "s/\n\$//") + + # 输出清理后的提交信息 + echo "$CLEAN" + + # 生成基于提交完整信息的唯一 Change-Id + # 使用:提交 SHA1 + 树对象 SHA1 + 父提交 SHA1 + 作者信息 + 提交者信息 + 时间戳 + COMMIT_SHA=$(git rev-parse HEAD) + TREE_SHA=$(git rev-parse HEAD^{tree}) + PARENT_SHA=$(git rev-parse HEAD^ 2>/dev/null || echo "root") + AUTHOR_NAME=$(git log -1 --format="%an" HEAD) + AUTHOR_EMAIL=$(git log -1 --format="%ae" HEAD) + AUTHOR_DATE=$(git log -1 --format="%at" HEAD) + COMMITTER_NAME=$(git log -1 --format="%cn" HEAD) + COMMITTER_EMAIL=$(git log -1 --format="%ce" HEAD) + COMMITTER_DATE=$(git log -1 --format="%ct" HEAD) + + # 组合所有信息 + UNIQUE_STRING="${COMMIT_SHA}${TREE_SHA}${PARENT_SHA}${AUTHOR_NAME}${AUTHOR_EMAIL}${AUTHOR_DATE}${COMMITTER_NAME}${COMMITTER_EMAIL}${COMMITTER_DATE}" + + # 生成 40 位十六进制字符串(使用 git hash-object) + CHANGE_ID_BASE=$(echo -n "$UNIQUE_STRING" | git hash-object --stdin | cut -c1-40) + CHANGE_ID="I${CHANGE_ID_BASE}" + + echo "" + echo "Change-Id: $CHANGE_ID" +' --tag-name-filter cat -- --branches --tags + +# 5. 验证 +echo "验证 Change-Id 唯一性..." +DUPLICATES=$(git log --format='%H' | while read commit; do + git log -1 --format='%B' "$commit" | grep "^Change-Id:" | head -1 | cut -d' ' -f2 +done | sort | uniq -d) + +if [ -z "$DUPLICATES" ]; then + echo "✅ 所有 Change-Id 都是唯一的" + echo "" + echo "现在可以推送:" + echo " git push gerrit HEAD:refs/for/master" +else + echo "⚠️ 仍有重复的 Change-Id:" + echo "$DUPLICATES" +fi + + diff --git a/快速修复Change-Id.sh b/快速修复Change-Id.sh new file mode 100755 index 0000000..0f1d1a8 --- /dev/null +++ b/快速修复Change-Id.sh @@ -0,0 +1,69 @@ +#!/bin/bash +# 快速修复 Gerrit Change-Id 问题的脚本 + +echo "==========================================" +echo "安装 Gerrit commit-msg Hook" +echo "==========================================" + +# 检查是否在 Git 仓库中 +if [ ! -d .git ]; then + echo "❌ 错误:当前目录不是 Git 仓库" + echo " 请先进入项目目录:cd /d/zhini_im_android" + exit 1 +fi + +echo "" +echo "步骤 1: 创建 hooks 目录..." +mkdir -p .git/hooks + +echo "" +echo "步骤 2: 下载 commit-msg hook..." +# 使用 HTTP 方式下载(最简单可靠) +curl -o .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg + +if [ $? -eq 0 ]; then + echo "✅ Hook 下载成功" +else + echo "❌ Hook 下载失败,请检查网络连接" + exit 1 +fi + +echo "" +echo "步骤 3: 设置执行权限..." +chmod +x .git/hooks/commit-msg + +if [ -x .git/hooks/commit-msg ]; then + echo "✅ Hook 权限设置成功" +else + echo "❌ Hook 权限设置失败" + exit 1 +fi + +echo "" +echo "步骤 4: 验证 hook 已安装..." +if [ -f .git/hooks/commit-msg ]; then + echo "✅ commit-msg hook 已安装" + echo " 文件位置: $(pwd)/.git/hooks/commit-msg" +else + echo "❌ Hook 文件不存在" + exit 1 +fi + +echo "" +echo "==========================================" +echo "Hook 安装完成!" +echo "==========================================" +echo "" +echo "下一步操作:" +echo "" +echo "1. 修改最后一次提交以添加 Change-Id:" +echo " git commit --amend --no-edit" +echo "" +echo "2. 查看提交信息确认 Change-Id 已添加:" +echo " git log -1" +echo "" +echo "3. 重新推送代码:" +echo " git push origin HEAD:refs/for/master" +echo "" + + diff --git a/快速修复命令.txt b/快速修复命令.txt new file mode 100644 index 0000000..6048be4 --- /dev/null +++ b/快速修复命令.txt @@ -0,0 +1,26 @@ +# 快速修复并上传 - 复制粘贴执行 + +# 在 Git Bash 中执行以下命令: + +cd /d/zhini/zhini_im + +# 1. 提交所有更改 +git add . +git commit -m "Update code before push to Gerrit" + +# 2. 删除旧的远程仓库 +git remote remove gerrit + +# 3. 添加 HTTP 远程仓库(推荐,不需要 SSH) +git remote add gerrit http://101.43.95.130:8080/zhini_im + +# 4. 切换到主分支 +git checkout -b master 2>/dev/null || git checkout master + +# 5. 推送代码 +git push gerrit HEAD:refs/heads/master + +# 如果提示需要用户名密码: +# 用户名: admin +# 密码: 留空(直接回车) + diff --git a/快速开放端口29419.sh b/快速开放端口29419.sh new file mode 100755 index 0000000..e19a904 --- /dev/null +++ b/快速开放端口29419.sh @@ -0,0 +1,67 @@ +#!/bin/bash +# 快速开放端口 29419 的脚本 + +echo "==========================================" +echo "快速开放 Gerrit SSH 端口 29419" +echo "==========================================" + +if [ "$EUID" -ne 0 ]; then + echo "❌ 需要 root 权限,请使用 sudo 运行" + echo "使用方法: sudo bash 快速开放端口29419.sh" + exit 1 +fi + +echo "" +echo "步骤 1: 检查防火墙类型..." + +# 检查 firewalld +if systemctl is-active --quiet firewalld 2>/dev/null; then + echo "✅ 检测到 firewalld 正在运行" + echo " 使用 firewalld 配置..." + + firewall-cmd --permanent --add-port=29419/tcp + firewall-cmd --reload + + if firewall-cmd --list-ports | grep -q "29419/tcp"; then + echo "✅ 端口 29419 已通过 firewalld 开放" + else + echo "❌ firewalld 配置失败" + fi +else + echo "⚠️ firewalld 未运行,使用 iptables 配置..." + + # 使用 iptables + iptables -I INPUT -p tcp --dport 29419 -j ACCEPT + + # 保存规则 + if [ -f /etc/sysconfig/iptables ]; then + iptables-save > /etc/sysconfig/iptables + echo "✅ iptables 规则已保存" + else + echo "⚠️ 请手动保存 iptables 规则" + fi + + if iptables -L -n | grep -q "29419"; then + echo "✅ 端口 29419 已通过 iptables 开放" + else + echo "❌ iptables 配置失败" + fi +fi + +echo "" +echo "步骤 2: 验证端口监听..." +if netstat -tlnp | grep -q ":29419"; then + echo "✅ Gerrit 正在监听端口 29419" + netstat -tlnp | grep 29419 +else + echo "⚠️ 警告:未检测到端口 29419 监听" +fi + +echo "" +echo "==========================================" +echo "完成!" +echo "==========================================" +echo "" +echo "请从客户端测试连接:" +echo " ssh -p 29419 renjianbo@101.43.95.130 gerrit version" +echo "" diff --git a/快速添加团队成员.sh b/快速添加团队成员.sh new file mode 100755 index 0000000..b609365 --- /dev/null +++ b/快速添加团队成员.sh @@ -0,0 +1,43 @@ +#!/bin/bash + +# 快速添加团队成员到开发组的脚本 +# 使用方法: ./快速添加团队成员.sh 用户名 + +USERNAME="${1}" +GROUP_NAME="${2:-Developers}" +GERRIT_URL="http://101.43.95.130:8080" + +if [ -z "$USERNAME" ]; then + echo "使用方法: $0 <用户名> [组名]" + echo "" + echo "示例:" + echo " $0 zhangsan" + echo " $0 lisi Developers" + echo "" + echo "注意:用户需要先通过 Web 界面注册账号" + echo "访问: $GERRIT_URL" + echo "点击 'Sign In' -> 'New Account'" + exit 1 +fi + +echo "==========================================" +echo "添加团队成员到组" +echo "==========================================" +echo "" +echo "用户名: $USERNAME" +echo "组名: $GROUP_NAME" +echo "" +echo "请通过 Web 界面操作:" +echo "" +echo "1. 访问: ${GERRIT_URL}/#/admin/groups/${GROUP_NAME},members" +echo "2. 点击 'Add' 按钮" +echo "3. 输入用户名: $USERNAME" +echo "4. 点击 'Add' 保存" +echo "" +echo "或者如果用户还未注册:" +echo "1. 让用户访问: ${GERRIT_URL}" +echo "2. 点击 'Sign In' -> 'New Account'" +echo "3. 填写用户名: $USERNAME" +echo "4. 然后按照上面的步骤添加到组" +echo "" + diff --git a/快速解决no_common_ancestry.txt b/快速解决no_common_ancestry.txt new file mode 100644 index 0000000..63818a6 --- /dev/null +++ b/快速解决no_common_ancestry.txt @@ -0,0 +1,28 @@ +# 快速解决 "no common ancestry" 错误 + +## 方案一:合并远程历史(推荐) + +cd /d/zhini/zhini_im + +# 1. 暂存子模块更改(如果不想提交) +git stash + +# 2. 拉取远程内容 +git fetch gerrit master + +# 3. 合并远程历史 +git merge gerrit/master --allow-unrelated-histories + +# 4. 推送到评审队列 +git push gerrit rjb_dev:refs/for/master + +## 方案二:强制推送(如果远程只有空提交) + +cd /d/zhini/zhini_im + +# 1. 暂存子模块更改 +git stash + +# 2. 强制推送(覆盖远程) +git push gerrit rjb_dev:refs/heads/master --force + diff --git a/快速解决推送问题.txt b/快速解决推送问题.txt new file mode 100644 index 0000000..f066bb8 --- /dev/null +++ b/快速解决推送问题.txt @@ -0,0 +1,27 @@ +# 快速解决推送被拒绝问题 + +## 推荐方案:推送到评审队列(最简单,不会冲突) + +cd /d/zhini/zhini_im + +# 1. 提交所有更改 +git add . +git commit -m "Initial push to Gerrit" + +# 2. 推送到评审队列 +git push gerrit rjb_dev:refs/for/master + +## 如果需要直接推送到主分支: + +cd /d/zhini/zhini_im + +# 1. 提交所有更改 +git add . +git commit -m "Initial push to Gerrit" + +# 2. 拉取远程内容 +git pull gerrit master --allow-unrelated-histories + +# 3. 如果有冲突,解决后推送 +git push gerrit rjb_dev:refs/heads/master + diff --git a/执行安装.md b/执行安装.md new file mode 100644 index 0000000..56cd24d --- /dev/null +++ b/执行安装.md @@ -0,0 +1,101 @@ +# Gerrit 重新安装执行指南 + +参考: [Gerrit 安装配置](https://blog.51cto.com/wst021sh/5086764) + +## 🚀 快速执行 + +```bash +cd /home/renjianbo/gerrit +chmod +x 标准重新安装.sh +./标准重新安装.sh +``` + +## 📋 脚本功能 + +脚本会自动完成以下步骤: + +1. ✅ 停止现有服务并清理进程 +2. ✅ 删除旧的 review_site 目录(所有数据) +3. ✅ 检查/下载 Gerrit 3.9.0 +4. ✅ 重新初始化 Gerrit +5. ✅ 配置 Gerrit(使用开发模式认证) +6. ✅ 配置启动脚本使用 Java 17 +7. ✅ 启动服务 + +## ⚙️ 配置说明 + +### 认证方式 +- 使用 `DEVELOPMENT_BECOME_ANY_ACCOUNT` 开发模式 +- 第一个登录的用户自动成为管理员 +- 无需密码,任意用户名即可登录 + +### 端口配置 +- Web 端口: 8080 +- SSH 端口: 29418 + +### Java 版本 +- 使用 JDK 17: `/usr/local/java/jdk-17.0.12+7` + +## ✅ 安装完成后 + +### 1. 清除浏览器缓存(重要!) + +- Chrome/Edge: `Ctrl+Shift+Delete` +- 选择"Cookie 和其他网站数据"和"缓存的图片和文件" +- 点击"清除数据" + +### 2. 访问 Gerrit + +- 打开浏览器 +- 访问:`http://101.43.95.130:8080` + +### 3. 创建管理员账号 + +- 点击右上角 "Sign In" +- 输入新用户名(例如:`admin`) +- **第一个登录的用户将自动成为管理员** + +### 4. 验证管理员权限 + +登录后: +- 访问:`http://101.43.95.130:8080/#/settings` +- 左侧应该显示 **"Administration"** 选项 +- 访问:`http://101.43.95.130:8080/#/admin/repos` +- 应该能看到 **"CREATE NEW"** 按钮 + +## 🔍 故障排查 + +### 服务无法启动 + +```bash +# 查看日志 +cd /home/renjianbo/gerrit_install/review_site +tail -50 logs/error_log + +# 检查 Java 版本 +/usr/local/java/jdk-17.0.12+7/bin/java -version + +# 检查端口 +netstat -tlnp | grep 8080 +``` + +### 无法访问 Web 界面 + +1. 检查服务状态:`bin/gerrit.sh status` +2. 检查防火墙:`sudo firewall-cmd --list-ports` +3. 开放端口:`sudo firewall-cmd --add-port=8080/tcp --permanent && sudo firewall-cmd --reload` + +### 权限问题 + +- 确保使用第一个登录的用户 +- 清除浏览器 Cookie 后重新登录 +- 检查 Settings 页面是否有 "Administration" 选项 + +## 📞 需要帮助? + +如果遇到问题,请提供: +1. 执行的命令 +2. 错误信息 +3. `bin/gerrit.sh status` 的输出 +4. `tail -50 logs/error_log` 的最后几行 + diff --git a/执行步骤.txt b/执行步骤.txt new file mode 100644 index 0000000..a7ac601 --- /dev/null +++ b/执行步骤.txt @@ -0,0 +1,56 @@ +请按顺序执行以下命令来完全重新安装 Gerrit: + +======================================== +步骤 1: 停止服务并清理 +======================================== +cd /home/renjianbo/gerrit_install/review_site +bin/gerrit.sh stop +cd /home/renjianbo/gerrit_install +pkill -f "gerrit.war daemon" + +======================================== +步骤 2: 删除旧安装 +======================================== +cd /home/renjianbo/gerrit_install +rm -rf review_site + +======================================== +步骤 3: 重新初始化 +======================================== +cd /home/renjianbo/gerrit_install +export JAVA_HOME=/usr/local/java/jdk-17.0.12+7 +export PATH=$JAVA_HOME/bin:$PATH + +java -jar gerrit-3.9.0.war init \ + -d review_site \ + --batch \ + --no-auto-start \ + -D gerrit.canonicalWebUrl=http://101.43.95.130:8080/ \ + --install-plugin=download-commands \ + --install-plugin=replication \ + --install-plugin=reviewnotes + +======================================== +步骤 4: 配置启动脚本 +======================================== +cd /home/renjianbo/gerrit_install/review_site +cp bin/gerrit.sh bin/gerrit.sh.bak +sed -i "2i export JAVA_HOME=/usr/local/java/jdk-17.0.12+7\nexport PATH=\$JAVA_HOME/bin:\$PATH" bin/gerrit.sh + +======================================== +步骤 5: 启动服务 +======================================== +cd /home/renjianbo/gerrit_install/review_site +bin/gerrit.sh start + +等待 5-10 秒后检查: +bin/gerrit.sh status + +======================================== +步骤 6: 验证 +======================================== +检查端口: +netstat -tlnp | grep 8080 + +访问:http://101.43.95.130:8080 + diff --git a/推送成功-后续操作指南.md b/推送成功-后续操作指南.md new file mode 100644 index 0000000..d6441da --- /dev/null +++ b/推送成功-后续操作指南.md @@ -0,0 +1,176 @@ +# 推送成功 - 后续操作指南 + +## ✅ 推送成功! + +您的代码已成功推送到 Gerrit,创建了 **12 个变更**(Change 1-12)。 + +## 查看变更 + +### 方法一:访问变更列表 + +访问以下链接查看所有变更: +``` +http://101.43.95.130:8080/#/q/project:zhini_im +``` + +### 方法二:访问具体变更 + +您可以看到每个变更的链接: +- Change 1: http://101.43.95.130:8080/c/zhini_im/+/1 +- Change 2: http://101.43.95.130:8080/c/zhini_im/+/2 +- ... 等等 + +### 方法三:在 Gerrit 主界面查看 + +1. 访问:`http://101.43.95.130:8080` +2. 在 "Outgoing reviews" 部分应该能看到您的变更 +3. 点击变更可以查看详情 + +## 进行代码评审 + +### 步骤 1:打开变更页面 + +点击任意变更链接,例如: +``` +http://101.43.95.130:8080/c/zhini_im/+/1 +``` + +### 步骤 2:进行评审 + +在变更页面: +1. **查看代码差异**:页面会显示代码变更 +2. **添加评论**:可以点击代码行添加评论 +3. **进行评审**: + - 点击 "Review" 按钮 + - 选择评审分数: + - `-2`:不允许提交 + - `-1`:需要修改 + - `0`:无意见 + - `+1`:看起来不错 + - `+2`:可以提交(需要管理员权限) + +### 步骤 3:提交变更(如果评审通过) + +如果评审通过(+2),可以: +1. 点击 "Submit" 按钮 +2. 变更会合并到主分支 + +## 快速合并所有变更 + +如果您是管理员,可以快速合并所有变更: + +### 方法一:逐个提交 + +1. 访问每个变更页面 +2. 点击 "Submit" 按钮 +3. 变更会合并到主分支 + +### 方法二:批量操作 + +1. 访问变更列表:`http://101.43.95.130:8080/#/q/project:zhini_im` +2. 选择要合并的变更 +3. 点击 "Submit" 或批量操作 + +## 合并变更到主分支 + +### 如果所有变更都通过评审: + +1. **访问变更列表**: + ``` + http://101.43.95.130:8080/#/q/project:zhini_im + ``` + +2. **逐个提交变更**: + - 点击变更链接 + - 点击 "Submit" 按钮 + - 变更会合并到主分支 + +3. **验证合并**: + - 访问:`http://101.43.95.130:8080/#/admin/projects/zhini_im` + - 应该能看到所有代码 + +## 后续开发流程 + +### 日常开发流程: + +```bash +# 1. 修改代码 +# 2. 提交更改 +git add . +git commit -m "描述您的更改" + +# 3. 推送到评审队列 +git push gerrit rjb_dev:refs/for/master + +# 4. 在 Gerrit Web 界面进行评审 +# 5. 评审通过后,代码会自动合并 +``` + +### 更新本地代码: + +```bash +# 拉取最新的主分支代码 +git fetch gerrit +git merge gerrit/master + +# 或创建新分支 +git checkout -b new-feature +git push gerrit new-feature:refs/for/master +``` + +## 查看项目代码 + +合并后,可以查看项目: + +1. **项目概览**: + ``` + http://101.43.95.130:8080/#/admin/projects/zhini_im,general + ``` + +2. **浏览代码**: + ``` + http://101.43.95.130:8080/#/admin/projects/zhini_im + ``` + +3. **查看所有变更**: + ``` + http://101.43.95.130:8080/#/q/project:zhini_im + ``` + +## 团队成员协作 + +### 其他成员查看变更: + +1. 访问:`http://101.43.95.130:8080/#/q/project:zhini_im` +2. 可以看到所有待评审的变更 +3. 可以进行代码评审 + +### 其他成员克隆项目: + +```bash +# 使用 SSH +git clone ssh://admin@101.43.95.130:29418/zhini_im + +# 或使用 HTTP +git clone http://101.43.95.130:8080/zhini_im +``` + +## 常用链接 + +- **项目列表**:http://101.43.95.130:8080/#/admin/repos +- **变更列表**:http://101.43.95.130:8080/#/q/project:zhini_im +- **项目概览**:http://101.43.95.130:8080/#/admin/projects/zhini_im +- **设置页面**:http://101.43.95.130:8080/#/settings + +## 下一步操作 + +1. ✅ **代码已推送** - 12 个变更已创建 +2. 📝 **进行评审** - 访问变更页面进行评审 +3. ✅ **提交变更** - 评审通过后点击 "Submit" +4. 🎉 **完成** - 代码合并到主分支 + +## 提示 + +- 作为管理员,您可以给自己 +2 并直接提交 +- 变更会按顺序显示,可以逐个查看和提交 +- 提交后,代码会合并到主分支,其他成员可以拉取 diff --git a/推送成功后续操作指南.md b/推送成功后续操作指南.md new file mode 100644 index 0000000..4bb1971 --- /dev/null +++ b/推送成功后续操作指南.md @@ -0,0 +1,168 @@ +# 🎉 推送成功!后续操作指南 + +## ✅ 成功信息 + +您的代码变更已成功推送到 Gerrit: + +``` +remote: SUCCESS +remote: http://101.43.95.130:8080/c/test-project/+/1 Add README file +``` + +## 下一步操作 + +### 1. 查看代码变更 + +在浏览器中打开变更 URL: +``` +http://101.43.95.130:8080/c/test-project/+/1 +``` + +您可以: +- 查看代码变更内容 +- 查看文件差异 +- 添加评论 +- 进行代码评审 + +### 2. 代码评审流程 + +#### 评审者操作(如果有其他用户) + +1. **查看变更**:打开变更 URL +2. **添加评论**:在代码行上点击添加评论 +3. **评审**: + - 点击 "Review" 按钮 + - 选择评审结果: + - **+2 Code-Review**:批准(需要管理员权限) + - **+1 Code-Review**:看起来不错 + - **-1 Code-Review**:需要修改 + - **+1 Verified**:已验证(需要 CI 或管理员) + +#### 提交者操作 + +1. **查看评审意见**:在变更页面查看评论 +2. **修改代码**(如果有意见): + ```bash + cd /d/ttt/test-project + + # 修改代码 + # ... 进行修改 ... + + # 提交修改 + git add . + git commit --amend --no-edit + + # 重新推送(会自动更新原变更) + git push origin HEAD:refs/for/master + ``` + +### 3. 合并代码 + +当变更获得: +- **+2 Code-Review**(批准) +- **+1 Verified**(已验证) + +变更会自动合并,或者您可以点击 "Submit" 按钮手动合并。 + +### 4. 合并后的操作 + +```bash +cd /d/ttt/test-project + +# 更新本地仓库 +git checkout master +git pull origin master + +# 删除已合并的特性分支(如果有) +git branch -d feature-branch +``` + +## 优化配置(推荐) + +### 创建 SSH 配置文件 + +为了避免每次都要输入长命令,创建 SSH 配置文件: + +```bash +# 创建配置文件 +mkdir -p ~/.ssh +cat > ~/.ssh/config << 'EOF' +Host 101.43.95.130 + Port 29418 + PubkeyAcceptedKeyTypes +ssh-rsa + PubkeyAcceptedAlgorithms +ssh-rsa +EOF + +# 设置权限 +chmod 600 ~/.ssh/config +``` + +配置后,以后可以直接使用: +```bash +git push origin HEAD:refs/for/master +``` + +### 配置 Git 用户信息 + +```bash +# 配置全局用户信息 +git config --global user.name "Your Name" +git config --global user.email "263303411@qq.com" +``` + +## 常用 Gerrit 操作 + +### 查看所有变更 + +访问:`http://101.43.95.130:8080/#/q/status:open` + +### 查看我的变更 + +访问:`http://101.43.95.130:8080/#/q/owner:renjianbo` + +### 查看项目 + +访问:`http://101.43.95.130:8080/#/admin/projects/test-project` + +## 完整的开发流程 + +```bash +# 1. 克隆项目 +git clone ssh://renjianbo@101.43.95.130:29418/test-project +cd test-project + +# 2. 创建特性分支(可选) +git checkout -b feature/new-feature + +# 3. 修改代码 +# ... 进行修改 ... + +# 4. 提交代码 +git add . +git commit -m "Add new feature" + +# 5. 推送代码评审 +git push origin HEAD:refs/for/master + +# 6. 在 Gerrit Web 界面进行评审 + +# 7. 如果有修改意见,修改后重新推送 +git commit --amend +git push origin HEAD:refs/for/master + +# 8. 合并后,更新本地仓库 +git checkout master +git pull origin master +``` + +## 恭喜! + +您已经成功完成了: +- ✅ Gerrit 安装和配置 +- ✅ 项目创建 +- ✅ SSH 密钥配置 +- ✅ 代码推送 +- ✅ 变更创建 + +现在可以在 Gerrit 中进行代码评审和协作了! + diff --git a/数据库检查结果.md b/数据库检查结果.md new file mode 100644 index 0000000..d7f45a0 --- /dev/null +++ b/数据库检查结果.md @@ -0,0 +1,90 @@ +# 数据库检查结果 + +## 检查发现 + +1. **数据库表为空**:新安装的 Gerrit 数据库可能还没有创建表结构 +2. **但账户可以登录**:从日志看,账户 1000000 可以成功登录(`a/1000000`) + +## 问题分析 + +这**不是数据库问题**,而是**浏览器 Cookie 问题**。原因: + +1. ✅ 服务器端登录成功(日志显示 `a/1000000`) +2. ✅ 账户存在(否则无法登录) +3. ❌ 浏览器没有保存 Cookie(所以显示匿名) + +## Google Chrome 浏览器的 Cookie 问题 + +Chrome 浏览器对 Cookie 有严格的安全策略,特别是: +- SameSite 属性 +- Secure 属性 +- 第三方 Cookie 限制 + +## 解决方案 + +### 方案一:检查 Chrome Cookie 设置(最重要) + +1. **打开 Chrome 设置**: + - 点击右上角三个点 → 设置 + - 或访问:`chrome://settings/cookies` + +2. **检查 Cookie 设置**: + - 确保**不是**"阻止所有 Cookie" + - 建议选择"允许所有 Cookie" + - 或者"仅阻止第三方 Cookie" + +3. **检查网站特定设置**: + - 访问:`http://101.43.95.130:8080` + - 点击地址栏左侧的锁图标或"不安全" + - 点击"Cookie" + - 确保允许 Cookie + +### 方案二:使用开发者工具检查 + +1. **按 `F12` 打开开发者工具** +2. **切换到 Application 标签** +3. **左侧选择 Cookies → `http://101.43.95.130:8080`** +4. **点击 Account ID `1000000` 登录** +5. **查看是否出现 Cookie** + +如果没有 Cookie,说明 Chrome 阻止了 Cookie。 + +### 方案三:检查网络请求 + +1. **按 `F12` → Network 标签** +2. **点击 Account ID `1000000` 登录** +3. **查看 `/login?account_id=1000000` 请求** +4. **查看 Response Headers 中的 `Set-Cookie`** +5. **查看后续请求的 Request Headers 中是否有 `Cookie`** + +### 方案四:尝试 Firefox 浏览器 + +Firefox 对 Cookie 的限制通常较少,可以尝试: +1. 下载并安装 Firefox +2. 访问:`http://101.43.95.130:8080` +3. 点击 Account ID `1000000` 登录 +4. 如果 Firefox 可以登录,说明是 Chrome 的 Cookie 策略问题 + +### 方案五:使用无痕模式测试 + +1. 按 `Ctrl+Shift+N` 打开无痕窗口 +2. 访问:`http://101.43.95.130:8080` +3. 点击 Account ID `1000000` 登录 + +如果无痕模式下可以登录,说明是 Chrome 扩展程序或设置的问题。 + +## 当前配置 + +```ini +[httpd] + listenUrl = http://*:8080/ + cookieSecure = false + cookieSameSite = NONE +``` + +这是最宽松的 Cookie 配置,应该可以工作。 + +## 结论 + +**这不是数据库问题**,而是 **Chrome 浏览器的 Cookie 安全策略**导致的。请按照上述方案检查 Chrome 的 Cookie 设置。 + diff --git a/最终修复Change-Id方案.md b/最终修复Change-Id方案.md new file mode 100644 index 0000000..b2f152f --- /dev/null +++ b/最终修复Change-Id方案.md @@ -0,0 +1,138 @@ +# 最终修复 Change-Id 重复问题 + +## 问题分析 + +多个提交使用了相同的 Change-Id,导致 Gerrit 拒绝推送。 + +## 解决方案 + +### 方法一:使用每个提交的 SHA1 作为 Change-Id(最简单可靠) + +每个 Git 提交的 SHA1 都是唯一的,直接使用它作为 Change-Id: + +```bash +cd /d/zhini/zhini_im + +# 1. 创建备份 +git branch backup-before-final-fix + +# 2. 为所有提交重新生成 Change-Id(使用每个提交的 SHA1) +git filter-branch -f --msg-filter ' + # 读取并移除旧的 Change-Id + cat | grep -v "^Change-Id:" + + # 使用当前提交的 SHA1 生成唯一的 Change-Id + echo "" + echo "Change-Id: I$(git rev-parse HEAD)" +' --tag-name-filter cat -- --branches --tags + +# 3. 验证 +git log --format='%H' | while read commit; do + changeid=$(git log -1 --format='%B' "$commit" | grep "^Change-Id:" | head -1 | cut -d' ' -f2) + echo "$commit $changeid" +done | sort -k2 | uniq -d -f1 + +# 如果没有输出,说明所有 Change-Id 都是唯一的 + +# 4. 推送 +git push gerrit HEAD:refs/for/master +``` + +### 方法二:使用 git rebase 让 hook 自动生成(最标准) + +这个方法会让 commit-msg hook 为每个提交自动生成正确的 Change-Id: + +```bash +cd /d/zhini/zhini_im + +# 1. 确保 hook 已安装 +mkdir -p .git/hooks +curl -o .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg +chmod +x .git/hooks/commit-msg + +# 2. 创建备份 +git branch backup-before-rebase + +# 3. 从根提交开始 rebase +git rebase -i --root + +# 在编辑器中: +# - 将所有 'pick' 改为 'reword' +# - 保存并关闭(:wq) +# +# 对每个提交: +# - 提交信息编辑器会自动打开 +# - 不要修改任何内容,直接保存退出(:wq) +# - commit-msg hook 会自动为每个提交生成唯一的 Change-Id +# - 继续下一个提交(git rebase --continue) + +# 4. 推送 +git push gerrit HEAD:refs/for/master +``` + +### 方法三:使用脚本批量处理(自动化) + +如果提交很多,使用这个脚本: + +```bash +cd /d/zhini/zhini_im + +# 创建备份 +git branch backup-before-script-fix + +# 执行批量修复 +git filter-branch -f --msg-filter ' + # 读取原始提交信息 + ORIGINAL=$(cat) + + # 移除所有 Change-Id 行 + CLEAN=$(echo "$ORIGINAL" | grep -v "^Change-Id:") + + # 输出清理后的内容 + echo "$CLEAN" | sed -e :a -e "/^\$/{\$!N;ba}" -e "s/\n\$//" + + # 添加新的 Change-Id(使用提交的 SHA1) + echo "" + echo "Change-Id: I$(git rev-parse HEAD)" +' --tag-name-filter cat -- --branches --tags + +# 验证并推送 +git push gerrit HEAD:refs/for/master +``` + +## 推荐操作(最简单) + +直接执行这个命令: + +```bash +cd /d/zhini/zhini_im + +# 一步完成:移除所有旧的 Change-Id,为每个提交使用其 SHA1 生成新的 +git filter-branch -f --msg-filter 'cat | grep -v "^Change-Id:" && echo "" && echo "Change-Id: I$(git rev-parse HEAD)"' --tag-name-filter cat -- --branches --tags + +# 推送 +git push gerrit HEAD:refs/for/master +``` + +## 如果还是有问题 + +检查是否所有提交都有 Change-Id: + +```bash +# 检查所有提交的 Change-Id +git log --format='%H' | while read commit; do + changeid=$(git log -1 --format='%B' "$commit" | grep "^Change-Id:" | head -1 | cut -d' ' -f2) + if [ -z "$changeid" ]; then + echo "缺少 Change-Id: $commit" + else + echo "$commit: $changeid" + fi +done + +# 检查重复的 Change-Id +git log --format='%H' | while read commit; do + git log -1 --format='%B' "$commit" | grep "^Change-Id:" | head -1 | cut -d' ' -f2 +done | sort | uniq -d +``` + + diff --git a/最终解决方案.md b/最终解决方案.md new file mode 100644 index 0000000..67a6af2 --- /dev/null +++ b/最终解决方案.md @@ -0,0 +1,95 @@ +# Gerrit HTTP 推送认证问题 - 最终解决方案 + +## 问题根源 + +`DEVELOPMENT_BECOME_ANY_ACCOUNT` 模式默认不支持 HTTP Basic 认证进行 Git 操作。我已经在服务器端添加了 `gitBasicAuth = true` 配置。 + +## 解决方案 + +### 步骤 1:等待服务器重启完成 + +服务器正在重启,请等待 10-15 秒。 + +### 步骤 2:重新尝试推送 + +在您的本地电脑上执行: + +```bash +cd /d/ttt/test-project + +# 确保远程 URL 包含用户名 +git remote set-url origin http://renjianbo@101.43.95.130:8080/test-project + +# 清除已保存的凭证(如果有) +git credential reject </dev/null || true + fi +fi +pkill -9 -f "gerrit.war" 2>/dev/null || true +sleep 2 +echo "✓ 服务已停止" +echo "" + +# 2. 删除旧安装 +echo "[2/7] 删除旧安装..." +cd ${GERRIT_HOME} +rm -rf review_site +echo "✓ 已删除旧安装" +echo "" + +# 3. 检查并下载 Gerrit +echo "[3/7] 检查安装包..." +if [ ! -f "gerrit-${GERRIT_VERSION}.war" ]; then + echo "下载 Gerrit ${GERRIT_VERSION}..." + wget -q https://gerrit-releases.storage.googleapis.com/gerrit-${GERRIT_VERSION}.war +fi +echo "✓ 安装包就绪" +echo "" + +# 4. 初始化 Gerrit +echo "[4/7] 初始化 Gerrit(这可能需要几分钟)..." +cd ${GERRIT_HOME} +java -Dgerrit.canonicalWebUrl=http://${SERVER_IP}:${GERRIT_PORT}/ \ + -jar gerrit-${GERRIT_VERSION}.war init \ + -d review_site \ + --batch \ + --no-auto-start \ + --install-plugin=download-commands \ + --install-plugin=replication \ + --install-plugin=reviewnotes + +echo "✓ 初始化完成" +echo "" + +# 5. 配置 Gerrit +echo "[5/7] 配置 Gerrit..." +cd ${GERRIT_HOME}/review_site + +# 创建配置文件 +cat > etc/gerrit.config << EOF +[gerrit] + basePath = git + canonicalWebUrl = http://${SERVER_IP}:${GERRIT_PORT}/ + serverId = $(date +%s) +[database] + type = h2 + database = db/ReviewDB +[auth] + type = DEVELOPMENT_BECOME_ANY_ACCOUNT + gitBasicAuth = true +[sshd] + listenAddress = *:${GERRIT_SSH_PORT} +[httpd] + listenUrl = http://*:${GERRIT_PORT}/ + cookieSecure = false + cookieSameSite = LAX + cookiePath = / +[cache] + directory = cache +[index] + type = LUCENE +[receive] + enableSignedPush = false +EOF + +echo "✓ 配置完成" +echo "" + +# 6. 配置启动脚本 +echo "[6/7] 配置启动脚本..." +cd ${GERRIT_HOME}/review_site + +# 备份原脚本 +cp bin/gerrit.sh bin/gerrit.sh.bak + +# 在脚本开头添加 Java 环境变量 +if ! grep -q "JAVA_HOME.*jdk-17" bin/gerrit.sh; then + sed -i "2i export JAVA_HOME=${JAVA_HOME}\nexport PATH=\$JAVA_HOME/bin:\$PATH" bin/gerrit.sh +fi + +echo "✓ 启动脚本已配置" +echo "" + +# 7. 启动服务 +echo "[7/7] 启动 Gerrit 服务..." +cd ${GERRIT_HOME}/review_site +bin/gerrit.sh start + +echo "等待服务启动..." +sleep 8 + +# 检查服务状态 +if bin/gerrit.sh status 2>&1 | grep -q "Gerrit running\|Running"; then + echo "✓ 服务启动成功" +else + echo "检查服务状态..." + bin/gerrit.sh status 2>&1 | head -10 +fi + +echo "" +echo "==========================================" +echo "安装完成!" +echo "==========================================" +echo "" +echo "访问地址: http://${SERVER_IP}:${GERRIT_PORT}" +echo "" +echo "重要提示:" +echo "1. 清除浏览器 Cookie 和缓存" +echo "2. 访问上述地址" +echo "3. 点击 'Sign In',输入用户名(例如:admin)" +echo "4. 第一个登录的用户将自动成为管理员" +echo "5. 登录后应该能看到 'CREATE NEW' 按钮" +echo "" +echo "常用命令:" +echo " 查看状态: cd ${GERRIT_HOME}/review_site && bin/gerrit.sh status" +echo " 查看日志: tail -f ${GERRIT_HOME}/review_site/logs/error_log" +echo " 停止服务: cd ${GERRIT_HOME}/review_site && bin/gerrit.sh stop" +echo " 重启服务: cd ${GERRIT_HOME}/review_site && bin/gerrit.sh restart" +echo "" + diff --git a/检查并修复Change-Id.sh b/检查并修复Change-Id.sh new file mode 100644 index 0000000..73da5a4 --- /dev/null +++ b/检查并修复Change-Id.sh @@ -0,0 +1,57 @@ +#!/bin/bash + +# 检查并修复重复的 Change-Id + +echo "==========================================" +echo "检查 Change-Id 重复问题" +echo "==========================================" +echo "" + +cd /d/zhini/zhini_im || exit 1 + +# 1. 检查所有提交的 Change-Id +echo "步骤 1: 检查所有提交的 Change-Id..." +echo "" + +# 找出所有 Change-Id +git log --format='%H' | while read commit; do + changeid=$(git log -1 --format='%B' "$commit" | grep "^Change-Id:" | head -1 | cut -d' ' -f2) + if [ -n "$changeid" ]; then + echo "$commit $changeid" + else + echo "$commit MISSING" + fi +done > /tmp/all_changeids.txt + +# 检查重复的 +echo "步骤 2: 查找重复的 Change-Id..." +DUPLICATES=$(cat /tmp/all_changeids.txt | awk '{print $2}' | sort | uniq -d) + +if [ -z "$DUPLICATES" ]; then + echo "✅ 没有发现重复的 Change-Id" +else + echo "⚠️ 发现重复的 Change-Id:" + echo "$DUPLICATES" + echo "" + echo "这些提交使用了相同的 Change-Id:" + for dup in $DUPLICATES; do + echo "" + echo "Change-Id: $dup" + grep " $dup$" /tmp/all_changeids.txt | awk '{print " Commit: " $1}' + done +fi + +echo "" +echo "步骤 3: 统计信息..." +TOTAL=$(git rev-list --count HEAD) +WITH_CHANGEID=$(cat /tmp/all_changeids.txt | grep -v "MISSING" | wc -l) +MISSING=$(cat /tmp/all_changeids.txt | grep "MISSING" | wc -l) + +echo "总提交数: $TOTAL" +echo "有 Change-Id: $WITH_CHANGEID" +echo "缺少 Change-Id: $MISSING" + +# 清理临时文件 +rm -f /tmp/all_changeids.txt + + diff --git a/检查并启动服务.sh b/检查并启动服务.sh new file mode 100644 index 0000000..e93cb5b --- /dev/null +++ b/检查并启动服务.sh @@ -0,0 +1,94 @@ +#!/bin/bash + +# Gerrit 服务检查和启动脚本 + +GERRIT_HOME="/home/renjianbo/gerrit_install" +JAVA_HOME="/usr/local/java/jdk-17.0.12+7" + +echo "==========================================" +echo "检查 Gerrit 服务状态" +echo "==========================================" +echo "" + +# 检查 review_site 是否存在 +if [ ! -d "${GERRIT_HOME}/review_site" ]; then + echo "❌ review_site 目录不存在!" + echo "" + echo "需要重新初始化 Gerrit,请执行:" + echo " cd /home/renjianbo/gerrit" + echo " ./reinit_gerrit.sh" + echo "" + exit 1 +fi + +cd ${GERRIT_HOME}/review_site + +# 检查服务状态 +echo "检查服务状态..." +if [ -f "bin/gerrit.sh" ]; then + bin/gerrit.sh status 2>&1 + STATUS=$? + + if [ $STATUS -ne 0 ] || ! bin/gerrit.sh status 2>&1 | grep -q "Running\|Gerrit running"; then + echo "" + echo "服务未运行,正在启动..." + echo "" + + # 设置 Java 环境 + export JAVA_HOME=$JAVA_HOME + export PATH=$JAVA_HOME/bin:$PATH + + # 确保启动脚本使用 Java 17 + if ! grep -q "JAVA_HOME.*jdk-17" bin/gerrit.sh 2>/dev/null; then + echo "更新启动脚本使用 Java 17..." + cp bin/gerrit.sh bin/gerrit.sh.bak + sed -i "2i export JAVA_HOME=${JAVA_HOME}\nexport PATH=\$JAVA_HOME/bin:\$PATH" bin/gerrit.sh + fi + + # 启动服务 + bin/gerrit.sh start + + sleep 5 + + # 再次检查状态 + echo "" + echo "检查启动结果..." + bin/gerrit.sh status 2>&1 + + if bin/gerrit.sh status 2>&1 | grep -q "Running\|Gerrit running"; then + echo "" + echo "✅ 服务启动成功!" + echo "" + echo "访问地址: http://101.43.95.130:8080" + else + echo "" + echo "❌ 服务启动失败,请查看日志:" + echo " tail -f ${GERRIT_HOME}/review_site/logs/error_log" + fi + else + echo "" + echo "✅ 服务正在运行" + echo "" + echo "访问地址: http://101.43.95.130:8080" + fi +else + echo "❌ 未找到 bin/gerrit.sh" + echo "review_site 可能未正确初始化" + exit 1 +fi + +echo "" +echo "检查端口监听..." +if command -v netstat &> /dev/null; then + netstat -tlnp 2>/dev/null | grep ":8080" || echo "⚠️ 端口 8080 未被监听" +elif command -v ss &> /dev/null; then + ss -tlnp 2>/dev/null | grep ":8080" || echo "⚠️ 端口 8080 未被监听" +fi + +echo "" +echo "检查进程..." +ps aux | grep "[g]errit.war daemon" | head -2 + +echo "" +echo "==========================================" + diff --git a/检查并开放端口29419.md b/检查并开放端口29419.md new file mode 100644 index 0000000..d04cfe0 --- /dev/null +++ b/检查并开放端口29419.md @@ -0,0 +1,161 @@ +# 检查并开放端口 29419 - 操作步骤 + +## 当前状态 + +✅ **腾讯云安全组**:已配置开放 29419 端口 +✅ **Gerrit 服务**:正在监听 29419 端口(进程 29768) +❌ **本地防火墙**:可能仍在阻止端口访问 + +## 需要执行的命令 + +请在服务器上以 root 权限执行以下命令: + +### 步骤 1:检查防火墙状态 + +```bash +# 检查 firewalld 是否运行 +sudo systemctl status firewalld + +# 检查 iptables 规则 +sudo iptables -L -n | grep 29419 +``` + +### 步骤 2:开放端口(选择一种方法) + +#### 方法 A:使用 firewall-cmd(如果 firewalld 正在运行) + +```bash +# 添加端口 +sudo firewall-cmd --permanent --add-port=29419/tcp + +# 重新加载 +sudo firewall-cmd --reload + +# 验证 +sudo firewall-cmd --list-ports | grep 29419 +``` + +#### 方法 B:使用 iptables(如果使用 iptables) + +```bash +# 添加规则 +sudo iptables -I INPUT -p tcp --dport 29419 -j ACCEPT + +# 保存规则(CentOS 7) +sudo iptables-save > /etc/sysconfig/iptables + +# 验证 +sudo iptables -L -n | grep 29419 +``` + +### 步骤 3:验证端口可访问性 + +从**客户端**(您的 Windows 电脑)测试: + +```bash +# 测试 SSH 连接 +ssh -p 29419 renjianbo@101.43.95.130 gerrit version +``` + +如果成功,会显示 Gerrit 版本信息。 + +### 步骤 4:测试 Git 推送 + +```bash +cd /d/zhini_im_android +git push origin HEAD:refs/for/master +``` + +## 如果仍然无法连接 + +### 检查 iptables 默认策略 + +```bash +# 查看 INPUT 链的默认策略 +sudo iptables -L INPUT -n + +# 如果默认策略是 DROP,需要确保有 ACCEPT 规则 +# 或者临时修改策略(不推荐生产环境) +sudo iptables -P INPUT ACCEPT +``` + +### 检查是否有其他防火墙软件 + +```bash +# 检查是否有其他防火墙服务 +sudo systemctl list-units | grep -i firewall +sudo systemctl list-units | grep -i iptables +``` + +### 检查 SELinux(如果启用) + +```bash +# 检查 SELinux 状态 +getenforce + +# 如果启用,可能需要配置 SELinux 规则 +sudo semanage port -a -t ssh_port_t -p tcp 29419 +``` + +## 快速诊断脚本 + +在服务器上执行以下命令进行完整诊断: + +```bash +echo "=== 1. 检查 Gerrit 服务 ===" +netstat -tlnp | grep 29419 + +echo "" +echo "=== 2. 检查 firewalld ===" +sudo systemctl status firewalld 2>/dev/null | head -3 + +echo "" +echo "=== 3. 检查 firewall-cmd 规则 ===" +sudo firewall-cmd --list-ports 2>/dev/null || echo "firewalld 未运行" + +echo "" +echo "=== 4. 检查 iptables 规则 ===" +sudo iptables -L -n | grep 29419 || echo "未找到 29419 规则" + +echo "" +echo "=== 5. 检查 iptables 默认策略 ===" +sudo iptables -L INPUT -n | head -5 +``` + +## 完整解决方案(一键执行) + +如果确定使用 iptables,可以执行: + +```bash +# 添加规则 +sudo iptables -I INPUT -p tcp --dport 29419 -j ACCEPT + +# 保存规则 +sudo iptables-save > /etc/sysconfig/iptables + +# 验证 +sudo iptables -L -n | grep 29419 +``` + +如果确定使用 firewalld,可以执行: + +```bash +# 确保 firewalld 运行 +sudo systemctl start firewalld +sudo systemctl enable firewalld + +# 添加端口 +sudo firewall-cmd --permanent --add-port=29419/tcp +sudo firewall-cmd --reload + +# 验证 +sudo firewall-cmd --list-ports | grep 29419 +``` + +## 注意事项 + +1. ⚠️ 如果修改了防火墙规则,建议先测试,确保不会影响其他服务 +2. ⚠️ 生产环境建议使用更严格的防火墙规则(限制源 IP) +3. ✅ 修改后记得保存规则,确保重启后仍然有效 + + diff --git a/正确修复Change-Id.sh b/正确修复Change-Id.sh new file mode 100644 index 0000000..227b0c5 --- /dev/null +++ b/正确修复Change-Id.sh @@ -0,0 +1,83 @@ +#!/bin/bash + +# 正确修复 Change-Id:每个提交使用自己的 SHA1 + +echo "==========================================" +echo "正确修复 Change-Id - 每个提交使用自己的 SHA1" +echo "==========================================" +echo "" + +cd /d/zhini/zhini_im || exit 1 + +# 1. 清理备份 +echo "步骤 1: 清理 filter-branch 备份..." +git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d 2>/dev/null || true +echo "✅ 清理完成" +echo "" + +# 2. 创建新备份 +echo "步骤 2: 创建备份..." +BACKUP_BRANCH="backup-$(date +%Y%m%d-%H%M%S)" +git branch "$BACKUP_BRANCH" +echo "✅ 备份分支: $BACKUP_BRANCH" +echo "" + +# 3. 修复 Change-Id +echo "步骤 3: 为每个提交生成唯一的 Change-Id..." +echo "关键:使用 \$GIT_COMMIT 环境变量(正在处理的提交的 SHA1)" +echo "" + +# 设置环境变量以消除警告 +export FILTER_BRANCH_SQUELCH_WARNING=1 + +git filter-branch -f --msg-filter ' + # 读取原始提交信息 + ORIGINAL=$(cat) + + # 移除旧的 Change-Id + CLEAN=$(echo "$ORIGINAL" | grep -v "^Change-Id:" | sed -e :a -e "/^\$/{\$!N;ba}" -e "s/\n\$//") + + # 输出清理后的提交信息 + echo "$CLEAN" + + # 关键:使用 $GIT_COMMIT 环境变量,它包含正在被处理的提交的 SHA1 + # 而不是使用 git rev-parse HEAD(那会返回当前 HEAD) + CURRENT_COMMIT="${GIT_COMMIT}" + + # 为当前提交生成唯一的 Change-Id + CHANGE_ID="I${CURRENT_COMMIT}" + + echo "" + echo "Change-Id: $CHANGE_ID" +' --tag-name-filter cat -- --branches --tags + +if [ $? -eq 0 ]; then + echo "" + echo "✅ Change-Id 修复完成!" + echo "" + + # 验证 + echo "步骤 4: 验证 Change-Id 唯一性..." + DUPLICATES=$(git log --format='%H' | while read commit; do + git log -1 --format='%B' "$commit" | grep "^Change-Id:" | head -1 | cut -d' ' -f2 + done | sort | uniq -d) + + if [ -z "$DUPLICATES" ]; then + echo "✅ 所有 Change-Id 都是唯一的!" + echo "" + echo "现在可以推送:" + echo " git push gerrit HEAD:refs/for/master" + else + echo "⚠️ 仍有重复的 Change-Id:" + echo "$DUPLICATES" + echo "" + echo "请检查并重试" + fi +else + echo "" + echo "❌ 修复失败" + echo "可以恢复备份:git reset --hard $BACKUP_BRANCH" + exit 1 +fi + + diff --git a/正确的Git克隆命令.md b/正确的Git克隆命令.md new file mode 100644 index 0000000..6babd74 --- /dev/null +++ b/正确的Git克隆命令.md @@ -0,0 +1,98 @@ +# 正确的 Git 克隆命令 + +## ❌ 错误的 URL + +```bash +git clone http://101.43.95.130:8080/#/admin/projects/test-project +``` + +**问题**:`#/admin/projects/` 是 Web 界面的路径,不是 Git 仓库的 URL。 + +## ✅ 正确的克隆命令 + +### 方式一:通过 HTTP(推荐,最简单) + +```bash +git clone http://101.43.95.130:8080/test-project +``` + +**注意**: +- 不要包含 `#/admin/projects/` +- 直接使用项目名称:`test-project` +- 如果提示输入用户名,输入:`renjianbo`(密码留空) + +### 方式二:通过 SSH(需要配置 SSH 密钥) + +```bash +git clone ssh://renjianbo@101.43.95.130:29418/test-project +``` + +**注意**: +- 需要先配置 SSH 密钥 +- 端口是 `29418`(不是 22) + +## 完整的操作步骤 + +### 1. 克隆项目 + +```bash +# 在您的本地电脑上执行 +git clone http://101.43.95.130:8080/test-project +``` + +如果提示输入用户名,输入:`renjianbo`,密码留空。 + +### 2. 进入项目目录 + +```bash +cd test-project +``` + +### 3. 创建初始文件并提交 + +```bash +echo "# Test Project" > README.md +git add README.md +git commit -m "Add README file" +``` + +### 4. 推送到 Gerrit 进行评审 + +```bash +# 推送到评审队列(关键:推送到 refs/for/master) +git push origin HEAD:refs/for/master +``` + +**重要**:必须推送到 `refs/for/master`,不是直接推送到 `master`。 + +### 5. 查看变更 + +推送成功后,Gerrit 会返回一个 URL,在浏览器中打开即可查看变更详情。 + +## 如果克隆失败 + +### 检查项目是否存在 + +访问:`http://101.43.95.130:8080/#/admin/projects/test-project` + +如果项目不存在,可能需要: +1. 刷新 Repositories 页面 +2. 或者重新创建项目 + +### 检查权限 + +确保您有访问项目的权限。如果是新创建的项目,通常创建者应该有权限。 + +## 快速参考 + +```bash +# 克隆项目 +git clone http://101.43.95.130:8080/test-project + +# 推送代码评审 +git push origin HEAD:refs/for/master + +# 直接推送(跳过评审,个人使用) +git push origin HEAD:refs/heads/master +``` + diff --git a/浏览器Cookie问题解决方案.md b/浏览器Cookie问题解决方案.md new file mode 100644 index 0000000..a0c8772 --- /dev/null +++ b/浏览器Cookie问题解决方案.md @@ -0,0 +1,155 @@ +# 浏览器 Cookie 问题解决方案 + +## 问题现象 +点击 Account ID 登录后,服务器端显示登录成功(日志中有 `a/1000008`),但浏览器界面仍然显示 "ANONYMOUS"。 + +## 问题原因 +这是典型的 **浏览器 Cookie 问题**。服务器端登录成功,但浏览器没有正确保存或发送 Cookie。 + +## 解决方案 + +### 方案一:完全清除浏览器数据(最重要!) + +**这是最关键的步骤,必须执行:** + +1. **打开浏览器设置**: + - Chrome/Edge: 点击右上角三个点 → 设置 + - 或直接按 `Ctrl+Shift+Delete` + +2. **清除浏览数据**: + - 时间范围:选择"所有时间" + - 勾选以下选项: + - ✅ Cookie 和其他网站数据 + - ✅ 缓存的图片和文件 + - ✅ 浏览历史记录 + - 点击"清除数据" + +3. **关闭所有浏览器窗口**,重新打开浏览器 + +4. **重新访问**:`http://101.43.95.130:8080` + +### 方案二:使用无痕模式(推荐测试) + +1. 按 `Ctrl+Shift+N` 打开无痕窗口 +2. 访问:`http://101.43.95.130:8080` +3. 点击 Account ID 登录 +4. 如果无痕模式下可以登录,说明是浏览器缓存问题 + +### 方案三:检查浏览器 Cookie 设置 + +1. **检查是否阻止了第三方 Cookie**: + - Chrome/Edge: 设置 → 隐私设置和安全性 → Cookie 和其他网站数据 + - 确保允许 Cookie + +2. **检查网站特定的 Cookie 设置**: + - 在地址栏点击锁图标或"不安全" + - 查看 Cookie 设置 + - 确保允许 Cookie + +### 方案四:手动检查 Cookie + +1. **打开开发者工具**: + - 按 `F12` 打开开发者工具 + - 切换到 **Application**(应用程序)标签(Chrome)或 **存储** 标签(Firefox) + +2. **查看 Cookie**: + - 左侧选择 **Cookies** → `http://101.43.95.130:8080` + - 登录后,应该能看到 Gerrit 相关的 Cookie(如 `GerritAccount`) + +3. **如果没有 Cookie**: + - 说明浏览器阻止了 Cookie + - 需要检查浏览器设置 + +### 方案五:使用不同的浏览器测试 + +如果当前浏览器有问题,可以尝试: +- Chrome +- Firefox +- Edge +- Safari + +## 验证登录是否成功 + +### 方法一:查看浏览器开发者工具 + +1. 按 `F12` 打开开发者工具 +2. 切换到 **Network**(网络)标签 +3. 刷新页面 +4. 查看任意请求的 **Headers**(请求头) +5. 在 **Request Headers** 中查找 `Cookie:` 字段 +6. 如果看到 `GerritAccount=...` 等 Cookie,说明 Cookie 已保存 + +### 方法二:查看服务器日志 + +```bash +cd /home/renjianbo/gerrit_install/review_site +tail -f logs/httpd_log +``` + +登录后,日志中应该显示 `a/1000008`(已登录),而不是 `-`(匿名用户)。 + +## 当前配置 + +已更新的配置: +- `canonicalWebUrl = http://101.43.95.130:8080/` +- `cookieSecure = false`(允许 HTTP 使用 Cookie) +- `cookieSameSite = LAX`(允许跨站 Cookie) + +## 如果仍然无法登录 + +### 检查清单 + +1. ✅ 已清除浏览器缓存和 Cookie +2. ✅ 已关闭并重新打开浏览器 +3. ✅ 浏览器允许 Cookie +4. ✅ 使用正确的访问地址:`http://101.43.95.130:8080` +5. ✅ 服务器日志显示登录成功(`a/1000008`) + +### 进一步排查 + +如果以上都做了还是不行,请: + +1. **检查浏览器控制台**: + - 按 `F12` → **Console**(控制台)标签 + - 查看是否有 JavaScript 错误 + +2. **检查网络请求**: + - 按 `F12` → **Network**(网络)标签 + - 刷新页面 + - 查看登录相关的请求(`/login?account_id=1000008`) + - 检查响应头中是否有 `Set-Cookie` 字段 + +3. **提供信息**: + - 浏览器类型和版本 + - 控制台的错误信息 + - 网络请求的详细信息 + +## 临时解决方案 + +如果 Cookie 问题无法解决,可以: + +1. **每次访问都重新登录**(虽然麻烦,但可以工作) +2. **使用 SSH 方式操作**(不依赖 Web 登录) +3. **考虑使用反向代理配置 HTTPS**(可以解决一些 Cookie 问题) + +## 常见问题 + +### Q: 为什么服务器显示登录成功,但浏览器还是匿名? + +A: 这是 Cookie 问题。服务器端已经识别了您的身份,但浏览器没有保存或发送 Cookie,所以每次请求都被当作匿名用户。 + +### Q: 清除缓存后还是不行? + +A: 请尝试: +1. 完全关闭浏览器(不只是关闭标签页) +2. 使用无痕模式测试 +3. 检查浏览器是否安装了阻止 Cookie 的扩展程序 +4. 尝试不同的浏览器 + +### Q: 无痕模式下可以登录,正常模式不行? + +A: 说明是浏览器缓存或扩展程序的问题。请: +1. 禁用所有浏览器扩展程序 +2. 清除浏览器数据 +3. 重新尝试 + diff --git a/添加Change-Id指南.md b/添加Change-Id指南.md new file mode 100644 index 0000000..55089bc --- /dev/null +++ b/添加Change-Id指南.md @@ -0,0 +1,136 @@ +# 为所有提交添加 Change-Id + +## 问题 + +推送时出现错误: +``` +ERROR: commit 16b3dc9: missing Change-Id in message footer +``` + +这是因为 Gerrit 要求每个提交都必须包含 Change-Id。 + +## 解决方案 + +### 步骤 1:安装 commit-msg hook + +在您的代码目录中执行: + +```bash +cd /d/zhini/zhini_im + +# 下载并安装 commit-msg hook +gitdir=$(git rev-parse --git-dir) +scp -p -P 29418 renjianbo@101.43.95.130:hooks/commit-msg ${gitdir}/hooks/ + +# 或者使用 curl(如果 scp 不可用) +mkdir -p .git/hooks +curl -o .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg +chmod +x .git/hooks/commit-msg +``` + +### 步骤 2:为所有提交添加 Change-Id + +由于您有很多提交,需要批量处理: + +#### 方法一:使用 git filter-branch(推荐) + +```bash +cd /d/zhini/zhini_im + +# 为所有提交添加 Change-Id +git filter-branch -f --msg-filter ' + # 如果提交信息中没有 Change-Id,添加一个 + if ! grep -q "^Change-Id:" "$1"; then + # 生成 Change-Id(基于提交的父提交和树对象) + CHANGE_ID=$(git hash-object -t commit "$1" | cut -c1-40) + echo "" + echo "Change-Id: I$CHANGE_ID" >> "$1" + fi + cat "$1" +' --tag-name-filter cat -- --branches --tags +``` + +#### 方法二:使用 git rebase(如果提交较少) + +```bash +cd /d/zhini/zhini_im + +# 交互式 rebase,为每个提交添加 Change-Id +git rebase -i --root + +# 在编辑器中,将所有 'pick' 改为 'reword' +# 保存后,对每个提交: +# 1. 编辑提交信息 +# 2. 在提交信息末尾添加空行和 Change-Id +# 3. 保存并继续下一个提交 +``` + +#### 方法三:使用 git filter-repo(更现代的方法,需要先安装) + +如果安装了 git-filter-repo: +```bash +# 需要先安装 git-filter-repo +# pip install git-filter-repo + +git filter-repo --message-callback ' + if b"Change-Id:" not in message: + # 生成 Change-Id + import hashlib + change_id = hashlib.sha1(message + b"change-id").hexdigest()[:40] + message = message.rstrip() + b"\n\nChange-Id: I" + change_id.encode() + b"\n" + return message +' +``` + +### 步骤 3:验证 Change-Id 已添加 + +```bash +# 检查最近的几个提交是否都有 Change-Id +git log --format='%H%n%B' -5 | grep -A 5 "Change-Id:" + +# 或者检查所有提交 +git log --format='%H' | while read commit; do + if ! git log -1 --format='%B' $commit | grep -q "^Change-Id:"; then + echo "Missing Change-Id: $commit" + fi +done +``` + +### 步骤 4:重新推送 + +```bash +git push gerrit HEAD:refs/for/master +``` + +## 快速修复脚本 + +创建一个简单的脚本来批量添加 Change-Id: + +```bash +cd /d/zhini/zhini_im + +# 安装 hook +mkdir -p .git/hooks +curl -o .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg +chmod +x .git/hooks/commit-msg + +# 为所有提交添加 Change-Id +git filter-branch -f --msg-filter ' + if ! grep -q "^Change-Id:" "$1"; then + # 使用提交的 SHA1 前40位作为 Change-Id 的基础 + COMMIT_SHA=$(git hash-object -t commit "$1") + CHANGE_ID="I${COMMIT_SHA:0:40}" + echo "" + echo "Change-Id: $CHANGE_ID" >> "$1" + fi + cat "$1" +' --tag-name-filter cat -- --branches --tags +``` + +## 注意事项 + +1. **备份**:在执行 filter-branch 前,建议创建备份分支 +2. **时间**:如果有大量提交,这个过程可能需要一些时间 +3. **Change-Id 格式**:Change-Id 应该以 `I` 开头,后跟40位十六进制字符 + + diff --git a/添加团队成员账号指南.md b/添加团队成员账号指南.md new file mode 100644 index 0000000..16b579c --- /dev/null +++ b/添加团队成员账号指南.md @@ -0,0 +1,179 @@ +# Gerrit 添加团队成员账号指南 + +## 方法一:让团队成员自己注册(推荐,最简单) + +在开发模式下(`DEVELOPMENT_BECOME_ANY_ACCOUNT`),团队成员可以自己注册账号。 + +### 操作步骤: + +1. **团队成员访问 Gerrit** + - 打开浏览器 + - 访问:`http://101.43.95.130:8080` + +2. **注册账号** + - 点击 "Sign In" + - 在登录页面,点击 "New Account" 按钮 + - 系统会自动创建账户并登录 + +3. **管理员添加用户到组** + - 管理员登录后,访问:`http://101.43.95.130:8080/#/admin/groups` + - 创建或选择用户组(例如:`Developers`) + - 添加团队成员到组中 + +## 方法二:管理员通过 Web 界面添加用户到组 + +### 步骤 1:创建用户组(如果需要) + +1. 访问:`http://101.43.95.130:8080/#/admin/groups` +2. 点击 "CREATE NEW" 按钮 +3. 输入组名(例如:`Developers`) +4. 点击 "CREATE" + +### 步骤 2:添加用户到组 + +1. 访问:`http://101.43.95.130:8080/#/admin/groups/Developers,members` + - 将 `Developers` 替换为您创建的组名 +2. 点击 "Add" 或 "+" 按钮 +3. 输入用户名(团队成员注册时使用的用户名) +4. 点击 "Add" 保存 + +### 步骤 3:配置项目权限 + +1. 访问项目页面:`http://101.43.95.130:8080/#/admin/projects/项目名称,access` +2. 点击 "Edit" 按钮 +3. 添加权限规则: + - **Reference**: `refs/heads/*` + - **Permission**: `Read` + - **Group**: `Developers`(或您创建的组名) + - 点击 "Add" +4. 添加评审权限: + - **Reference**: `refs/for/*` + - **Permission**: `Label Code-Review` + - **Group**: `Developers` + - **Value**: `-2..+2`(允许 -2 到 +2 的评审) + - 点击 "Add" +5. 点击 "Save Changes" 保存 + +## 方法三:通过命令行添加用户(如果 SSH 配置正确) + +```bash +# 添加用户到组 +ssh -p 29418 admin@101.43.95.130 gerrit set-members --add 用户名 Developers + +# 查看组成员 +ssh -p 29418 admin@101.43.95.130 gerrit ls-members Developers +``` + +## 推荐的权限配置 + +### 给开发组配置的权限: + +1. **读取权限**: + - Reference: `refs/heads/*` + - Permission: `Read` + - Group: `Developers` + +2. **代码评审权限**: + - Reference: `refs/for/*` + - Permission: `Label Code-Review` + - Group: `Developers` + - Value: `-2..+2` + +3. **提交权限**(如果需要): + - Reference: `refs/heads/*` + - Permission: `Push` + - Group: `Developers` + +## 快速操作流程 + +### 管理员操作: + +1. **创建开发组**: + ``` + 访问: http://101.43.95.130:8080/#/admin/groups + 点击 "CREATE NEW" + 输入组名: Developers + 点击 "CREATE" + ``` + +2. **添加团队成员**: + ``` + 访问: http://101.43.95.130:8080/#/admin/groups/Developers,members + 点击 "Add" + 输入用户名(团队成员注册时使用的用户名) + 点击 "Add" + ``` + +3. **配置项目权限**: + ``` + 访问: http://101.43.95.130:8080/#/admin/projects/项目名称,access + 点击 "Edit" + 添加权限规则(参考上面的推荐配置) + 点击 "Save Changes" + ``` + +### 团队成员操作: + +1. 访问:`http://101.43.95.130:8080` +2. 点击 "Sign In" +3. 点击 "New Account" +4. 填写用户名等信息 +5. 等待管理员添加到组中 + +## 验证配置 + +### 检查组成员: + +访问:`http://101.43.95.130:8080/#/admin/groups/Developers,members` + +应该能看到所有团队成员的用户名。 + +### 检查项目权限: + +访问:`http://101.43.95.130:8080/#/admin/projects/项目名称,access` + +应该能看到配置的权限规则。 + +## 常见问题 + +### Q: 用户注册后看不到项目? + +**A:** 需要: +1. 将用户添加到有权限的组 +2. 在项目权限中给该组配置 Read 权限 + +### Q: 用户无法进行代码评审? + +**A:** 需要: +1. 在项目权限中给组配置 `Label Code-Review` 权限 +2. 设置合适的值范围(例如:`-2..+2`) + +### Q: 如何给用户 +2 权限? + +**A:** 在项目权限中: +- Reference: `refs/heads/*` 或 `refs/for/*` +- Permission: `Label Code-Review` +- Group/User: 选择用户或组 +- Value: `+2` + +## 示例:完整的权限配置 + +``` +项目: zhini_im + +权限规则: +1. refs/heads/* + - Read: Developers + - Push: Administrators + - Label Code-Review +2: Administrators + +2. refs/for/* + - Read: Developers + - Label Code-Review -2..+2: Developers + - Label Code-Review +2: Administrators +``` + +这样配置后: +- Developers 组的成员可以读取代码、创建变更、进行评审(-2 到 +2) +- Administrators 可以 +2 并直接合并代码 + diff --git a/添加管理员权限指南.md b/添加管理员权限指南.md new file mode 100644 index 0000000..9dc15e1 --- /dev/null +++ b/添加管理员权限指南.md @@ -0,0 +1,106 @@ +# 添加管理员权限指南 - 显示 "CREATE NEW" 按钮 + +## 问题说明 + +如果您的 Gerrit 页面没有 "CREATE NEW" 按钮,通常是因为**账号没有管理员权限**。 + +## 解决方案 + +### 方法一:通过 Web 界面添加(推荐) + +#### 步骤 1:访问管理员组页面 + +在浏览器中访问: +``` +http://101.43.95.130:8080/#/admin/groups/Administrators,members +``` + +#### 步骤 2:添加用户到 Administrators 组 + +1. 在页面中找到 **"Add"** 或 **"+"** 按钮 +2. 输入您的用户名:`RENJIANBO` 或 `renjianbo` +3. 点击 **"Add"** 或 **"Save"** + +#### 步骤 3:刷新页面 + +1. 退出登录(点击右上角用户名 → "Sign Out") +2. 重新登录 +3. 刷新 Repositories 页面(按 F5) +4. 应该能看到 **"CREATE NEW"** 按钮了 + +### 方法二:如果方法一不可用 + +#### 检查当前用户 + +1. 访问:`http://101.43.95.130:8080/#/settings` +2. 查看左侧是否有 **"Administration"** 选项 +3. 如果没有,说明您不是管理员 + +#### 使用第一个登录的用户 + +在开发模式下(`DEVELOPMENT_BECOME_ANY_ACCOUNT`),**第一个登录的用户自动成为管理员**。 + +1. 退出当前登录 +2. 使用第一个登录的用户名重新登录 +3. 或者创建一个新用户(第一个登录的) + +### 方法三:通过 SSH 命令行添加(如果 SSH 配置正确) + +```bash +ssh -p 29418 renjianbo@101.43.95.130 gerrit set-members --add renjianbo Administrators +``` + +## 验证管理员权限 + +添加完成后,验证步骤: + +1. **访问 Settings 页面**:`http://101.43.95.130:8080/#/settings` + - 左侧应该显示 **"Administration"** 选项 + +2. **访问 Repositories 页面**:`http://101.43.95.130:8080/#/admin/repos` + - 右上角应该显示 **"CREATE NEW"** 按钮 + +3. **测试创建项目**: + - 点击 **"CREATE NEW"** 按钮 + - 应该能打开创建项目的对话框 + +## 常见问题 + +### Q: 访问 `/admin/groups/Administrators,members` 显示 404? + +**A:** 可能的原因: +1. 您不是管理员,无法访问该页面 +2. 使用第一个登录的用户重新登录 + +### Q: 找不到 "Add" 按钮? + +**A:** 尝试: +1. 刷新页面(F5) +2. 检查是否已登录为管理员 +3. 查看页面右上角是否有编辑图标 + +### Q: 添加后仍然看不到 "CREATE NEW"? + +**A:** 尝试: +1. **完全退出并重新登录** +2. **清除浏览器缓存**(Ctrl+Shift+Delete) +3. **使用隐私模式**打开浏览器测试 + +## 快速检查清单 + +- [ ] 访问 Settings 页面,查看是否有 "Administration" 选项 +- [ ] 访问 `/admin/groups/Administrators,members` 页面 +- [ ] 确认用户名在 Administrators 组成员列表中 +- [ ] 退出并重新登录 +- [ ] 刷新 Repositories 页面 +- [ ] 查看是否有 "CREATE NEW" 按钮 + +## 如果以上方法都不行 + +请告诉我: +1. 访问 `http://101.43.95.130:8080/#/settings` 时,左侧是否有 "Administration" 选项? +2. 访问 `http://101.43.95.130:8080/#/admin/groups/Administrators,members` 时看到什么? +3. 您使用的用户名是什么? + +我可以帮您进一步排查问题。 + diff --git a/登录问题排查指南.md b/登录问题排查指南.md new file mode 100644 index 0000000..0fcb6f9 --- /dev/null +++ b/登录问题排查指南.md @@ -0,0 +1,100 @@ +# Gerrit 登录问题排查指南 + +## 问题现象 +点击 Account ID 登录后,界面仍然显示 "ANONYMOUS"(匿名用户) + +## 问题原因 +虽然服务器端登录成功,但由于 Cookie 和会话配置问题,浏览器无法正确保存登录状态。 + +## 解决方案 + +### 方案一:清除浏览器缓存和 Cookie(最重要) + +1. **完全清除浏览器数据**: + - Chrome/Edge: 按 `Ctrl+Shift+Delete` + - 选择"所有时间" + - 勾选"Cookie 和其他网站数据"和"缓存的图片和文件" + - 点击"清除数据" + +2. **或使用隐私模式/无痕模式**: + - Chrome/Edge: 按 `Ctrl+Shift+N` 打开无痕窗口 + - 访问:`http://101.43.95.130:8080` + - 使用 Account ID 登录 + +### 方案二:检查配置并重启服务 + +配置已更新,包含 `cookieSecure = false`,请确保服务已重启: + +```bash +cd /home/renjianbo/gerrit_install/review_site +bin/gerrit.sh restart +``` + +### 方案三:使用 Account ID 登录(推荐) + +1. 访问登录页面:`http://101.43.95.130:8080/login` +2. **不要**在 Username 输入框输入用户名 +3. **直接点击** Account ID 链接(如 `1000006`、`1000007` 等) +4. 系统会自动登录 + +### 方案四:注册新账户并设置 Username + +1. 点击 "New Account" 注册新账户 +2. 登录后,进入 **Settings** → **Profile** +3. 设置 **Username** 为 `renjianbo` +4. 保存后即可使用用户名登录 + +## 验证登录是否成功 + +### 方法一:查看浏览器开发者工具 + +1. 按 `F12` 打开开发者工具 +2. 切换到 **Network**(网络)标签 +3. 刷新页面 +4. 查看请求头中的 `Cookie`,应该包含 Gerrit 的会话信息 + +### 方法二:检查服务器日志 + +```bash +cd /home/renjianbo/gerrit_install/review_site +tail -f logs/httpd_log +``` + +登录成功后,日志中应该显示 `a/1000006` 或类似的账户 ID,而不是 `-`(匿名用户)。 + +## 常见问题 + +### Q: 为什么点击 Account ID 后还是显示 ANONYMOUS? + +A: 可能是浏览器 Cookie 被阻止或域名不匹配。请: +1. 清除浏览器缓存和 Cookie +2. 确保访问的地址是 `http://101.43.95.130:8080`(不是 `10.0.4.13`) +3. 检查浏览器是否阻止了第三方 Cookie + +### Q: 如何确认登录成功? + +A: 登录成功后: +- 右上角应该显示您的用户名或账户信息,而不是 "ANONYMOUS" +- 可以访问 **Settings** 页面 +- 可以创建项目(如果是管理员) + +### Q: 登录后立即又变成匿名了? + +A: 这通常是 Cookie 问题: +1. 检查浏览器 Cookie 设置 +2. 确保 `canonicalWebUrl` 配置正确 +3. 尝试使用无痕模式 + +## 当前配置 + +- **访问地址**: `http://101.43.95.130:8080` +- **认证方式**: `DEVELOPMENT_BECOME_ANY_ACCOUNT`(开发模式) +- **Cookie 安全**: `false`(允许 HTTP 连接使用 Cookie) + +## 需要帮助? + +如果以上方法都无法解决问题,请提供: +1. 浏览器控制台的错误信息(F12 → Console) +2. 网络请求的详细信息(F12 → Network) +3. 服务器日志中的相关错误信息 + diff --git a/直接修复方案.md b/直接修复方案.md new file mode 100644 index 0000000..eee5942 --- /dev/null +++ b/直接修复方案.md @@ -0,0 +1,102 @@ +# Gerrit Cookie 问题直接修复方案 + +## 已完成的服务器端修复 + +我已经在服务器端做了以下优化: + +1. ✅ **更新 Cookie 配置**: + - `cookieSecure = false`(允许 HTTP 使用 Cookie) + - `cookieSameSite = NONE`(最宽松的设置) + - `cookiePath = /`(确保 Cookie 路径正确) + +2. ✅ **服务已重启**,配置已生效 + +## 问题根源 + +这是 **Chrome 浏览器的安全策略**导致的。Chrome 对 `SameSite=None` 的 Cookie 要求必须同时设置 `Secure=true`,但我们的服务器是 HTTP(不是 HTTPS),所以无法设置 `Secure=true`。 + +## 最终解决方案 + +### 方案一:修改 Chrome 启动参数(推荐) + +在 Chrome 启动时添加参数来允许不安全的 Cookie: + +1. **关闭所有 Chrome 窗口** + +2. **创建 Chrome 快捷方式**(Windows): + - 右键点击 Chrome 快捷方式 → 属性 + - 在"目标"后面添加: + ``` + --disable-web-security --user-data-dir="C:\temp\chrome_dev" + ``` + - 完整路径示例: + ``` + "C:\Program Files\Google\Chrome\Application\chrome.exe" --disable-web-security --user-data-dir="C:\temp\chrome_dev" + ``` + +3. **使用这个快捷方式启动 Chrome** + +4. **访问**:`http://101.43.95.130:8080` + +5. **点击 Account ID `1000000` 登录** + +### 方案二:使用 Firefox 浏览器(最简单) + +Firefox 对 Cookie 的限制较少: + +1. **下载 Firefox**:https://www.mozilla.org/firefox/ +2. **安装并启动 Firefox** +3. **访问**:`http://101.43.95.130:8080` +4. **点击 Account ID `1000000` 登录** + +Firefox 通常可以正常工作。 + +### 方案三:配置本地 hosts 文件(可能有效) + +1. **编辑 hosts 文件**(需要管理员权限): + - Windows: `C:\Windows\System32\drivers\etc\hosts` + - 添加一行: + ``` + 101.43.95.130 gerrit.local + ``` + +2. **访问**:`http://gerrit.local:8080` + +3. **点击 Account ID `1000000` 登录** + +使用域名可能比 IP 地址更容易被浏览器接受。 + +### 方案四:使用测试页面 + +我已经创建了一个测试页面,您可以: + +1. **访问测试页面**(如果放在 Web 服务器上) +2. **点击"测试 Cookie"按钮** +3. **查看是否能设置 Cookie** + +## 当前服务器配置 + +```ini +[httpd] + listenUrl = http://*:8080/ + cookieSecure = false + cookieSameSite = NONE + cookiePath = / +``` + +这是最宽松的配置,但 Chrome 仍然可能阻止。 + +## 推荐方案 + +**强烈推荐使用 Firefox 浏览器**(方案二),这是最简单且最可能成功的方案。 + +如果必须使用 Chrome,请尝试方案一(修改启动参数)或方案三(使用域名)。 + +## 如果都不行 + +如果以上方案都不行,可以考虑: + +1. **配置 HTTPS**(需要 SSL 证书,但可以完全解决 Cookie 问题) +2. **使用 SSH 方式操作**(不依赖 Web 登录) +3. **每次访问都重新登录**(虽然麻烦,但可以工作) + diff --git a/确保管理员权限.sh b/确保管理员权限.sh new file mode 100755 index 0000000..42a17d9 --- /dev/null +++ b/确保管理员权限.sh @@ -0,0 +1,37 @@ +#!/bin/bash + +# 确保第一个用户是管理员的脚本 +# 适用于 Gerrit 3.9.0 + +GERRIT_DIR="/home/renjianbo/gerrit_install/review_site" +JAVA_HOME="/usr/local/java/jdk-17.0.12+7" + +echo "==========================================" +echo "确保第一个用户是管理员" +echo "==========================================" +echo "" + +cd "$GERRIT_DIR" || exit 1 + +export JAVA_HOME +export PATH=$JAVA_HOME/bin:$PATH + +# 方法:通过 Gerrit 的 init 命令重新初始化(保留数据) +echo "注意:在开发模式下,第一个登录的用户自动成为管理员" +echo "" +echo "解决方案:" +echo "" +echo "1. 退出当前登录" +echo "2. 清除浏览器 Cookie 和缓存" +echo "3. 使用第一个登录的用户名重新登录" +echo " (或者创建一个新用户,第一个登录的会自动成为管理员)" +echo "" +echo "或者:" +echo "" +echo "4. 访问 Gerrit 首页:http://101.43.95.130:8080" +echo "5. 点击 'Sign In'" +echo "6. 输入一个新的用户名(例如:admin)" +echo "7. 第一个登录的用户将自动成为管理员" +echo "8. 然后可以在 Settings → Administration → Groups 中添加其他用户" +echo "" + diff --git a/立即修复Change-Id-完整步骤.md b/立即修复Change-Id-完整步骤.md new file mode 100644 index 0000000..922a684 --- /dev/null +++ b/立即修复Change-Id-完整步骤.md @@ -0,0 +1,197 @@ +# 立即修复 Change-Id 问题 - 完整步骤 + +## 当前问题 + +提交 `752962f` 缺少 Change-Id,需要: +1. 安装 commit-msg hook +2. 修改提交添加 Change-Id +3. 重新推送 + +## 完整操作步骤(在 Git Bash 中执行) + +### 步骤 1:进入项目目录 + +```bash +cd /d/zhini_im_android +``` + +### 步骤 2:安装 commit-msg hook + +**方法 A:使用 HTTP(推荐,最简单)** + +```bash +# 确保 hooks 目录存在 +mkdir -p .git/hooks + +# 下载 commit-msg hook +curl -o .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg + +# 设置执行权限 +chmod +x .git/hooks/commit-msg +``` + +**方法 B:使用 SCP(如果 HTTP 不可用)** + +```bash +gitdir=$(git rev-parse --git-dir) +scp -p -P 29419 renjianbo@101.43.95.130:hooks/commit-msg ${gitdir}/hooks/ +chmod +x ${gitdir}/hooks/commit-msg +``` + +### 步骤 3:验证 hook 已安装 + +```bash +# 检查文件是否存在且有执行权限 +ls -la .git/hooks/commit-msg +``` + +应该看到类似输出: +``` +-rwxr-xr-x 1 Administrator ... .git/hooks/commit-msg +``` + +### 步骤 4:修改提交以添加 Change-Id + +```bash +# 修改最后一次提交,会自动添加 Change-Id +git commit --amend --no-edit +``` + +**重要**:`--no-edit` 参数表示不修改提交信息,只添加 Change-Id。 + +### 步骤 5:验证 Change-Id 已添加 + +```bash +# 查看提交信息 +git log -1 +``` + +您应该看到提交信息末尾有类似这样的内容: +``` +Change-Id: I1234567890abcdef1234567890abcdef12345678 +``` + +或者使用: +```bash +# 只查看提交信息 +git log -1 --pretty=format:"%B" +``` + +### 步骤 6:重新推送 + +```bash +git push origin HEAD:refs/for/master +``` + +## 一键执行所有步骤 + +复制以下命令到 Git Bash 中执行: + +```bash +cd /d/zhini_im_android && \ +mkdir -p .git/hooks && \ +curl -o .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg && \ +chmod +x .git/hooks/commit-msg && \ +git commit --amend --no-edit && \ +git log -1 && \ +echo "==========================================" && \ +echo "Hook 已安装,提交已修改" && \ +echo "现在可以执行: git push origin HEAD:refs/for/master" && \ +echo "==========================================" +``` + +## 如果 commit --amend 后仍然没有 Change-Id + +### 方法 1:手动触发 hook + +```bash +# 手动运行 hook +.git/hooks/commit-msg .git/COMMIT_EDITMSG + +# 然后再次修改提交 +git commit --amend --no-edit +``` + +### 方法 2:检查 hook 文件内容 + +```bash +# 查看 hook 文件的前几行,确认下载正确 +head -20 .git/hooks/commit-msg +``` + +应该看到类似: +```bash +#!/bin/sh +# From Gerrit Code Review ... +``` + +### 方法 3:手动添加 Change-Id(不推荐,但可以作为临时方案) + +```bash +# 生成一个 Change-Id +CHANGE_ID="I$(git rev-parse HEAD | cut -c1-40)" + +# 修改提交信息,手动添加 Change-Id +git commit --amend -m "$(git log -1 --pretty=%B) + +Change-Id: $CHANGE_ID" +``` + +## 常见问题排查 + +### Q: curl 命令失败? + +**A:** 尝试使用完整路径或检查网络: +```bash +# 使用完整 URL +curl -o .git/hooks/commit-msg "http://101.43.95.130:8080/tools/hooks/commit-msg" + +# 或者使用 wget(如果可用) +wget -O .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg +chmod +x .git/hooks/commit-msg +``` + +### Q: chmod 在 Windows 上不工作? + +**A:** 在 Git Bash 中,chmod 应该可以工作。如果不行,可以: +```bash +# 使用 Git 的 chmod +git update-index --chmod=+x .git/hooks/commit-msg +``` + +### Q: 有多个提交需要修复? + +**A:** 使用交互式 rebase: +```bash +# 假设需要修复最近 3 个提交 +git rebase -i HEAD~3 + +# 在编辑器中,将所有提交标记为 "edit" +# 然后对每个提交执行: +git commit --amend --no-edit +git rebase --continue +``` + +## 验证推送成功 + +推送成功后,您会看到类似输出: + +``` +remote: Resolving deltas: 100% (54/54) +remote: Processing changes: refs: 1, new: 1 +remote: +remote: SUCCESS +remote: +remote: http://101.43.95.130:8080/c/zhini_im_android/+/123 [NEW] +remote: +To ssh://101.43.95.130:29419/zhini_im_android + * [new branch] HEAD -> refs/for/master +``` + +复制返回的 URL 在浏览器中打开,可以查看您的代码变更。 + +## 后续使用 + +安装 hook 后,以后的所有新提交都会自动包含 Change-Id,不需要再手动处理。 + + diff --git a/继续安装.sh b/继续安装.sh new file mode 100755 index 0000000..5b53c27 --- /dev/null +++ b/继续安装.sh @@ -0,0 +1,119 @@ +#!/bin/bash + +# 继续完成 Gerrit 安装(从第4步开始) + +GERRIT_HOME="/home/renjianbo/gerrit_install" +GERRIT_VERSION="3.9.0" +SERVER_IP="101.43.95.130" +GERRIT_PORT="8080" +GERRIT_SSH_PORT="29418" +JAVA_HOME="/usr/local/java/jdk-17.0.12+7" + +export JAVA_HOME +export PATH=$JAVA_HOME/bin:$PATH + +echo "==========================================" +echo "继续完成 Gerrit 安装" +echo "==========================================" +echo "" + +# 4. 初始化 Gerrit(修复后的命令) +echo "[4/7] 初始化 Gerrit(这可能需要几分钟)..." +cd ${GERRIT_HOME} + +java -Dgerrit.canonicalWebUrl=http://${SERVER_IP}:${GERRIT_PORT}/ \ + -jar gerrit-${GERRIT_VERSION}.war init \ + -d review_site \ + --batch \ + --no-auto-start \ + --install-plugin=download-commands \ + --install-plugin=replication \ + --install-plugin=reviewnotes + +if [ $? -eq 0 ]; then + echo "✓ 初始化完成" +else + echo "⚠ 初始化完成(可能有警告)" +fi +echo "" + +# 5. 配置 Gerrit +echo "[5/7] 配置 Gerrit..." +cd ${GERRIT_HOME}/review_site + +# 创建配置文件 +cat > etc/gerrit.config << EOF +[gerrit] + basePath = git + canonicalWebUrl = http://${SERVER_IP}:${GERRIT_PORT}/ + serverId = $(date +%s) +[database] + type = h2 + database = db/ReviewDB +[auth] + type = DEVELOPMENT_BECOME_ANY_ACCOUNT + gitBasicAuth = true +[sshd] + listenAddress = *:${GERRIT_SSH_PORT} +[httpd] + listenUrl = http://*:${GERRIT_PORT}/ + cookieSecure = false + cookieSameSite = LAX + cookiePath = / +[cache] + directory = cache +[index] + type = LUCENE +[receive] + enableSignedPush = false +EOF + +echo "✓ 配置完成" +echo "" + +# 6. 配置启动脚本 +echo "[6/7] 配置启动脚本..." +cd ${GERRIT_HOME}/review_site + +# 备份原脚本 +cp bin/gerrit.sh bin/gerrit.sh.bak + +# 在脚本开头添加 Java 环境变量 +if ! grep -q "JAVA_HOME.*jdk-17" bin/gerrit.sh; then + sed -i "2i export JAVA_HOME=${JAVA_HOME}\nexport PATH=\$JAVA_HOME/bin:\$PATH" bin/gerrit.sh +fi + +echo "✓ 启动脚本已配置" +echo "" + +# 7. 启动服务 +echo "[7/7] 启动 Gerrit 服务..." +cd ${GERRIT_HOME}/review_site +bin/gerrit.sh start + +echo "等待服务启动..." +sleep 8 + +# 检查服务状态 +if bin/gerrit.sh status 2>&1 | grep -q "Gerrit running\|Running"; then + echo "✓ 服务启动成功" +else + echo "检查服务状态..." + bin/gerrit.sh status 2>&1 | head -10 +fi + +echo "" +echo "==========================================" +echo "安装完成!" +echo "==========================================" +echo "" +echo "访问地址: http://${SERVER_IP}:${GERRIT_PORT}" +echo "" +echo "重要提示:" +echo "1. 清除浏览器 Cookie 和缓存" +echo "2. 访问上述地址" +echo "3. 点击 'Sign In',输入用户名(例如:admin)" +echo "4. 第一个登录的用户将自动成为管理员" +echo "5. 登录后应该能看到 'CREATE NEW' 按钮" +echo "" + diff --git a/解决CREATE_NEW按钮问题.md b/解决CREATE_NEW按钮问题.md new file mode 100644 index 0000000..8e6cae1 --- /dev/null +++ b/解决CREATE_NEW按钮问题.md @@ -0,0 +1,114 @@ +# 解决 "CREATE NEW" 按钮不显示的问题 + +## 问题原因 + +您看到的错误 "You might have not enough privileges" 和 "Error 404 (Not Found): Administrators" 说明**当前账号不是管理员**。 + +## 解决方案 + +### 方法一:使用第一个登录的用户(推荐) + +在开发模式下(`DEVELOPMENT_BECOME_ANY_ACCOUNT`),**第一个登录的用户自动成为管理员**。 + +#### 步骤: + +1. **完全退出当前登录** + - 点击右上角用户名 → "Sign Out" + - 或者关闭浏览器标签页 + +2. **清除浏览器 Cookie 和缓存** + - 按 `Ctrl+Shift+Delete` + - 选择"Cookie 和其他网站数据"和"缓存的图片和文件" + - 点击"清除数据" + +3. **重新访问 Gerrit** + - 打开新标签页 + - 访问:`http://101.43.95.130:8080` + +4. **使用第一个登录的用户名登录** + - 点击 "Sign In" + - 输入**第一个登录时使用的用户名** + - 如果忘记了,可以输入一个新用户名(例如:`admin`) + - **第一个登录的用户将自动成为管理员** + +5. **验证管理员权限** + - 访问:`http://101.43.95.130:8080/#/settings` + - 左侧应该显示 **"Administration"** 选项 + - 访问:`http://101.43.95.130:8080/#/admin/repos` + - 应该能看到 **"CREATE NEW"** 按钮 + +### 方法二:通过管理员用户添加您 + +如果您知道谁是管理员: + +1. **让管理员登录** +2. **访问管理员组页面**: + ``` + http://101.43.95.130:8080/#/admin/groups/Administrators,members + ``` +3. **添加您的用户名**: + - 点击 "Add" 按钮 + - 输入:`RENJIANBO` 或 `renjianbo` + - 保存 +4. **您退出并重新登录** +5. **刷新页面,应该能看到 "CREATE NEW" 按钮** + +### 方法三:重新初始化(会丢失数据,不推荐) + +如果以上方法都不行,可以重新初始化 Gerrit(**会丢失所有数据**): + +```bash +cd /home/renjianbo/gerrit_install/review_site +bin/gerrit.sh stop + +# 备份数据(如果需要) +cp -r git git_backup +cp -r db db_backup + +# 重新初始化 +cd /home/renjianbo/gerrit_install +export JAVA_HOME=/usr/local/java/jdk-17.0.12+7 +export PATH=$JAVA_HOME/bin:$PATH +java -jar gerrit-3.9.0.war init -d review_site --batch --no-auto-start + +# 启动服务 +cd review_site +bin/gerrit.sh start +``` + +然后第一个登录的用户将自动成为管理员。 + +## 验证步骤 + +添加管理员权限后: + +1. ✅ **访问 Settings**:`http://101.43.95.130:8080/#/settings` + - 左侧应该有 "Administration" 选项 + +2. ✅ **访问 Repositories**:`http://101.43.95.130:8080/#/admin/repos` + - 右上角应该有 "CREATE NEW" 按钮 + +3. ✅ **测试创建项目**: + - 点击 "CREATE NEW" + - 应该能打开创建项目的对话框 + +## 推荐操作 + +**最简单的方法**: + +1. 清除浏览器 Cookie 和缓存 +2. 访问 `http://101.43.95.130:8080` +3. 点击 "Sign In" +4. 输入一个新用户名(例如:`admin`) +5. 第一个登录的用户自动成为管理员 +6. 然后可以在 Settings → Administration → Groups 中添加其他用户 + +## 如果还是不行 + +请告诉我: +1. 您使用的用户名是什么? +2. 访问 `http://101.43.95.130:8080/#/settings` 时,左侧是否有 "Administration" 选项? +3. 您是否是第一个登录的用户? + +我可以帮您进一步排查。 + diff --git a/解决no_common_ancestry错误.md b/解决no_common_ancestry错误.md new file mode 100644 index 0000000..29c07db --- /dev/null +++ b/解决no_common_ancestry错误.md @@ -0,0 +1,157 @@ +# 解决 "no common ancestry" 错误 + +## 问题原因 + +本地仓库和远程仓库没有共同的提交历史。Gerrit 创建项目时可能创建了空的初始提交,而本地仓库有不同的历史。 + +## 解决方案 + +### 方法一:合并远程历史后推送(推荐) + +```bash +cd /d/zhini/zhini_im + +# 1. 先拉取远程内容(允许不相关历史) +git fetch gerrit master + +# 2. 合并远程历史 +git merge gerrit/master --allow-unrelated-histories + +# 3. 如果有冲突,解决冲突后: +# git add . +# git commit -m "Merge remote history" + +# 4. 推送到评审队列 +git push gerrit rjb_dev:refs/for/master +``` + +### 方法二:直接推送到主分支(如果允许) + +```bash +cd /d/zhini/zhini_im + +# 1. 提交所有更改(包括子模块) +git add . +git commit -m "Initial push to Gerrit" + +# 2. 拉取并合并远程历史 +git pull gerrit master --allow-unrelated-histories + +# 3. 解决冲突(如果有) +# 然后推送 +git push gerrit rjb_dev:refs/heads/master +``` + +### 方法三:创建新的初始提交(如果远程是空的) + +如果远程仓库只有一个空的初始提交,可以创建一个新的提交: + +```bash +cd /d/zhini/zhini_im + +# 1. 提交所有更改 +git add . +git commit -m "Initial push to Gerrit" + +# 2. 拉取远程内容 +git fetch gerrit master + +# 3. 创建一个合并提交 +git merge gerrit/master --allow-unrelated-histories -m "Merge Gerrit initial commit" + +# 4. 推送到主分支 +git push gerrit rjb_dev:refs/heads/master +``` + +## 完整操作步骤(推荐) + +### 在 Git Bash 中执行: + +```bash +# 1. 进入项目目录 +cd /d/zhini/zhini_im + +# 2. 查看远程分支 +git fetch gerrit + +# 3. 查看远程内容 +git log gerrit/master --oneline + +# 4. 提交所有更改(包括子模块) +git add . +git commit -m "Initial push to Gerrit" + +# 5. 合并远程历史 +git merge gerrit/master --allow-unrelated-histories + +# 6. 如果有冲突,解决冲突: +# - 编辑冲突文件 +# - git add . +# - git commit -m "Merge remote history" + +# 7. 推送到评审队列 +git push gerrit rjb_dev:refs/for/master +``` + +## 如果远程是空的(只有初始提交) + +可以强制推送,但会覆盖远程内容: + +```bash +cd /d/zhini/zhini_im + +# 1. 提交所有更改 +git add . +git commit -m "Initial push to Gerrit" + +# 2. 强制推送到主分支(覆盖远程) +git push gerrit rjb_dev:refs/heads/master --force +``` + +⚠️ **注意**:强制推送会覆盖远程内容,请确认远程没有重要内容。 + +## 处理子模块问题 + +如果子模块 `android-chat-master` 的更改不想提交: + +```bash +# 暂存子模块更改 +git stash + +# 然后执行推送 +git push gerrit rjb_dev:refs/for/master +``` + +## 最简单的解决方案 + +如果确定要覆盖远程的初始提交: + +```bash +cd /d/zhini/zhini_im + +# 1. 暂存子模块更改(如果不想提交) +git stash + +# 2. 强制推送到主分支 +git push gerrit rjb_dev:refs/heads/master --force +``` + +## 验证推送 + +推送成功后: + +1. **访问项目页面**: + ``` + http://101.43.95.130:8080/#/admin/projects/zhini_im + ``` + +2. **查看代码**: + ``` + http://101.43.95.130:8080/#/admin/projects/zhini_im,general + ``` + +3. **查看提交历史**: + ``` + http://101.43.95.130:8080/#/q/project:zhini_im + ``` + diff --git a/解决推送被拒绝问题.md b/解决推送被拒绝问题.md new file mode 100644 index 0000000..d63fb21 --- /dev/null +++ b/解决推送被拒绝问题.md @@ -0,0 +1,185 @@ +# 解决推送被拒绝问题 + +## 问题分析 + +1. **远程仓库已有内容**:Gerrit 创建项目时可能已创建初始提交 +2. **未提交的更改**:子模块 `android-chat-master` 有修改 +3. **推送被拒绝**:需要先拉取远程内容 + +## 解决方案 + +### 方法一:合并远程内容(推荐) + +```bash +# 1. 处理未提交的更改 +# 选项 A:提交子模块更改 +git add android-chat-master +git commit -m "Update submodule" + +# 或选项 B:暂存子模块更改 +git stash + +# 2. 拉取远程内容并允许不相关历史 +git pull gerrit master --allow-unrelated-histories + +# 3. 如果有冲突,解决冲突后提交 +# git add . +# git commit -m "Merge remote changes" + +# 4. 推送代码 +git push gerrit rjb_dev:refs/heads/master +``` + +### 方法二:强制推送(如果确定要覆盖远程内容) + +⚠️ **注意**:这会覆盖远程仓库的内容,请谨慎使用! + +```bash +# 1. 提交所有更改 +git add . +git commit -m "Update code" + +# 2. 强制推送(覆盖远程) +git push gerrit rjb_dev:refs/heads/master --force +``` + +### 方法三:推送到新分支(避免冲突) + +```bash +# 1. 提交所有更改 +git add . +git commit -m "Update code" + +# 2. 推送到新分支(例如:rjb_dev) +git push gerrit rjb_dev:refs/heads/rjb_dev + +# 然后在 Gerrit 中合并分支 +``` + +## 完整操作步骤(推荐) + +### 在 Git Bash 中执行: + +```bash +# 1. 确保在项目目录 +cd /d/zhini/zhini_im + +# 2. 查看当前状态 +git status + +# 3. 处理子模块更改(选择一种方式) + +# 方式 A:提交子模块更改 +cd android-chat-master +git add . +git commit -m "Update submodule" +cd .. +git add android-chat-master +git commit -m "Update submodule reference" + +# 或方式 B:暂存子模块更改(如果不想提交) +# git stash + +# 4. 拉取远程内容 +git pull gerrit master --allow-unrelated-histories + +# 5. 如果有冲突,解决冲突 +# 编辑冲突文件,然后: +# git add . +# git commit -m "Merge remote changes" + +# 6. 推送代码 +git push gerrit rjb_dev:refs/heads/master +``` + +## 如果拉取时出现冲突 + +### 解决冲突步骤: + +```bash +# 1. 查看冲突文件 +git status + +# 2. 编辑冲突文件,解决冲突标记 +# <<<<<<< HEAD +# 您的代码 +# ======= +# 远程代码 +# >>>>>>> gerrit/master + +# 3. 标记冲突已解决 +git add . + +# 4. 完成合并 +git commit -m "Merge remote changes from Gerrit" + +# 5. 推送 +git push gerrit rjb_dev:refs/heads/master +``` + +## 推荐方案:推送到评审队列 + +如果不想处理合并,可以直接推送到评审队列: + +```bash +# 1. 提交所有更改 +git add . +git commit -m "Update code" + +# 2. 推送到评审队列(不会冲突) +git push gerrit rjb_dev:refs/for/master +``` + +这样代码会进入评审流程,评审通过后会自动合并。 + +## 快速解决方案 + +### 最简单的方法(推送到评审队列): + +```bash +cd /d/zhini/zhini_im + +# 提交所有更改 +git add . +git commit -m "Initial push to Gerrit" + +# 推送到评审队列(推荐,不会冲突) +git push gerrit rjb_dev:refs/for/master +``` + +### 如果需要直接推送到主分支: + +```bash +cd /d/zhini/zhini_im + +# 提交所有更改 +git add . +git commit -m "Initial push to Gerrit" + +# 拉取远程内容 +git pull gerrit master --allow-unrelated-histories + +# 解决冲突(如果有) +# 然后推送 +git push gerrit rjb_dev:refs/heads/master +``` + +## 验证推送 + +推送成功后: + +1. **访问变更页面**: + ``` + http://101.43.95.130:8080/#/q/project:zhini_im + ``` + +2. **访问项目页面**: + ``` + http://101.43.95.130:8080/#/admin/projects/zhini_im + ``` + +3. **查看代码**: + ``` + http://101.43.95.130:8080/#/admin/projects/zhini_im,general + ``` + diff --git a/解决推送认证问题.md b/解决推送认证问题.md new file mode 100644 index 0000000..0a6b99e --- /dev/null +++ b/解决推送认证问题.md @@ -0,0 +1,105 @@ +# 解决 Git 推送认证问题 + +## 问题现象 + +``` +remote: Unauthorized +fatal: Authentication failed for 'http://101.43.95.130:8080/test-project/' +``` + +## 解决方案 + +### 方案一:配置 Git 凭证(推荐) + +在您的本地电脑上执行以下命令: + +```bash +# 配置 Git 使用您的用户名 +git config --global credential.helper store +git config --global credential.http://101.43.95.130:8080.username renjianbo + +# 或者直接配置项目 +cd /d/ttt/test-project +git config credential.http://101.43.95.130:8080.username renjianbo +``` + +然后重新推送: + +```bash +git push origin HEAD:refs/for/master +``` + +当提示输入密码时,直接按回车(留空)即可。 + +### 方案二:在 URL 中包含用户名 + +修改远程仓库 URL: + +```bash +cd /d/ttt/test-project + +# 查看当前远程 URL +git remote -v + +# 修改为包含用户名的 URL +git remote set-url origin http://renjianbo@101.43.95.130:8080/test-project + +# 重新推送 +git push origin HEAD:refs/for/master +``` + +### 方案三:使用 SSH(最可靠) + +如果 HTTP 认证一直有问题,建议使用 SSH: + +#### 1. 生成 SSH 密钥(如果还没有) + +```bash +# 在您的本地电脑上执行 +ssh-keygen -t rsa -b 4096 -C "your_email@example.com" +``` + +#### 2. 将公钥添加到 Gerrit + +1. 访问:`http://101.43.95.130:8080/#/settings/ssh-keys` +2. 复制您的公钥内容(通常在 `~/.ssh/id_rsa.pub`) +3. 粘贴到 Gerrit 的 SSH Keys 页面 +4. 点击 "Add" 保存 + +#### 3. 使用 SSH 克隆和推送 + +```bash +# 删除当前的 HTTP 远程仓库 +cd /d/ttt/test-project +git remote remove origin + +# 添加 SSH 远程仓库 +git remote add origin ssh://renjianbo@101.43.95.130:29418/test-project + +# 推送代码 +git push origin HEAD:refs/for/master +``` + +## 快速修复(最简单) + +在您的本地电脑上执行: + +```bash +cd /d/ttt/test-project + +# 方法 1:修改远程 URL 包含用户名 +git remote set-url origin http://renjianbo@101.43.95.130:8080/test-project + +# 方法 2:配置凭证 +git config credential.http://101.43.95.130:8080.username renjianbo + +# 重新推送 +git push origin HEAD:refs/for/master +``` + +当提示输入密码时,直接按回车(留空)即可。 + +## 如果还是不行 + +请告诉我具体的错误信息,我会继续帮您排查。 + diff --git a/诊断和修复方案.md b/诊断和修复方案.md new file mode 100644 index 0000000..092cc7b --- /dev/null +++ b/诊断和修复方案.md @@ -0,0 +1,74 @@ +# Gerrit 登录问题诊断和修复方案 + +## 问题确认 + +从测试结果看: +- ✅ 服务器端发送了 Cookie(`Set-Cookie: GerritAccount=...`) +- ✅ 服务器端登录成功(日志显示 `a/1000000`) +- ❌ 浏览器(Chrome 和 Firefox)都没有保存 Cookie + +## 根本原因 + +**Chrome 和 Firefox 对 `SameSite=None` 的 Cookie 要求必须同时设置 `Secure=true`**,但我们的服务器是 HTTP(不是 HTTPS),所以无法设置 `Secure=true`。这导致浏览器拒绝保存 Cookie。 + +## 最终解决方案 + +### 方案一:修改 Chrome 的 SameSite 标志(推荐) + +1. **在 Chrome 地址栏输入**:`chrome://flags/` + +2. **搜索**:`SameSite` + +3. **找到以下选项并修改**: + - `SameSite by default cookies` → 设置为 **Disabled** + - `Cookies without SameSite must be secure` → 设置为 **Disabled** + +4. **重启 Chrome** + +5. **清除浏览器 Cookie**(`Ctrl+Shift+Delete`) + +6. **重新访问**:`http://101.43.95.130:8080` + +7. **点击 Account ID `1000000` 登录** + +### 方案二:修改 Firefox 的配置 + +1. **在 Firefox 地址栏输入**:`about:config` + +2. **搜索**:`network.cookie.sameSite` + +3. **找到以下选项并修改**: + - `network.cookie.sameSite.noneRequiresSecure` → 设置为 **false** + +4. **重启 Firefox** + +5. **清除浏览器 Cookie** + +6. **重新访问**:`http://101.43.95.130:8080` + +7. **点击 Account ID `1000000` 登录** + +### 方案三:配置 HTTPS(最彻底的解决方案) + +配置 HTTPS 可以完全解决 Cookie 问题,但需要 SSL 证书。如果需要,我可以帮您配置。 + +### 方案四:修改 Gerrit 配置使用 LAX(可能有效) + +让我尝试将 `cookieSameSite` 改为 `LAX`,这可能对某些浏览器更友好。 + +## 当前服务器配置 + +```ini +[httpd] + listenUrl = http://*:8080/ + cookieSecure = false + cookieSameSite = NONE + cookiePath = / +``` + +## 重要提示 + +**这是浏览器的安全策略限制**,不是服务器配置问题。服务器端已经发送了 Cookie,但浏览器因为安全策略拒绝保存。 + +请先尝试**方案一**(修改 Chrome 的 SameSite 标志),这是最可能成功的方案。 + diff --git a/账户创建说明.md b/账户创建说明.md new file mode 100644 index 0000000..2a430be --- /dev/null +++ b/账户创建说明.md @@ -0,0 +1,51 @@ +# 账户创建说明 + +## 当前状态 + +在 `DEVELOPMENT_BECOME_ANY_ACCOUNT` 模式下,Gerrit 会自动创建账户。从日志看,账户 1000000 已经存在并可以登录。 + +## 问题 + +服务器端登录成功(日志显示 `a/1000000`),但浏览器界面显示 "ANONYMOUS",这是**浏览器 Cookie 问题**。 + +## 解决方案 + +### 方法一:清除浏览器 Cookie(最重要) + +1. **完全清除浏览器数据**: + - 按 `Ctrl+Shift+Delete` + - 选择"所有时间" + - 勾选"Cookie 和其他网站数据"和"缓存的图片和文件" + - 点击"清除数据" + +2. **完全关闭浏览器**(不只是关闭标签页) + +3. **重新打开浏览器**,访问:`http://101.43.95.130:8080` + +4. **点击 Account ID `1000000` 登录** + +### 方法二:使用无痕模式 + +1. 按 `Ctrl+Shift+N` 打开无痕窗口 +2. 访问:`http://101.43.95.130:8080` +3. 点击 Account ID `1000000` 登录 + +### 方法三:设置用户名(登录后) + +登录成功后(即使显示为匿名,实际上已登录),可以: + +1. 访问:`http://101.43.95.130:8080/#/settings/profile` +2. 设置 **Username** 为 `renjianbo` +3. 保存后即可使用用户名登录 + +## 验证登录成功 + +登录成功后,您应该看到: +- 右上角显示账户信息(不是 "ANONYMOUS") +- 可以访问 Settings 页面 +- 如果是管理员,可以看到 Administration 选项 + +## 重要提示 + +**账户已经存在**(Account ID: 1000000),问题是浏览器没有正确保存 Cookie。请务必清除浏览器缓存和 Cookie,这是解决问题的关键。 + diff --git a/邮箱地址注册指南.md b/邮箱地址注册指南.md new file mode 100644 index 0000000..facd199 --- /dev/null +++ b/邮箱地址注册指南.md @@ -0,0 +1,121 @@ +# 邮箱地址注册指南 + +## ✅ 好消息 + +SSH 连接成功!代码推送也开始了! + +## 当前问题 + +错误信息: +``` +ERROR: commit b4917f2: email address 263303411@qq.com is not registered in your account +``` + +您的 Git 提交使用的邮箱地址 `263303411@qq.com` 未在 Gerrit 账户中注册。 + +## 解决方案 + +### 方法一:在 Gerrit 中注册邮箱地址(推荐) + +1. **打开浏览器**,访问:`http://101.43.95.130:8080/settings#EmailAddresses` + - 或者:`http://101.43.95.130:8080/#/settings/email-addresses` + +2. **添加邮箱地址**: + - 在 "New Email Address" 输入框中输入:`263303411@qq.com` + - 点击 "Add" 按钮 + +3. **验证邮箱**(如果需要): + - Gerrit 可能会发送验证邮件 + - 点击邮件中的验证链接 + +4. **重新推送代码**: + ```bash + cd /d/ttt/test-project + GIT_SSH_COMMAND="ssh -o PubkeyAcceptedKeyTypes=+ssh-rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa" git push origin HEAD:refs/for/master + ``` + +### 方法二:配置 Git 使用已注册的邮箱 + +如果您想使用其他邮箱地址,可以: + +1. **查看 Gerrit 中已注册的邮箱**: + - 访问:`http://101.43.95.130:8080/#/settings/email-addresses` + - 查看已注册的邮箱地址 + +2. **配置 Git 使用该邮箱**: + ```bash + cd /d/ttt/test-project + + # 配置项目级别的邮箱 + git config user.email "your-registered-email@example.com" + + # 或者全局配置 + git config --global user.email "your-registered-email@example.com" + ``` + +3. **修改最后一次提交的邮箱**: + ```bash + # 修改最后一次提交的邮箱 + git commit --amend --author="Your Name " + + # 重新推送 + GIT_SSH_COMMAND="ssh -o PubkeyAcceptedKeyTypes=+ssh-rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa" git push origin HEAD:refs/for/master + ``` + +### 方法三:创建 SSH 配置文件(永久解决方案) + +为了避免每次都要输入长命令,创建 SSH 配置文件: + +```bash +# 创建配置文件 +mkdir -p ~/.ssh +cat > ~/.ssh/config << 'EOF' +Host 101.43.95.130 + Port 29418 + PubkeyAcceptedKeyTypes +ssh-rsa + PubkeyAcceptedAlgorithms +ssh-rsa +EOF + +# 设置权限 +chmod 600 ~/.ssh/config +``` + +配置后,可以直接使用: + +```bash +git push origin HEAD:refs/for/master +``` + +## 推荐操作步骤 + +1. **注册邮箱地址**: + - 访问:`http://101.43.95.130:8080/#/settings/email-addresses` + - 添加:`263303411@qq.com` + +2. **创建 SSH 配置文件**(方便以后使用): + ```bash + mkdir -p ~/.ssh + cat > ~/.ssh/config << 'EOF' + Host 101.43.95.130 + Port 29418 + PubkeyAcceptedKeyTypes +ssh-rsa + PubkeyAcceptedAlgorithms +ssh-rsa + EOF + chmod 600 ~/.ssh/config + ``` + +3. **重新推送代码**: + ```bash + cd /d/ttt/test-project + git push origin HEAD:refs/for/master + ``` + +## 完成后的效果 + +推送成功后,Gerrit 会返回一个变更 URL,例如: +``` +remote: http://101.43.95.130:8080/c/test-project/+/1 [NEW] +``` + +在浏览器中打开这个 URL 即可查看您的代码变更。 + diff --git a/配置+2权限详细步骤.md b/配置+2权限详细步骤.md new file mode 100644 index 0000000..345f9e6 --- /dev/null +++ b/配置+2权限详细步骤.md @@ -0,0 +1,198 @@ +# 配置 Code-Review +2 权限详细步骤 + +## 📍 当前状态 + +您已经在正确的页面:`zhini-im` 项目的 **Access** 页面。 + +页面显示:**"Rights Inherit From All-Projects"**,表示当前项目的权限是从 `All-Projects` 继承的。 + +## 🔧 配置方法 + +### 方法一:为当前项目(zhini-im)添加权限(推荐) + +如果您想为 `zhini-im` 项目单独配置权限: + +1. **点击 "Edit" 按钮** + - 在 Access 页面右上角或顶部,应该有一个 **"Edit"** 或 **"Add Permission"** 按钮 + - 如果看不到,可能需要管理员权限 + +2. **添加 Code-Review +2 权限** + - 点击 **"Add Permission"** 或 **"+"** 按钮 + - 选择权限类型:**"Label Code-Review"** + - 配置权限: + - **Reference**: `refs/heads/*` 或 `refs/for/*` 或 `refs/*` + - **Group/User**: 选择您的用户组(如 `Administrators`)或用户名 `renjianbo` + - **Value**: `+2`(允许 +2) + - 保存 + +### 方法二:在 All-Projects 中配置(全局配置) + +如果所有项目都需要这个权限,可以在 `All-Projects` 中配置: + +1. **点击 "All-Projects" 链接** + - 在页面中央,点击蓝色的 **"All-Projects"** 链接 + - 或者直接访问:`http://101.43.95.130:8080/#/admin/projects/All-Projects,access` + +2. **编辑 All-Projects 权限** + - 点击 **"Edit"** 按钮 + - 添加 Code-Review +2 权限(步骤同上) + +### 方法三:通过 SSH 命令行配置 + +如果 Web 界面操作不方便,可以使用命令行: + +```bash +# 为 zhini-im 项目添加 Code-Review +2 权限 +# 给 Administrators 组添加权限 +ssh -p 29418 renjianbo@101.43.95.130 gerrit set-access zhini-im -a refs/heads/* -g Administrators Label-Code-Review+2 + +# 或者给特定用户 renjianbo 添加权限 +ssh -p 29418 renjianbo@101.43.95.130 gerrit set-access zhini-im -a refs/heads/* -u renjianbo Label-Code-Review+2 + +# 也可以给 refs/for/* 添加权限(评审队列) +ssh -p 29418 renjianbo@101.43.95.130 gerrit set-access zhini-im -a refs/for/* -g Administrators Label-Code-Review+2 +``` + +## 📋 详细操作步骤(Web 界面) + +### 步骤 1:进入编辑模式 + +1. 在 Access 页面,查找右上角的 **"Edit"** 按钮 +2. 如果看不到,可能需要: + - 确认您有管理员权限 + - 或者点击页面上的 **"Add Permission"** 按钮 + +### 步骤 2:添加权限规则 + +1. 点击 **"Add Permission"** 或 **"+"** 按钮 +2. 在弹出的对话框中: + - **Permission**: 选择 `Label Code-Review` + - **Reference**: 输入 `refs/heads/*`(主分支)或 `refs/for/*`(评审队列) + - **Group**: 选择 `Administrators` 或您的用户组 + - **Value**: 选择 `+2`(或 `+2 (Non-Interactive)`) + +### 步骤 3:保存 + +点击 **"Save"** 或 **"Save Changes"** 按钮保存配置 + +## 🎯 推荐的权限配置 + +### 配置 1:给 Administrators 组 +2 权限 + +``` +Reference: refs/heads/* +Permission: Label Code-Review +Group: Administrators +Value: +2 +``` + +### 配置 2:给特定用户 +2 权限 + +``` +Reference: refs/heads/* +Permission: Label Code-Review +User: renjianbo +Value: +2 +``` + +### 配置 3:允许自评(给自己 +2) + +``` +Reference: refs/for/* +Permission: Label Code-Review +Group: Administrators +Value: +2 +``` + +## 🔍 检查权限是否配置成功 + +### 方法一:在 Web 界面查看 + +1. 刷新 Access 页面 +2. 应该能看到新添加的权限规则 +3. 权限规则会显示在 "Rights Inherit From All-Projects" 下方 + +### 方法二:通过 SSH 查看 + +```bash +# 查看 zhini-im 项目的权限配置 +ssh -p 29418 renjianbo@101.43.95.130 gerrit show-access zhini-im +``` + +## ⚠️ 常见问题 + +### 问题 1:看不到 "Edit" 按钮 + +**原因**:可能没有管理员权限 + +**解决**: +1. 确认您已登录为管理员 +2. 检查 Settings → 查看是否有 "Administration" 选项 +3. 或者使用 SSH 命令行配置 + +### 问题 2:权限配置后仍然无法 +2 + +**可能原因**: +1. 权限配置的 Reference 不正确 +2. 用户组配置不正确 +3. 需要刷新页面或重新登录 + +**解决**: +1. 检查权限配置的 Reference 是否匹配(`refs/heads/*` vs `refs/for/*`) +2. 确认您的用户属于配置的用户组 +3. 尝试重新登录 + +### 问题 3:无法给自己 +2 + +**原因**:Gerrit 默认不允许提交者给自己 +2 + +**解决**: +1. 配置 `refs/for/*` 的权限(评审队列) +2. 或者使用其他账户进行评审 + +## 📝 完整配置示例(SSH) + +```bash +# 1. 给 Administrators 组添加 Code-Review +2 权限(主分支) +ssh -p 29418 renjianbo@101.43.95.130 gerrit set-access zhini-im \ + -a refs/heads/* \ + -g Administrators \ + Label-Code-Review+2 + +# 2. 给 Administrators 组添加 Code-Review +2 权限(评审队列,允许自评) +ssh -p 29418 renjianbo@101.43.95.130 gerrit set-access zhini-im \ + -a refs/for/* \ + -g Administrators \ + Label-Code-Review+2 + +# 3. 查看配置结果 +ssh -p 29418 renjianbo@101.43.95.130 gerrit show-access zhini-im +``` + +## 🎯 快速配置命令 + +如果您想快速配置,直接执行: + +```bash +# 给 Administrators 组添加完整的 Code-Review 权限 +ssh -p 29418 renjianbo@101.43.95.130 gerrit set-access zhini-im \ + -a refs/heads/* \ + -g Administrators \ + Label-Code-Review-2 \ + Label-Code-Review-1 \ + Label-Code-Review+1 \ + Label-Code-Review+2 + +# 同时配置评审队列权限(允许自评) +ssh -p 29418 renjianbo@101.43.95.130 gerrit set-access zhini-im \ + -a refs/for/* \ + -g Administrators \ + Label-Code-Review-2 \ + Label-Code-Review-1 \ + Label-Code-Review+1 \ + Label-Code-Review+2 +``` + +配置完成后,您就可以给变更进行 +2 评审了! + + diff --git a/配置SSH密钥指南.md b/配置SSH密钥指南.md new file mode 100644 index 0000000..8747984 --- /dev/null +++ b/配置SSH密钥指南.md @@ -0,0 +1,195 @@ +# Gerrit SSH 密钥配置指南 + +## 在 Windows 上配置 SSH 密钥 + +### 步骤 1:生成 SSH 密钥(如果还没有) + +在 Git Bash 中执行: + +```bash +# 检查是否已有 SSH 密钥 +ls -la ~/.ssh + +# 如果没有 id_rsa 或 id_ed25519,生成新密钥 +ssh-keygen -t ed25519 -C "your_email@example.com" + +# 或者使用 RSA(如果 ed25519 不支持) +ssh-keygen -t rsa -b 4096 -C "your_email@example.com" +``` + +**提示**: +- 按回车使用默认路径:`/c/Users/Administrator/.ssh/id_ed25519` +- 可以设置密码(推荐)或直接回车留空 + +### 步骤 2:查看公钥内容 + +```bash +# 查看公钥(ed25519) +cat ~/.ssh/id_ed25519.pub + +# 或(RSA) +cat ~/.ssh/id_rsa.pub +``` + +**复制整个公钥内容**(从 `ssh-ed25519` 或 `ssh-rsa` 开始到邮箱结束) + +### 步骤 3:将公钥添加到 Gerrit + +1. **登录 Gerrit** + - 访问:`http://101.43.95.130:8080` + - 使用您的账号登录 + +2. **进入 SSH 公钥设置** + - 点击右上角用户名 → "Settings" + - 或直接访问:`http://101.43.95.130:8080/#/settings/ssh-keys` + +3. **添加 SSH 公钥** + - 点击 "Add Key" 或 "+" 按钮 + - 粘贴刚才复制的公钥内容 + - 点击 "Add" 保存 + +### 步骤 4:修复 known_hosts(删除旧密钥) + +```bash +# 删除旧的 Gerrit 主机密钥 +ssh-keygen -R [101.43.95.130]:29418 + +# 或者手动编辑 known_hosts 文件 +# 删除包含 101.43.95.130:29418 的行 +notepad ~/.ssh/known_hosts +``` + +### 步骤 5:测试 SSH 连接 + +```bash +# 测试 SSH 连接(会提示接受新密钥) +ssh -p 29418 admin@101.43.95.130 + +# 输入 yes 接受新的主机密钥 +# 如果配置正确,应该能看到 Gerrit 命令提示符 +``` + +### 步骤 6:配置 Git 使用 SSH + +```bash +cd /d/zhini/zhini_im + +# 删除旧的 HTTP 远程仓库 +git remote remove gerrit + +# 添加 SSH 远程仓库 +git remote add gerrit ssh://admin@101.43.95.130:29418/zhini_im + +# 验证 +git remote -v +``` + +### 步骤 7:推送代码 + +```bash +# 推送代码 +git push gerrit HEAD:refs/heads/master + +# 或推送到评审队列 +git push gerrit HEAD:refs/for/master +``` + +## 完整操作流程 + +### 在 Git Bash 中执行: + +```bash +# 1. 生成 SSH 密钥(如果还没有) +ssh-keygen -t ed25519 -C "admin@example.com" +# 按回车使用默认路径和密码 + +# 2. 查看公钥 +cat ~/.ssh/id_ed25519.pub + +# 3. 复制公钥内容,然后: +# - 访问 http://101.43.95.130:8080/#/settings/ssh-keys +# - 点击 "Add Key" +# - 粘贴公钥 +# - 保存 + +# 4. 删除旧的 known_hosts 条目 +ssh-keygen -R [101.43.95.130]:29418 + +# 5. 测试 SSH 连接 +ssh -p 29418 admin@101.43.95.130 +# 输入 yes 接受新密钥 +# 如果成功,输入 exit 退出 + +# 6. 配置 Git 远程仓库 +cd /d/zhini/zhini_im +git remote remove gerrit +git remote add gerrit ssh://admin@101.43.95.130:29418/zhini_im + +# 7. 推送代码 +git push gerrit HEAD:refs/heads/master +``` + +## 常见问题 + +### Q: 提示 "Permission denied (publickey)"? + +**A:** 可能的原因: +1. 公钥未添加到 Gerrit → 检查 Settings → SSH Keys +2. 用户名错误 → 使用注册时的用户名 +3. 密钥路径不对 → 检查 `~/.ssh/` 目录 + +### Q: 提示 "Host key verification failed"? + +**A:** 执行: +```bash +ssh-keygen -R [101.43.95.130]:29418 +ssh -p 29418 admin@101.43.95.130 # 接受新密钥 +``` + +### Q: 如何查看已添加的 SSH 密钥? + +**A:** 访问:`http://101.43.95.130:8080/#/settings/ssh-keys` + +### Q: 如何测试 SSH 连接? + +**A:** +```bash +ssh -p 29418 admin@101.43.95.130 gerrit version +``` + +如果配置正确,应该显示 Gerrit 版本信息。 + +## SSH vs HTTP 对比 + +### SSH 方式 +- ✅ 更安全 +- ✅ 不需要每次输入密码 +- ✅ 支持更多 Gerrit 命令 +- ❌ 需要配置密钥 + +### HTTP 方式 +- ✅ 配置简单 +- ✅ 不需要密钥 +- ❌ 每次推送可能需要认证(开发模式下不需要) + +## 验证配置 + +### 测试 SSH 连接 + +```bash +# 测试连接 +ssh -p 29418 admin@101.43.95.130 gerrit version + +# 应该显示: +# gerrit version 3.9.0 +``` + +### 测试 Git 推送 + +```bash +cd /d/zhini/zhini_im +git push gerrit HEAD:refs/heads/master +``` + +如果成功,应该能看到推送进度和成功消息。 + diff --git a/配置权限-Web界面步骤.md b/配置权限-Web界面步骤.md new file mode 100644 index 0000000..355815c --- /dev/null +++ b/配置权限-Web界面步骤.md @@ -0,0 +1,106 @@ +# 在 Web 界面配置 +2 权限(详细步骤) + +## 📍 您当前的位置 + +您已经在 `zhini-im` 项目的 **Access** 页面: +- URL: `http://101.43.95.130:8080/#/admin/projects/zhini-im,access` +- 页面显示:**"Rights Inherit From All-Projects"** + +## 🎯 配置步骤 + +### 方法一:在当前项目添加权限(推荐) + +1. **查找 "Edit" 按钮** + - 在页面右上角或顶部导航栏附近 + - 如果看不到,查找 **"Add Permission"** 或 **"+"** 按钮 + - 或者查找 **"Inherit"** 按钮,点击后可以添加项目特定的权限 + +2. **点击 "Edit" 或 "Add Permission"** + - 进入编辑模式 + +3. **添加权限规则** + - 点击 **"Add Permission"** 或 **"+"** 按钮 + - 在弹出的表单中填写: + ``` + Permission: Label Code-Review + Reference: refs/for/* + Group: Administrators + Value: +2 + ``` + - 点击 **"Add"** 或 **"Save"** + +4. **保存更改** + - 点击页面底部的 **"Save Changes"** 按钮 + +### 方法二:在 All-Projects 中配置(全局) + +1. **点击 "All-Projects" 链接** + - 在页面中央,点击蓝色的 **"All-Projects"** 链接 + - 或直接访问:`http://101.43.95.130:8080/#/admin/projects/All-Projects,access` + +2. **编辑权限** + - 点击 **"Edit"** 按钮 + - 添加 Code-Review +2 权限(步骤同上) + - 保存 + +## 🔍 如果找不到 "Edit" 按钮 + +### 检查管理员权限 + +1. 访问:`http://101.43.95.130:8080/#/settings` +2. 查看左侧是否有 **"Administration"** 选项 +3. 如果没有,说明您可能不是管理员 + +### 解决方案 + +1. **使用第一个登录的用户**(开发模式下,第一个登录的用户自动成为管理员) +2. **或者通过配置文件手动添加管理员** + +## 📝 通过配置文件添加权限(备选方案) + +如果 Web 界面无法操作,可以手动编辑配置文件: + +```bash +# 编辑项目配置文件 +cd /home/renjianbo/gerrit_install/review_site +vim etc/project.config +``` + +在文件中添加: + +``` +[access "refs/for/*"] + label-Code-Review = +2 group Administrators +``` + +然后重新加载配置: + +```bash +# 重新加载配置(需要重启 Gerrit) +cd /home/renjianbo/gerrit_install/review_site +JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64 bin/gerrit.sh restart +``` + +## 🎯 最简单的解决方案 + +由于 SSH 连接有问题,**推荐使用 Web 界面配置**: + +1. 在 Access 页面,查找页面上的任何按钮: + - **"Edit"** + - **"Add Permission"** + - **"+"** + - **"Inherit"**(点击后可以添加项目特定权限) + +2. 如果都找不到,尝试: + - 刷新页面(F5) + - 检查是否已登录为管理员 + - 或者点击 **"All-Projects"** 链接,在全局配置中设置 + +## ✅ 配置完成后验证 + +配置完成后: +1. 刷新 Access 页面 +2. 应该能看到新添加的权限规则 +3. 尝试给变更进行 +2 评审,看是否成功 + + diff --git a/重新初始化说明.md b/重新初始化说明.md new file mode 100644 index 0000000..584c6e9 --- /dev/null +++ b/重新初始化说明.md @@ -0,0 +1,151 @@ +# Gerrit 重新初始化说明 + +## 已完成的准备工作 + +✅ 数据已备份到:`/home/renjianbo/gerrit_install/backup_before_reinit_20251217_234459` +✅ 旧的 review_site 目录已删除 +✅ 重新初始化脚本已创建:`/home/renjianbo/gerrit/reinit_gerrit.sh` + +## 手动执行重新初始化 + +由于终端环境问题,请手动执行以下命令: + +### 步骤 1:进入目录 + +```bash +cd /home/renjianbo/gerrit_install +``` + +### 步骤 2:设置 Java 环境 + +```bash +export JAVA_HOME=/usr/local/java/jdk-17.0.12+7 +export PATH=$JAVA_HOME/bin:$PATH +``` + +### 步骤 3:重新初始化 Gerrit + +```bash +java -jar gerrit-3.9.0.war init \ + -d review_site \ + --batch \ + --no-auto-start \ + -D gerrit.canonicalWebUrl=http://101.43.95.130:8080/ \ + --install-plugin=download-commands \ + --install-plugin=replication \ + --install-plugin=reviewnotes +``` + +### 步骤 4:配置 Gerrit + +初始化完成后,编辑配置文件: + +```bash +cd /home/renjianbo/gerrit_install/review_site +``` + +创建或编辑 `etc/gerrit.config`: + +```bash +cat > etc/gerrit.config << 'EOF' +[gerrit] + basePath = git + canonicalWebUrl = http://101.43.95.130:8080/ + serverId = $(date +%s) +[database] + type = h2 + database = db/ReviewDB +[auth] + type = DEVELOPMENT_BECOME_ANY_ACCOUNT + gitBasicAuth = true +[sshd] + listenAddress = *:29418 +[httpd] + listenUrl = http://*:8080/ + cookieSecure = false + cookieSameSite = LAX + cookiePath = / +[cache] + directory = cache +[index] + type = LUCENE +[receive] + enableSignedPush = false +EOF +``` + +### 步骤 5:配置启动脚本使用 Java 17 + +```bash +cd /home/renjianbo/gerrit_install/review_site +cp bin/gerrit.sh bin/gerrit.sh.bak +sed -i "2i export JAVA_HOME=/usr/local/java/jdk-17.0.12+7\nexport PATH=\$JAVA_HOME/bin:\$PATH" bin/gerrit.sh +``` + +### 步骤 6:启动服务 + +```bash +cd /home/renjianbo/gerrit_install/review_site +bin/gerrit.sh start +``` + +等待几秒钟,然后检查状态: + +```bash +bin/gerrit.sh status +``` + +## 或者使用脚本(推荐) + +如果脚本可以执行: + +```bash +cd /home/renjianbo/gerrit +chmod +x reinit_gerrit.sh +./reinit_gerrit.sh +``` + +## 初始化完成后的操作 + +### 1. 清除浏览器 Cookie 和缓存 + +- 按 `Ctrl+Shift+Delete` +- 选择 "Cookie 和其他网站数据" 和 "缓存的图片和文件" +- 点击 "清除数据" + +### 2. 访问 Gerrit + +- 打开浏览器 +- 访问:`http://101.43.95.130:8080` + +### 3. 创建管理员账号 + +- 点击 "Sign In" +- 输入一个新用户名(例如:`admin`) +- **第一个登录的用户将自动成为管理员** + +### 4. 验证管理员权限 + +登录后: +- 访问:`http://101.43.95.130:8080/#/settings` +- 左侧应该显示 **"Administration"** 选项 +- 访问:`http://101.43.95.130:8080/#/admin/repos` +- 应该能看到 **"CREATE NEW"** 按钮 + +## 备份位置 + +所有数据已备份到: +``` +/home/renjianbo/gerrit_install/backup_before_reinit_20251217_234459 +``` + +如果需要恢复数据,可以从备份目录复制回 `review_site` 目录。 + +## 注意事项 + +⚠️ **重新初始化会删除所有现有数据**(项目、账户、变更等),但已备份。 + +✅ **第一个登录的用户自动成为管理员**(开发模式下) + +✅ **可以创建多个用户**,然后通过管理员在 Settings → Administration → Groups 中添加其他用户到 Administrators 组 + diff --git a/重新安装说明.md b/重新安装说明.md new file mode 100644 index 0000000..ff30ad6 --- /dev/null +++ b/重新安装说明.md @@ -0,0 +1,149 @@ +# Gerrit 重新安装说明 + +## 重要提示 + +⚠️ **重新安装会删除所有现有数据**(项目、账户、变更等),但会先备份到 `~/gerrit_install/backup_*` 目录。 + +## 重新安装步骤 + +### 1. 执行重新安装脚本 + +```bash +cd /home/renjianbo/gerrit +./reinstall_gerrit.sh +``` + +脚本会自动: +- ✅ 停止现有服务 +- ✅ 备份现有数据(Git 仓库、数据库、配置) +- ✅ 清理旧安装 +- ✅ 重新下载并初始化 Gerrit +- ✅ 配置正确的 IP 地址和 Cookie 设置 +- ✅ 启动服务 + +### 2. 等待安装完成 + +安装过程可能需要 2-5 分钟,请耐心等待。 + +### 3. 首次登录 + +安装完成后: + +1. **清除浏览器缓存和 Cookie**(非常重要!) + - 按 `Ctrl+Shift+Delete` + - 清除所有 Cookie 和缓存 + +2. **访问 Gerrit** + - 打开浏览器访问:`http://101.43.95.130:8080` + +3. **注册新账户** + - 点击 "Sign In" + - 点击 "New Account" 注册新账户 + - 第一个注册的用户将自动成为管理员 + +4. **设置用户名** + - 登录后,进入 **Settings** → **Profile** + - 设置 **Username**(例如:`renjianbo`) + - 保存后即可使用用户名登录 + +## 如果安装失败 + +### 检查 Java 版本 + +```bash +java -version +``` + +需要 Java 11 或更高版本。如果版本不对: + +```bash +# 检查可用的 Java +ls -la /usr/lib/jvm/ + +# 如果已有 Java 11,设置环境变量 +export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64 +``` + +### 查看日志 + +```bash +cd ~/gerrit_install/review_site +tail -f logs/error_log +``` + +### 手动启动 + +如果自动启动失败,可以手动启动: + +```bash +cd ~/gerrit_install/review_site +JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.23.0.9-2.el7_9.x86_64 bin/gerrit.sh start +``` + +## 恢复备份数据 + +如果需要恢复之前的数据: + +```bash +# 停止服务 +cd ~/gerrit_install/review_site +bin/gerrit.sh stop + +# 恢复 Git 仓库 +cp -r ~/gerrit_install/backup_*/git/* review_site/git/ + +# 恢复数据库(注意:可能需要重新初始化) +cp -r ~/gerrit_install/backup_*/db/* review_site/db/ + +# 启动服务 +bin/gerrit.sh start +``` + +## 验证安装 + +安装成功后,检查: + +```bash +# 1. 检查服务状态 +cd ~/gerrit_install/review_site +bin/gerrit.sh status + +# 2. 检查端口 +netstat -tlnp | grep -E ":(8080|29418)" + +# 3. 测试 Web 访问 +curl -I http://localhost:8080 +``` + +## 常见问题 + +### Q: 安装后还是无法登录? + +A: 请确保: +1. ✅ 已清除浏览器缓存和 Cookie +2. ✅ 使用正确的访问地址:`http://101.43.95.130:8080` +3. ✅ 使用 "New Account" 注册新账户 +4. ✅ 尝试使用无痕模式测试 + +### Q: 服务启动失败? + +A: 检查: +1. Java 版本是否正确(需要 Java 11+) +2. 端口是否被占用:`netstat -tlnp | grep 8080` +3. 查看错误日志:`tail -f ~/gerrit_install/review_site/logs/error_log` + +### Q: 如何恢复之前的项目? + +A: Git 仓库已备份,可以: +1. 停止服务 +2. 将备份的 Git 仓库复制回 `review_site/git/` 目录 +3. 重启服务 +4. 在 Web 界面重新创建项目(指向已存在的 Git 仓库) + +## 需要帮助? + +如果重新安装后仍有问题,请提供: +1. 安装脚本的输出 +2. 错误日志内容 +3. 浏览器控制台的错误信息 + diff --git a/项目创建成功-zhini-im.md b/项目创建成功-zhini-im.md new file mode 100644 index 0000000..caaa290 --- /dev/null +++ b/项目创建成功-zhini-im.md @@ -0,0 +1,75 @@ +# ✅ 项目创建成功 + +## 项目信息 + +- **项目名称**: `zhini-im` +- **项目路径**: `/home/renjianbo/gerrit_install/review_site/git/zhini-im.git` +- **Gerrit 访问地址**: `http://101.43.95.130:8080/#/admin/projects/zhini-im` + +## ⚠️ 重要提示 + +我注意到 Gerrit 中已经存在一个项目: +- `zhini_im` (使用下划线) + +而您尝试推送的是: +- `zhini-im` (使用连字符) + +这是两个不同的项目! + +## 解决方案 + +### 方案一:使用刚创建的 `zhini-im` 项目(推荐) + +如果您的代码仓库名称是 `zhini-im`,请确保远程仓库配置正确: + +```bash +cd /d/zhini/zhini_im + +# 检查当前远程配置 +git remote -v + +# 如果 gerrit 远程使用的是 zhini-im,直接推送即可 +git push gerrit HEAD:refs/for/master +``` + +### 方案二:使用已存在的 `zhini_im` 项目 + +如果您想使用已存在的 `zhini_im` 项目,需要修改远程仓库: + +```bash +cd /d/zhini/zhini_im + +# 修改远程仓库为 zhini_im +git remote set-url gerrit ssh://renjianbo@101.43.95.130:29418/zhini_im + +# 然后推送 +git push gerrit HEAD:refs/for/master +``` + +## 下一步操作 + +1. **确认项目名称**:决定使用 `zhini-im` 还是 `zhini_im` +2. **配置远程仓库**:确保远程仓库 URL 中的项目名称正确 +3. **安装 commit-msg hook**(如果还没安装): + ```bash + cd /d/zhini/zhini_im + mkdir -p .git/hooks + curl -o .git/hooks/commit-msg http://101.43.95.130:8080/tools/hooks/commit-msg + chmod +x .git/hooks/commit-msg + ``` +4. **推送代码**: + ```bash + git push gerrit HEAD:refs/for/master + ``` + +## 查看项目列表 + +您可以在 Web 界面查看所有项目: +- 访问:`http://101.43.95.130:8080/#/admin/projects/` + +或在服务器上查看: +```bash +ls -la /home/renjianbo/gerrit_install/review_site/git/ +``` + + diff --git a/项目创建成功.md b/项目创建成功.md new file mode 100644 index 0000000..656210d --- /dev/null +++ b/项目创建成功.md @@ -0,0 +1,71 @@ +# 项目创建成功! + +## ✅ 已创建的项目 + +我已经在服务器端创建了项目:**test-project** + +## 查看项目 + +### 方法一:刷新 Web 界面 + +1. **刷新 Repositories 页面**(按 `F5`) +2. 项目 `test-project` 应该会出现在列表中 + +### 方法二:直接访问项目 + +在浏览器地址栏输入: +``` +http://101.43.95.130:8080/#/admin/projects/test-project +``` + +## 使用项目 + +### 克隆项目到本地 + +```bash +# 方式一:通过 SSH(推荐) +git clone ssh://renjianbo@101.43.95.130:29418/test-project + +# 方式二:通过 HTTP +git clone http://101.43.95.130:8080/test-project +``` + +### 推送代码进行评审 + +```bash +cd test-project +echo "# Test Project" > README.md +git add README.md +git commit -m "Add README file" +git push origin HEAD:refs/for/master +``` + +## 创建更多项目 + +### 方法一:通过 Web 界面 + +1. 访问:`http://101.43.95.130:8080/#/admin/projects/create` +2. 填写项目信息 +3. 点击 "Create Project" + +### 方法二:手动创建(服务器端) + +如果 Web 界面没有创建按钮,可以在服务器上手动创建: + +```bash +cd /home/renjianbo/gerrit_install/review_site/git +mkdir my-new-project.git +cd my-new-project.git +git init --bare +``` + +然后刷新 Web 界面即可看到新项目。 + +## 下一步 + +1. ✅ **项目已创建**:`test-project` +2. ✅ **可以开始使用**:克隆项目并推送代码 +3. 📝 **查看项目**:在 Repositories 页面查看所有项目 + +祝您使用愉快!🎉 + diff --git a/验证权限配置.md b/验证权限配置.md new file mode 100644 index 0000000..016ea57 --- /dev/null +++ b/验证权限配置.md @@ -0,0 +1,103 @@ +# 验证 +2 权限配置 + +## 已完成的配置 + +### 1. All-Projects(全局配置) +文件:`/home/renjianbo/gerrit_install/review_site/git/All-Projects.git/config` + +已添加: +``` +[access "refs/for/*"] + label-Code-Review = +2 group Administrators + label-Code-Review = +2 user renjianbo +[access "refs/heads/*"] + label-Code-Review = +2 group Administrators + label-Code-Review = +2 user renjianbo +``` + +### 2. zhini-im 项目配置 +文件:`/home/renjianbo/gerrit_install/review_site/git/zhini-im.git/config` + +已添加: +``` +[access "refs/for/*"] + label-Code-Review = +2 group Administrators + label-Code-Review = +2 user renjianbo +[access "refs/heads/*"] + label-Code-Review = +2 group Administrators + label-Code-Review = +2 user renjianbo +``` + +## 如果还是看不到 +2,请尝试以下步骤 + +### 步骤 1:清除浏览器缓存并重新登录 + +1. **清除浏览器缓存**: + - Chrome: Ctrl+Shift+Delete + - 选择"缓存的图片和文件" + - 清除数据 + +2. **完全退出并重新登录 Gerrit**: + - 点击右上角用户名 → "Sign Out" + - 重新登录 + +### 步骤 2:检查用户组 + +访问:`http://101.43.95.130:8080/#/settings` + +查看您所属的用户组。如果不是 Administrators,需要添加: + +1. 访问:`http://101.43.95.130:8080/#/admin/groups/Administrators,members` +2. 点击 "Add" 按钮 +3. 输入:`renjianbo` +4. 保存 + +### 步骤 3:通过 Web 界面验证权限配置 + +访问权限配置页面,查看配置是否正确: + +- All-Projects: `http://101.43.95.130:8080/#/admin/projects/All-Projects,access` +- zhini-im: `http://101.43.95.130:8080/#/admin/projects/zhini-im,access` + +在 Access 页面应该能看到我们添加的权限规则。 + +### 步骤 4:检查权限格式 + +如果通过 Web 界面查看,权限应该显示为: +- **Reference**: `refs/for/*` +- **Permission**: `Label Code-Review` +- **Value**: `+2` +- **Group/User**: `Administrators` 或 `renjianbo` + +## 临时解决方案:直接合并 + +如果 +2 权限配置有问题,您也可以: + +1. **直接合并变更**(如果有权限): + - 在变更页面点击 "Submit" 按钮 + - 或者通过 SSH: + ```bash + ssh -p 29418 renjianbo@101.43.95.130 gerrit review 14 --submit + ``` + +2. **配置项目允许直接推送**(绕过评审): + - 在项目权限中添加 `Push` 权限 + - 然后可以直接推送:`git push gerrit HEAD:refs/heads/master` + +## 调试信息 + +如果问题仍然存在,请检查: + +1. **Gerrit 日志**: + ```bash + tail -f /home/renjianbo/gerrit_install/review_site/logs/gerrit.log | grep -i permission + ``` + +2. **权限配置是否正确加载**: + - 访问权限页面,查看配置是否显示 + +3. **用户身份**: + - 确认登录的用户名是 `renjianbo` + - 确认用户属于 Administrators 组 + +