2.7 KiB
2.7 KiB
title | description | date | slug | categories | tags | lastmod | ||||
---|---|---|---|---|---|---|---|---|---|---|
记一个post-receive的配置记录 | 个人博客post-receive配置时踩的一点坑 | 2025-02-12T20:18:00+08:00 | post-receive |
|
|
2025-02-12T20:20:00+08:00 |
我在使用自建 Gitea 服务配置博客的自动部署时,最初的post-receive
配置如下:
#!/usr/bin/env bash
# AUTO GENERATED BY GITEA, DO NOT MODIFY
data=$(cat)
exitcodes=""
hookname=$(basename $0)
GIT_DIR=${GIT_DIR:-$(dirname "$0")/..}
for hook in ${GIT_DIR}/hooks/${hookname}.d/*; do
test -x "${hook}" && test -f "${hook}" || continue
echo "${data}" | "${hook}"
exitcodes="${exitcodes} $?"
done
for i in ${exitcodes}; do
[ ${i} -eq 0 ] || exit ${i}
done
WORK_TREE=(保密)
HUGO_BIN=(保密)
TMP_DIR=$(mktemp -d)
git --git-dir="$GIT_DIR" archive master | tar -x -C "$TMP_DIR"
cd "$TMP_DIR"
$HUGO_BIN
rsync -av --delete "$TMP_DIR/public"/ "$WORK_TREE"/
rm -rf "$TMP_DIR"
{
echo "=== Deployment Log ==="
echo "Timestamp : $(date +"%Y-%m-%d %T %Z")"
echo "User : $(whoami)"
echo "Commit Hash: $(git --git-dir="$GIT_DIR" rev-parse HEAD)"
echo "Work Tree : $WORK_TREE"
echo "Git Dir : $GIT_DIR"
echo "Status : Success (Built with Hugo and deployed)"
echo ""
} >> "$GIT_DIR/log/git-deploy.log"
其中1-16行是 Gitea 自动生成的,所以一开始我没管。但是push之后发现,每次都报错:
remote: mkdir: cannot create directory './log': No such file or directory
remote: hooks/post-receive: line 50: ./log/git-deploy.log: No such file or directory
这个目录和文件是存在的,一开始以为是权限问题,但是检查之后发现权限是正确的。我心想真是奇了怪了,会不会是GIT_DIR
变量赋值有问题呢?但是看起来是正确的。随后试了几次,仍然报一样的错,于是我echo
了一下GIT_DIR
,发现是.
,这就有问题了。
换言之,GIT_DIR
变量赋值是一个相对路径,而不是绝对路径。尤其是我后面还cd
了临时目录,会导致脚本目录混乱。于是,我把GIT_DIR
变量赋值改成了绝对路径:
GIT_DIR=$(realpath ${GIT_DIR:-$(dirname "$0")/..})
后来再push
一次,脚本仍然报错,不过这次是:
remote: fatal: Unable to read current working directory: No such file or directory
我再查看了一次脚本,发现是cd
了临时目录,之后把临时目录删了,导致脚本在一个不存在的目录下工作。于是在rm -rf
之前,先cd $GIT_DIR/hooks
回到脚本正常工作目录下,再rm
就没问题了。