blog/content/post/奇技淫巧/记一个post-receive的配置.md
2025-02-12 20:37:57 +08:00

82 lines
2.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: 记一个post-receive的配置记录
description: 个人博客post-receive配置时踩的一点坑
date: 2025-02-12T20:18:00+08:00
slug: post-receive
# image: helena-hertz-wWZzXlDpMog-unsplash.jpg
categories:
- 奇技淫巧
tags: [
"git",
"建站",
"Hugo"
]
lastmod: 2025-02-12T20:20:00+08:00
---
我在使用自建 Gitea 服务配置博客的自动部署时,最初的`post-receive`配置如下:
```bash
#!/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`变量赋值改成了绝对路径:
```bash
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`就没问题了。