本文最后更新于 16 天前,其中的信息可能已经有所发展或是发生改变。
一、方案详细描述
架构设计
本方案通过 裸仓库、管理员工作目录 和 生产目录 实现代码协作与自动化部署,确保开发与生产环境隔离。目录结构如下:
/mnt/odoo/odoo17/custom/addons/
├── aams.git # 裸仓库(开发者推送目标,存储所有分支)
├── aams_worktree # 管理员工作目录(用于合并分支)
└── aams # 生产目录(实际运行代码,由钩子自动同步)
目录 | 用途 |
aams.git | 中央仓库,开发者推送/拉取分支,仅管理员可以操作main 分支 |
aams_worktree | 管理员本地工作区,用于合并分支、解决冲突 |
aams | 生产环境代码,用钩子自动从aams.git 同步,禁止直接修改 |
角色权限:
角色 | 权限 |
开发者 | 1. 推送/拉取个人分支 2. 禁止操作 main 分支 |
管理员 | 1. 合并分支到main 2. 推送 main 分支触发同步钩子3. 管理钩子脚本等 |
开发管理流程
- 开发者推送分支:将代码推送到裸仓库的个人分支(如
dev_myname
)。 - 管理员合并分支:在工作目录中将
dev_myname
合并到main
。 - 触发同步:推送
main
分支到裸仓库,触发钩子自动同步到生产目录并重启服务。
二、配置与使用指南
1. 开发者配置与操作
环境准备
- 克隆仓库
#bash
git clone user@server:/mnt/odoo/odoo17/custom/addons/aams.git
cd aams
开发者管理
- 创建个人分支,开发者统一将自己的分支命名为
dev_{名字缩写}
#bash
git checkout -b dev_yourname
- 提交代码
git add .
git commit -m "做了什么"
- 推送到服务器
git push -u origin dev_yourname #首次推送
git push origin dev_yourname #后续推送
- 注意:任何开发者直接对main分支进行操作是被禁止的,因为对于main分支的操作会触发钩子,而钩子文件会自动更新实际使用的Odoo模块。因此只有Odoo服务器管理员可以对服务器仓库的main分支进行操作。下面对管理员的配置和操作做详细说明。
2. 管理员的配置与操作
环境准备
- 克隆仓库到工作目录(在服务器操作,以odoo用户登录),这一步只做一次,后续开发者不要再操作这一步。
git clone /mnt/odoo/odoo17/custom/addons/aams.git /mnt/odoo/odoo17/custom/addons/aams_worktree
cd /mnt/odoo/odoo17/custom/addons/aams_worktree
- 拉取所有分支
git fetch --all
git branch -r | grep -v '\->' | while read remote; do
git branch --track "${remote#origin/}" "$remote"
done
合并与部署流程
- 合并分支到main
git checkout main
git merge origin/dev_yourname --no-ff -m "Merge dev_yourname: 新功能"
- 解决冲突(如果有)
- 推送到main分支并触发钩子文件
git push origin main # 推送 main 分支,触发钩子同步到生产目录
3. 钩子配置与验证
钩子脚本内容
- pre-receive(权限控制)
#!/bin/sh
while read oldrev newrev refname; do
branch=$(git rev-parse --symbolic --abbrev-ref "$refname")
user=$(whoami)
if [ "$branch" = "main" ] && [ "$user" != "odoo" ]; then
echo "错误:仅 odoo 用户可操作 main 分支"
exit 1
fi
done
- post-receive(同步与重启)
#!/bin/sh
while read oldrev newrev refname; do
branch=$(git rev-parse --symbolic --abbrev-ref "$refname")
if [ "$branch" = "main" ]; then
git --work-tree=/mnt/odoo/odoo17/custom/addons/aams checkout -f main
sudo systemctl restart odoo17
echo "$(date) - 已同步 main 分支并重启服务" >> /var/log/odoo_deploy.log
fi
done
- 权限设置
sudo chown -R odoo:odoo /mnt/odoo/odoo17/custom/addons/aams.git
sudo chmod +x /mnt/odoo/odoo17/custom/addons/aams.git/hooks/*
三、常见问题和维护
钩子未触发同步
- 检查点
# 确认钩子权限和内容
ls -l /mnt/odoo/odoo17/custom/addons/aams.git/hooks/post-receive
cat /mnt/odoo/odoo17/custom/addons/aams.git/hooks/post-receive
# 查看日志
tail -f /var/log/odoo_deploy.log
开发者无法推送
- 检查点
# 验证用户权限
ls -ld /mnt/odoo/odoo17/custom/addons/aams.git
# 检查网络和 SSH 配置
ssh odoo@your-server git -T
紧急回滚
# 回退到指定提交
git checkout main
git reset --hard COMMIT_ID
git push -f origin main
四、注意事项
- 生产目录隔离:禁止直接修改
/mnt/odoo/odoo17/custom/addons/aams
中的文件。