2024-10-11:修复 Github Actions 部署后导致文章的更新时间错误的问题
1.前提准备
- 服务器*1
- Github账号*1
- 电脑*1
- 勤劳的小手*1/双
本教程是通过 GitHub Actions 实现持续集成和持续部署(CI/CD),自动化生成静态文件并推送到目标仓库,目标仓库触发 Webhooks 通知服务器自动拉取最新代码部署。
建议是一个私人仓库 hexo-blog
,一个公开仓库 JLinmr.Github.io
2.部署到Github
本文不叙述这个了,直接看这个文章

3.使用Github Actions
GitHub Actions 是一个持续集成和持续部署(CI/CD)平台,可以在 GitHub 仓库中配置工作流。当有新的推送到达 GitHub 仓库时,GitHub Actions 会自动触发预定义的工作流。
1.创建工作流
方法一:在你的 GitHub 仓库中创建一个 .github/workflows
目录。然后,在这个目录中创建一个新的 YAML 文件,例如 main.yml
,填入工作流配置⬇️
方法二:在你的Github仓库界面依次点击Actions
➡️set up a workflow yourself
,填入工作流配置⬇️
name: 自动构建
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
env:
TZ: Asia/Shanghai
steps:
- name: 检查源仓库分支
uses: actions/checkout@v3
with:
ref: main
fetch-depth: 0
- name: 恢复文件修改时间
run: |
find source -name '*.md' | while read file; do
touch -d "$(git log -1 --format="@%ct" "$file")" "$file"
done
- name: 安装 Node.js
uses: actions/setup-node@v3
with:
node-version: "20.x"
- name: 安装 Hexo
run: |
npm install -g hexo-cli
- name: 缓存 node 模块
id: cache-node-modules
uses: actions/cache@v3
with:
path: node_modules
key: ${{ runner.os }}-node-modules-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-modules-
- name: 安装依赖
if: steps.cache-node-modules.outputs.cache-hit != 'true'
run: |
npm install --save
- name: 生成静态
run: |
hexo generate
- name: 部署推送到目标仓库
uses: peaceiris/actions-gh-pages@v3
with:
personal_token: ${{ secrets.PAT }}
publish_dir: ./public
external_repository: JLinMr/JLinmr.github.io
user_name: "github-actions[bot]"
user_email: "github-actions[bot]@users.noreply.github.com"
full_commit_message: "通过 Github Actions 部署 Hexo 构建"
publish_branch: main
不管是方法一还是方法二,最终的内容都是这个⬆️,根据自己的仓库信息,修改 目标仓库
- name: 部署推送到目标仓库
uses: peaceiris/actions-gh-pages@v3
with:
personal_token: ${{ secrets.PAT }}
publish_dir: ./public
external_repository: JLinMr/JLinmr.github.io # 目标仓库
user_name: "github-actions[bot]"
user_email: "github-actions[bot]@users.noreply.github.com"
full_commit_message: "通过 Github Actions 部署 Hexo 构建"
publish_branch: main # 目标仓库分支
2.配置访问令牌
最开始我以为同账号下是有权限的,但是试了一下没有权限推送到 JLinMr/JLinmr.github.io
仓库。即使使用 GITHUB_TOKEN
,也只能访问当前仓库,而不能访问其他仓库。所以在这种情况下,选择了配置个人访问令牌来获得足够的权限
1.生成访问令牌
- 进入
Settings
- 点击
Developer settings
- 选择
Personal access tokens
- 点击
Tokens(classic)
- 点击
Generate new token
- 输入令牌的描述,选择需要的权限(
repo
权限),然后点击Generate token
。 - 复制生成的令牌

2.添加到 Secrets
- 进入你的 GitHub 仓库。
- 点击
Settings
- 选择
Secrets and variables
➡️Actions
- 点击
New repository secret
- 输入
PAT
,粘贴你的个人访问令牌到Secret *
字段,然后点击Add secret

3.触发工作流
修改仓库内容触发工作流,首次可能比较慢,因为工作流配置了缓存 Node.js 依赖

4.配置Webhook
本教程使用宝塔面板进行配置Webhook
,其他请自行测试
1.下载WebHook和添加
- 点击宝塔左侧软件商城,搜索并下载安装
宝塔WebHook

- 点击设置➡️添加Hook,填入名称和下面配置
- 注意你需要,修改脚本内容为你自己的

#!/bin/bash
echo ""
# 输出当前时间
date --date='0 days ago' "+%Y-%m-%d %H:%M:%S"
echo "开始"
# 定义变量
branch="main"
gitPath="/www/wwwroot/blog.bsgun.cn/"
gitHttp="https://github.com/JLinMr/JLinmr.GitHub.io.git"
echo "Web站点路径:$gitPath"
# 函数:初始化 Git 仓库
init_git_repo() {
if [ ! -d ".git" ]; then
echo "在该目录下克隆 git"
sudo git clone $gitHttp gittemp
sudo mv gittemp/.git .
sudo rm -rf gittemp
fi
}
# 函数:拉取最新代码并设置权限
pull_latest_code() {
echo "拉取最新的项目文件"
git remote add origin $gitHttp
git branch --set-upstream-to=origin/$branch $branch
sudo git fetch --all
sudo git reset --hard origin/$branch
sudo git pull --rebase 2>&1
echo "设置目录权限"
sudo chown -R www:www $gitPath
}
# 判断项目路径是否存在
if [ -d "$gitPath" ]; then
cd $gitPath
init_git_repo
pull_latest_code
else
echo "该项目路径不存在"
echo "新建项目目录"
mkdir -p $gitPath
cd $gitPath
init_git_repo
pull_latest_code
fi
echo "结束"
exit 0
2.配置密钥
- 点击查看密钥
- 复制密钥的内容和蓝色选中的内容
- 打开你的
Github
内公开的仓库,依次点击settings
➡️WebHooks
➡️Add WebHook
- 按照步骤4的图片进行填写内容,然后点击
Add WebHook
(Payload URL
填写蓝色选中内容)(Content type改成Json
) - 成功的话会显示为步骤5,第一次是
Ping
(如果开启了SSL,且打开验证你有大概率会失败)
可以直接看图片按照图片顺序配置,其他的都是默认





3.一些问题
你可能会出现的问题

问题原因:Git 检测到目录的所有权存在问题,因此拒绝执行某些操作
解决方案:直接复制绿框内的指令在终端执行一下设置权限
5.触发钩子
在你的私人仓库内进行增,删,改,任意操作即可触发GitHub Actions,然后公开仓库触发钩子,服务器进行拉取仓库的最新代码
6.写在最后
因为写这个的时候已经完成了,我也没进行测试这一套流程(但是我就是这样成的),如果有什么问题可以在评论区评论留言
评论区