记一个post-receive的配置记录

个人博客post-receive配置时踩的一点坑

我在使用自建 Gitea 服务配置博客的自动部署时,最初的post-receive配置如下:

 1#!/usr/bin/env bash
 2# AUTO GENERATED BY GITEA, DO NOT MODIFY
 3data=$(cat)
 4exitcodes=""
 5hookname=$(basename $0)
 6GIT_DIR=${GIT_DIR:-$(dirname "$0")/..}
 7
 8for hook in ${GIT_DIR}/hooks/${hookname}.d/*; do
 9  test -x "${hook}" && test -f "${hook}" || continue
10  echo "${data}" | "${hook}"
11  exitcodes="${exitcodes} $?"
12done
13
14for i in ${exitcodes}; do
15  [ ${i} -eq 0 ] || exit ${i}
16done
17
18WORK_TREE=(保密)
19HUGO_BIN=(保密)
20
21TMP_DIR=$(mktemp -d)
22
23git --git-dir="$GIT_DIR" archive master | tar -x -C "$TMP_DIR"
24
25cd "$TMP_DIR"
26$HUGO_BIN
27
28rsync -av --delete "$TMP_DIR/public"/ "$WORK_TREE"/
29
30rm -rf "$TMP_DIR"
31
32{
33    echo "=== Deployment Log ==="
34    echo "Timestamp  : $(date +"%Y-%m-%d %T %Z")"
35    echo "User       : $(whoami)"
36    echo "Commit Hash: $(git --git-dir="$GIT_DIR" rev-parse HEAD)"
37    echo "Work Tree  : $WORK_TREE"
38    echo "Git Dir    : $GIT_DIR"
39    echo "Status     : Success (Built with Hugo and deployed)"
40    echo ""
41} >> "$GIT_DIR/log/git-deploy.log"

其中1-16行是 Gitea 自动生成的,所以一开始我没管。但是push之后发现,每次都报错:

1remote: mkdir: cannot create directory './log': No such file or directory
2remote: hooks/post-receive: line 50: ./log/git-deploy.log: No such file or directory

这个目录和文件是存在的,一开始以为是权限问题,但是检查之后发现权限是正确的。我心想真是奇了怪了,会不会是GIT_DIR变量赋值有问题呢?但是看起来是正确的。随后试了几次,仍然报一样的错,于是我echo了一下GIT_DIR,发现是.,这就有问题了。

换言之,GIT_DIR变量赋值是一个相对路径,而不是绝对路径。尤其是我后面还cd了临时目录,会导致脚本目录混乱。于是,我把GIT_DIR变量赋值改成了绝对路径:

1GIT_DIR=$(realpath ${GIT_DIR:-$(dirname "$0")/..})

后来再push一次,脚本仍然报错,不过这次是:

1remote: fatal: Unable to read current working directory: No such file or directory

我再查看了一次脚本,发现是cd了临时目录,之后把临时目录删了,导致脚本在一个不存在的目录下工作。于是在rm -rf之前,先cd $GIT_DIR/hooks回到脚本正常工作目录下,再rm就没问题了。