ci(部署): rsync 加 --no-owner --no-group,别把 runner 的 uid 搬到服务器
Some checks failed
Deploy / deploy (push) Has been cancelled
Some checks failed
Deploy / deploy (push) Has been cancelled
服务器上 `git pull` 报「检测到可疑的仓库所有权」:
drwxr-xr-x 9 1001 1001 /root/OJDeploy/OJ2
drwxr-xr-x 8 0 0 /root/OJDeploy/OJ2/.git
原因是 `rsync -a` 展开含 `-o -g`(保留属主/属组),接收端又是 root,
所以源端的 uid 会被真写上去 —— GitHub 托管 runner 的 runner 用户是 uid 1001。
而 `.git` 在 --exclude 里,一直是当初手动 clone 时的 root。两者对不上,
git 2.35.2 起的 safe.directory 检查就把服务器上所有 git 操作挡下了。
加 --no-owner --no-group 之后文件落地归 ssh 登录用户(root)所有,不再错位。
注意这只防复发,**不修复已经错位的目录**:rsync 不带 -o/-g 时不会去改已存在
文件的属主。服务器上还要手动跑一次
chown root:root /root/OJDeploy/OJ2
只改这一个目录,**不要 -R** —— git 的属主检查不递归,而 OJ2/data 下可能是
「自带数据」形态的整个 postgres 数据目录和判题沙箱以别的 uid 建的运行目录,
递归 chown 会让它们起不来。
这个问题一直都在,只是以前没在服务器上跑过 git 命令所以没撞上。
验证:只做了 YAML 语法校验 —— 这条工作流要真的 push 到 github 才跑得起来,
本机验不了。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
8
.github/workflows/deploy.yml
vendored
8
.github/workflows/deploy.yml
vendored
@@ -84,9 +84,15 @@ jobs:
|
||||
# 整个 postgres 数据目录。删了就是删库。
|
||||
# node_modules 服务器上根本不需要(prebuilt 形态下连编都不编),传过去纯浪费。
|
||||
# .git checkout 出来的 .git 没有任何用处。
|
||||
#
|
||||
# --no-owner --no-group 别删:`-a` 展开含 `-o -g`(保留属主/属组),而接收端是
|
||||
# root,rsync 会把**源端的 uid 真写上去**——GitHub 托管 runner 的 runner 用户是
|
||||
# uid 1001,于是服务器上的工作区目录变成 1001 所有。而 `.git` 被 --exclude 掉,
|
||||
# 还是当初手动 clone 时的 root。两者对不上,之后在服务器上跑任何 git 命令都会被
|
||||
# 「检测到可疑的仓库所有权」挡下(git 2.35.2 起的 safe.directory 检查)。
|
||||
- name: 同步到服务器
|
||||
run: |
|
||||
rsync -az --delete \
|
||||
rsync -az --no-owner --no-group --delete \
|
||||
-e "ssh -i ~/.ssh/id_deploy -p $REMOTE_PORT" \
|
||||
--exclude node_modules \
|
||||
--exclude .git \
|
||||
|
||||
Reference in New Issue
Block a user