82 lines
2.7 KiB
Markdown
82 lines
2.7 KiB
Markdown
---
|
||
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`就没问题了。
|
||
|
||
|
||
|