在维护 Hexo 博客的过程中,手动执行 hexo clean && hexo g && hexo d 不仅繁琐,而且容易因为本地环境差异(如 Node.js 版本不一致)导致部署失败。
本文将介绍如何利用 GitHub Actions 实现自动化部署,并展示如何添加定时任务来自动更新博客数据。
什么是 GitHub Actions?
GitHub Actions 是 GitHub 提供的持续集成和持续部署(CI/CD)平台。它允许你在 GitHub 仓库中直接自动化构建、测试和部署流程。
核心概念包括:
- Workflow(工作流):由一个或多个 Job 组成的自动化过程,通过
.yml 文件定义。
- Event(事件):触发工作流的规则,如
push(代码提交)或 schedule(定时触发)。
- Job(任务):在同一个运行器(Runner)上执行的一组步骤。
- Step(步骤):任务中的具体操作,可以是运行脚本或使用现成的 Action。

实战配置
我们在项目中创建了 .github/workflows/blog_automation.yml 文件,实现了两个核心功能:
- 代码提交时自动部署:当推送到
main 分支时,自动构建并部署博客。
- 定时抓取数据:每小时运行一次爬虫脚本,并将更新后的数据自动提交回仓库。
1. 工作流触发规则
首先定义触发条件:
name: Blog Automation
on: push: branches: - main - master schedule: - cron: '0 * * * *'
|
2. 自动部署任务 (Deploy Job)
这个任务只在 push 事件触发时运行。它配置了 Node.js 环境(版本 24),安装依赖,并执行部署脚本。
jobs: deploy: if: github.event_name == 'push' runs-on: ubuntu-latest permissions: contents: read steps: - name: Checkout code uses: actions/checkout@v3
- name: Setup Node.js uses: actions/setup-node@v3 with: node-version: '24' cache: 'npm'
- name: Install Dependencies run: npm ci
- name: Install Playwright Browsers run: npx playwright install --with-deps chromium
- name: Run Deploy Script run: bash deploy.sh
|
关键点:
npm ci:相比 npm install,它更适合 CI 环境,严格按照 package-lock.json 安装依赖。
deploy.sh:我们将具体的 Hexo 命令封装在脚本中,使用 npx 确保调用的是项目本地的 Hexo:
#!/bin/bash set -e echo "=== 开始清理 Hexo 缓存 ===" npx hexo clean echo "=== 开始生成 Hexo 静态文件 ===" npx hexo g echo "=== 开始部署到服务器 ===" npx hexo d
|
3. 定时抓取与自动提交 (Scrape Job)
这个任务展示了 GitHub Actions 强大的回写能力。它定期运行爬虫,如果有数据更新,会自动 commit 并 push 回仓库。

scrape: if: github.event_name == 'schedule' runs-on: ubuntu-latest permissions: contents: write steps: - name: Checkout code uses: actions/checkout@v3
- name: Setup Node.js uses: actions/setup-node@v3 with: node-version: '24' cache: 'npm'
- name: Run Scraper run: node rq_scraper.js
- name: Commit and Push Changes run: | git config --global user.name 'github-actions[bot]' git config --global user.email 'github-actions[bot]@users.noreply.github.com' git add source/_data/rq_data.json # 仅在有变动时提交 if ! git diff --staged --quiet; then git commit -m "chore: update rq data [skip ci]" git push echo "Changes pushed to repository." else echo "No changes to commit." fi
|
技巧:
permissions: contents: write:这是必须的,否则 Action 无法将更改推送到仓库。
[skip ci]:在 commit message 中加入这个标记,可以避免这次提交再次触发 push 事件导致的构建循环。
总结
通过 GitHub Actions,我们不仅解放了双手,还保证了部署环境的一致性(Node.js 24)。无论是简单的静态博客部署,还是复杂的定时数据处理,GitHub Actions 都能提供优雅的解决方案。
文章作者:阿文
版权声明:本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0 许可协议。转载请注明来自
阿文的博客!