⏯️从何而来

上一篇博客中讲到,我在我自己的服务器上部署了一个Blogroll项目。在写作博客的时候我突然想到,hexo框架的博客可以在本地机上写,然后用hexo d命令一键部署,那么这个项目也应该可以这样操作。

⏩实践过程

由于之前部署hexo博客的时候已经建过git用户了,这次就不用再建用户了.首先以git用户的身份打开bash,然后直接在/home/git底下建立一个新的bare仓库:

1
git init --bare link-house.git
下一步就是设置一个post-receive脚本,正像名字所暗示的那样,这个脚本会在服务器每次接收到一次推送之后,都会执行这个脚本。脚本语言采用bash,一个很简单的例子如下:
1
git --work-tree=/data/hexo --git-dir=/home/git/hexo.git checkout -f
这是之前为hexo博客仓库写的自动部署脚本,会在服务器接收到push之后,将这些修改checkoutwork-tree(即/data/hexo)中。创建脚本之后,还要给脚本赋予可执行权限chmod u+x ./hooks/post-receive。 但是这个脚本有一个缺点:没办法知道它究竟执行了没有,结果如何。本来我为friend-link-house这个项目也是配置的类似的脚本,但是从本地机push之后,服务器端并没有更新。ssh到服务器上手动执行这个post-receive脚本才发现是work-tree文件夹的权限没有设置对。如果这个脚本执行的时候有log记录执行结果,那岂不是更好?于是我让deepseek帮我写了一个脚本:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#!/bin/bash

TARGET="/data/Friend-Link-House"
GIT_DIR="/home/git/link-house.git"
BRANCH="main"
LOG_FILE="/home/git/link-house.git/hooks/post-receive.log"

# 创建日志目录(如果不存在)
mkdir -p $(dirname "$LOG_FILE")
touch "$LOG_FILE"

echo "=== 部署开始: $(date) ===" >> "$LOG_FILE"

# 记录当前状态
echo "当前目录: $(pwd)" >> "$LOG_FILE"
echo "目标目录: $TARGET" >> "$LOG_FILE"
echo "Git 目录: $GIT_DIR" >> "$LOG_FILE"

# 检查分支信息
echo "分支信息:" >> "$LOG_FILE"
git --git-dir="$GIT_DIR" branch -a >> "$LOG_FILE" 2>&1

# 检查最新提交
echo "最新提交:" >> "$LOG_FILE"
git --git-dir="$GIT_DIR" log -1 >> "$LOG_FILE" 2>&1

# 执行部署
echo "执行检出操作..." >> "$LOG_FILE"
git --git-dir="$GIT_DIR" --work-tree="$TARGET" checkout -f $BRANCH >> "$LOG_FILE" 2>&1

# 检查执行结果
if [ $? -eq 0 ]; then
echo "Git 命令执行成功" >> "$LOG_FILE"

# 检查目标目录内容
echo "目标目录内容:" >> "$LOG_FILE"
ls -la "$TARGET" >> "$LOG_FILE" 2>&1
else
echo "Git 命令执行失败" >> "$LOG_FILE"
exit 1
fi

echo "=== 部署完成: $(date) ===" >> "$LOG_FILE"
这样就可以随时查看log文件,以获取上一次部署的相关信息。

❓出现了一些问题

在这样调试好之后,我非常兴奋地从本地机push到了git@<服务器域名>:/home/git/link-house.git上。然而,网页上并没有发生这个更新。这又是为什么呢?反复研究了这个过程之后,我终于发现……

原来我的post-receive光顾着git checkout把文件复制进去了,而npm run build所构建的dist文件夹又在.gitignore列出的忽略文件里,所以服务器端的dist文件夹其实并没有被修改。解决起来也很简单,就在post-receive脚本里添加构建命令就可以了,修改如下:

1
2
3
4
5
43,46d42
< cd $TARGET
< npm run gen >> "$LOG_FILE" 2>&1
< npm run build >> "$LOG_FILE" 2>&1
<