我在使用自建 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
就没问题了。