一、配置 SSH 公密
将公钥配置到码云
打开码云的项目地址
管理-添加公钥

二、将项目拉取到云服务器
切换到项目目录
git clone git@gitee.com:xxxx/xxxxxxxx.git
三、宝塔安装 webhook
软件商品搜索:WebHook

添加 Hook
名称填写项目名称
执行脚本如下
记得修改项目路径
sudo git pull,必须使用 sudo
#!/bin/bash
echo '代码更新:' $(date '+%Y-%m-%d %H:%M:%S')
cd 项目路径
sudo git pull
chown -R www:www ./
chmod -R 755 ./
echo "更新成功"
四、配置 gitee WebHook
打开宝塔配置的 hook:查看密钥

将 WebHook 配置到码云
打开码云的项目地址
管理-WebHooks
将链接和密钥分别粘贴后,点击添加

注意:链接后面的参数可以变化,比如 param=pull,脚本可以根据这个参数来判断是否执行
#!/bin/bash
echo '代码更新:' $(date '+%Y-%m-%d %H:%M:%S')
case "$1" in
api) cd /mnt/wwwroot/cy/prod/api; echo 'api' ;;
yii) cd /mnt/wwwroot/cy/prod/yii; echo 'yii' ;;
fast) cd /mnt/wwwroot/cy/prod/fast; echo 'fast' ;;
wss) cd /mnt/wwwroot/cy/prod/wss; echo 'wss' ;;
*) cd /mnt/wwwroot/cy/prod/web; echo 'web' ;;
esac
# 忽略权限位变化,权限调整不再产生“空改动”提交
sudo git config core.filemode false
# 0、防止 detached HEAD:保证回到 master 分支(本地未提交改动会跟着保留)
CUR=$(sudo git rev-parse --abbrev-ref HEAD)
if [ "$CUR" = "HEAD" ]; then
sudo git checkout master 2>/dev/null || sudo git checkout -b master
fi
# 1、先提交生产环境的本地改动(pull --rebase 要求工作区干净)
sudo git add -A
if ! sudo git diff --cached --quiet; then
sudo git commit -m 'linux'
fi
# 2、再拉远程并 rebase;冲突就回滚并报警,不要让仓库停在半路
if ! sudo git pull --rebase origin master; then
sudo git rebase --abort 2>/dev/null
echo '更新失败:rebase 冲突,请手动处理' && exit 1
fi
# 3、有本地提交(如 linux 提交)才推回远程
if [ -n "$(sudo git log origin/master..master --oneline)" ]; then
sudo git push origin master
fi
chown -R www:www ./
# 目录 755、文件 644,但跳过 .git
find ./ -path ./.git -prune -o -type d -exec chmod 755 {} \;
find ./ -path ./.git -prune -o -type f -exec chmod 644 {} \;
# 给 shell 脚本恢复执行权限(git filemode 已关闭,必须手动补)
find ./ -path ./.git -prune -o -type f -name "*.sh" -exec chmod 755 {} \;
echo "更新成功"
如果目录里有需要可执行的文件(比如 .sh 脚本、部分框架的 console 入口),644 会让它们跑不起来,可以按扩展名放开:
find ./ -type f $ -name "*.sh" -o -name "console" $ -exec chmod 755 {} \;
放在两条 find 之后即可。
五、为何需要 git config core.filemode false
如果不写这个会导致:每次提交新文件服务端总是一个空改动(用户在服务器上 touch 的)?
原因:Git 会跟踪文件的“可执行权限位”。你服务器上每次 chmod -R 755 ./ 会把文件从 100644(不可执行)变成 100755(可执行),git add -A 就把这个“纯权限变化”暂存并提交了——内容零变化,所以你看到的是 xxx.php | 0 这种空改动。
一行配置即可(每个仓库执行一次,永久生效):
cd /mnt/wwwroot/cy/prod/web && git config core.filemode false
六、测试同步
本地提交代码
宝塔 WebHook 的调用次数会 +1

码云的 WebHooks 会日志


