# Hexo 使用 github Action 发布

# 介绍

Github Actions 可以很方便实现 CI/CD 工作流,类似 Travis 的用法,来帮我们完成一些工作,比如实现自动化测试、打包、部署等操作。当我们运行 Jobs 时,它会创建一个容器 (runner),容器支持:Ubuntu、Windows 和 MacOS 等系统,在容器中我们可以安装软件,利用安装的软件帮我们处理一些数据,然后把处理好的数据推送到某个地方。

本文将介绍利用 Github Actions 实现自动部署 hexo 到 Github Pages 和阿里云 oss

没有 Github Actions 之前,我们需要写完文章执行 hexo d 来进行部署。有了 Github Actions 之后,workflow 会自动部署我们的笔记。

# 前提

# 创建所需仓库

  1. 创建一个 github 仓库用来存放 Hexo 项目,我这边是 Twelveeee/MyNotesBlog 一个 private 的仓库
  2. 创建 your.github.io 仓库用来存放静态博客 github page,我这边是 Twelveeee/Twelveeee.github.io

# 配置 GithubToken

GithubToken 是为了在执行 githubAction 的时候有权限访问仓库

参考 https://blog.51cto.com/u_15069485/3590346

在 github setting 打开 Developer settings

image-20241001233238214

打开 Personal access tokens

image-20241001233409638

点击 Generate new token 按钮

image-20241001233508640

选择对应的仓库

image-20241001233811094

Permissions

Read access to actions variables and secrets

Read and Write access to actions, code, commit statuses, deployments, environments, pages, pull requests, and workflows

获取到 token 记录下来

# 配置 GithubAction 参数

打开项目, Settinngs->Secrets and variables New repository secret

image-20241002000219935

把上面提到的 token 写进去 变量名称需要与下面的 deploy.yml 一致

# 编写 Github Actions

# Workflow 模版

blog 仓库根目录下创建 .github/workflows/deploy.yml 文件,目录结构如下。

blog (repository)
└── .github
    └── workflows
        └── deploy.yml

deploy.yml 文件中粘贴以下内容。并且更改 env 为自己对应的值。

name: Pages
on:
  push:
    branches:
      - main
env:
  GIT_USER: Twelveeee
  GIT_EMAIL: twelveeee12@gmail.com
  THEME_REPO: Twelveeee/hexo-theme-shokaV2
  THEME_BRANCH: master
  THEME_NAME: shoka
  DEPLOY_REPO: Twelveeee/Twelveeee.github.io
  DEPLOY_BRANCH: main
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          token: ${{secrets.PAT_TOKEN}}
          submodules: recursive
      - name: Configuration environment
        run: |
          sudo timedatectl set-timezone "Asia/Shanghai"
          git config --global user.name $GIT_USER
          git config --global user.email $GIT_EMAIL
      - name: Checkout theme repo
        uses: actions/checkout@v4
        with:
          repository: ${{ env.THEME_REPO }}
          ref: ${{ env.THEME_BRANCH }}
          path: themes/${{ env.THEME_NAME }}
          token: ${{ secrets.PAT_TOKEN }}
      - name: Checkout deploy repo
        uses: actions/checkout@v4
        with:
          repository: ${{ env.DEPLOY_REPO }}
          ref: ${{ env.DEPLOY_BRANCH }}
          path: .deploy_git
          token: ${{ secrets.PAT_TOKEN }}
  
      - name: Use Node.js 20
        uses: actions/setup-node@v4
        with:
          node-version: "20"
      - name: Cache NPM dependencies
        uses: actions/cache@v4
        with:
          path: node_modules
          key: ${{ runner.OS }}-npm-cache
          restore-keys: |
            ${{ runner.OS }}-npm-cache
      - name: Install Dependencies
        run: npm install
      - name: Deploy hexo
        env:
          GITHUB_TOKEN: ${{ secrets.PAT_TOKEN }}
        run: |
          npm run deploy

# 模版说明

# Workflow Overview

这个工作流名为 Pages ,在 main 分支有新的推送时会被触发。都会自动更新博客的内容。

# Environment Variables

  • GIT_USER: Git 用户名,用于配置 Git 提交。
  • GIT_EMAIL: Git 邮箱地址,用于配置 Git 提交。
  • THEME_REPO: Hexo 主题的仓库地址。
  • THEME_BRANCH: Hexo 主题的分支。
  • THEME_NAME: Hexo 主题的名称。
  • DEPLOY_REPO: 部署的 GitHub Pages 仓库。
  • DEPLOY_BRANCH: 部署的分支。

# Job: build

这个工作流定义了一个名为 build 的作业,运行在最新的 Ubuntu 环境上。

# Steps
  1. Checkout Main Repository:
    • 使用 actions/checkout@v4 来签出触发工作流的主仓库代码。
    • 使用 ${{ secrets.PAT_TOKEN }} 作为身份验证令牌。
    • 递归地签出子模块。
  2. Configuration Environment:
    • 设置时区为 "Asia/Shanghai"。
    • 配置 Git 用户名和邮箱,以便后续的提交操作。
  3. Checkout Theme Repository:
    • 使用 actions/checkout@v4 签出主题仓库。
    • 指定分支和路径为 themes/${{ env.THEME_NAME }}
    • 使用 ${{ secrets.PAT_TOKEN }} 进行身份验证。
  4. Checkout Deploy Repository:
    • 使用 actions/checkout@v4 签出用于部署的仓库。
    • 指定分支和路径为 .deploy_git
    • 使用 ${{ secrets.PAT_TOKEN }} 进行身份验证。
  5. Use Node.js 20:
    • 使用 actions/setup-node@v4 来设置 Node.js 环境,版本为 20。
  6. Cache NPM Dependencies:
    • 使用 actions/cache@v4 缓存 node_modules 目录,以加速后续的构建。
    • 使用 ${{ runner.OS }}-npm-cache 作为缓存键。
  7. Install Dependencies:
    • 运行 npm install 安装项目所需的依赖。
  8. Deploy Hexo:
    • 设置 GITHUB_TOKEN 环境变量,用于身份验证。
    • 运行 npm run deploy ,执行 Hexo 部署脚本,将生成的静态文件推送到 GitHub Pages 仓库。

# 部署注意事项

因为使用到了 npm run deploy 所以 package.json 里面要有 deploy

"scripts": {
    "build": "hexo generate",
    "clean": "hexo clean",
    "deploy": "hexo deploy",
    "server": "hexo server"
  },

使用 hexo deploy

所以需要确保安装了 hexo deploy 服务

# 发布到 oss
npm i hexo-deployer-ali-oss-extend
# 发布到 github page 
npm install hexo-deployer-git --save

并且配置了相应的配置

_config.yml

deploy:
- type: ali-oss
  region: oss-cn-beijing
  accessKeyId: ***
  accessKeySecret: ***
  bucket: ***
  cacheControl:
    images: 
    css:
    js:
    html:
    other:
- type: git
  repo: https://github.com/Twelveeee/Twelveeee.github.io
  branch: main

当然,如果没有对应的 type 可以将相应的配置注释掉。

# 执行任务

image-20241002001734778

任务完成之后查看 对应的 github page

https://twelveeee.github.io/

确实有相应的文章

# 参考资料

https://hexo.io/docs/github-pages#One-command-deployment

https://sanonz.github.io/2020/deploy-a-hexo-blog-from-github-actions/

https://github.com/actions/checkout

-->