2024 桐庐半程马拉松
00:00:00
时间
0.00
距离(公里)
--:--
配速
--
步频
--
心率 (bpm)
--
配速
步频
|
share-image
ESC

GitHub Actions 实战:自动化部署 Hexo 博客与定时任务

在维护 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 文件,实现了两个核心功能:

  1. 代码提交时自动部署:当推送到 main 分支时,自动构建并部署博客。
  2. 定时抓取数据:每小时运行一次爬虫脚本,并将更新后的数据自动提交回仓库。

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 都能提供优雅的解决方案。

文章作者:阿文
文章链接: https://www.awen.me/post/da3709f0.html
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 阿文的博客