GitHub Actions 简介

GitHub Actions 是一个持续集成和持续交付 (CI/CD) 平台,可用于自动执行构建、测试和部署管道。 您可以创建工作流程来构建和测试存储库的每个拉取请求,或将合并的拉取请求部署到生产环境。

GitHub Actions 不仅仅是 DevOps,还允许您在存储库中发生其他事件时运行工作流程。 例如,您可以运行工作流程,以便在有人在您的存储库中创建新问题时自动添加相应的标签。

GitHub Actions 有一些自己的术语。

(1)workflow (工作流程):持续集成一次运行的过程,就是一个 workflow。

(2)job (任务):一个 workflow 由一个或多个 jobs 构成,含义是一次持续集成的运行,可以完成多个任务。

(3)step(步骤):每个 job 由多个 step 构成,一步步完成。

(4)action (动作):每个 step 可以依次执行一个或多个命令(action)。

环境准备

我的个人站点 Kyire の Blog - 记录美好生活 是通过 Hexo 框架搭建的。

搭建方法可参考:Hexo+Gitee 搭建个人博客 | Kyire の Blog

准备三个仓库:

  • 私有Hexo源码仓库(Blog):博客文章以及Hexo源代码
  • GitHub公共静态页面仓库(Kyire6.github.io):Hexo源码编译后生成的静态页面
  • Gitee公共静态页面仓库(Kyire6):内容跟 Kyire6.github.io 一样,只是使用的服务不同

自动部署的流程如下:

image-20220615223542331

GitHub 密钥配置

生成 ssh密钥对,用于部署静态文件,以及更新 Gitee Pages 服务:

  1. 生成密钥

执行如下命令生成 ssh密钥对,替换邮件地址为你的GitHub 邮箱地址:

1
ssh-keygen -f hexo-deploy-key -t rsa -C "username@example.com"

命令执行后会生成两个文件:hexo-deploy-key(私钥) 和 hexo-deploy-key.pub(公钥)

  1. 将公钥添加到 Github Pages 仓库中

Kyire6.github.io仓库 -> Settings -> Deploy keys -> Add deploy key

  • Title 设置为 HEXO_DEPLOY_PUB
  • Key 填写 hexo-deploy-key.pub 文件内容
  • 勾选 Allow write access 选项

image-20220615231127446

  1. 将私钥添加到博客源码仓库中

Blog仓库 -> Settings -> Secrets -> Actions -> New repository secret

  • Name 填写 HEXO_DEPLOY_KEY
  • Value 填写 github-deploy-key 文件内容

image-20220615231916597

  1. 将 Gitee 账号密码添加到博客源码仓库中

Blog仓库 -> Settings -> Secrets -> Actions -> New repository secret

  • Name 填写 GITEE_PASSWORD
  • Value 填写 Gitee账号的密码

image-20220615233124815

Gitee 密钥配置

直接使用之前生成的密钥

  1. 将公钥添加到 Gitee Pages 仓库中

Kyire6仓库 -> 管理 -> 部署公钥管理 -> 添加公钥

GitHub 一样需要对仓库有写权限,点击【添加个人公钥】

image-20220615232742168

  • 标题 设置为 HEXO_DEPLOY_PUB
  • 公钥 填写 hexo-deploy-key.pub 文件内容

image-20220615232822304

配置 GitHub Actions

在博客源码仓库(Blog)中,编写 workflow 文件

在仓库的根目录下创建 .github/workflow/deploy.yml 文件,yaml 文件名可以自定义。

下面是结合 Hexo ActionGitee Pages Action workflow 文件

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
name: Hexo deploy

on:
push:
paths-ignore:
- 'source/_drafts/**'
- '.github/**'
jobs:
build:
runs-on: ubuntu-latest
name: A job to deploy blog.
steps:
- name: Checkout
uses: actions/checkout@v1
with:
submodules: true

- name: Cache node modules
uses: actions/cache@v1
id: cache
with:
path: node_modules
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-
- name: Install Dependencies
if: steps.cache.outputs.cache-hit != 'true'
run: npm ci

# Deploy hexo blog website.
- name: Deploy
id: deploy
uses: sma11black/hexo-action@v1.0.4
with:
# 用于访问 GitHub 静态页面仓库的部署密钥(私钥)。
deploy_key: ${{ secrets.HEXO_DEPLOY_KEY }}
# 用于部署的 github 帐户的用户名。
user_name: Kyire6
# 用于部署的 github 帐户的用户电子邮件。
user_email: kyire666@outlook.com
commit_msg: ${{ github.event.head_commit.message }}
- name: Get the output
run: |
echo "${{ steps.deploy.outputs.notify }}"
sync:
needs: build
runs-on: ubuntu-latest
steps:
- name: Sync to Gitee
uses: wearerequired/git-mirror-action@master
env:
# 用于访问 GitHub 静态页面仓库的部署密钥(私钥)。
SSH_PRIVATE_KEY: ${{ secrets.HEXO_DEPLOY_KEY }}
with:
# 源仓库
source-repo: git@github.com:Kyire6/Kyire6.github.io.git
# 目标仓库
destination-repo: git@gitee.com:Kyire6/Kyire6.git
reload-pages:
needs: sync
runs-on: ubuntu-latest
steps:
- name: Build Gitee Pages
uses: yanglbme/gitee-pages-action@main
with:
# Gitee登录用户名
gitee-username: Kyire6
# Gitee账号密码
gitee-password: ${{ secrets.GITEE_PASSWORD }}
# Gitee仓库名称,注意大小写
gitee-repo: Kyire6/Kyire6
# 仓库分支名,根据实际情况填写
branch: master

部分字段解释:

  1. name:workflow 名称

  2. on:触发 workflow 的事件

    • push:push 事件
    • paths-ignore:忽略指定的目录,也就是在忽略路径外的其它目录文件改动时才触发
    • 还可以设置多种触发条件,比如支持 cron 语法实现定时触发,参考这里
  3. jobs:执行任务

    • build:博客编译和发布,发布到 Github Pages
    • sync:将更新后的 hiyongz.github.io 仓库同步到 Gitee
    • reload-pages:自动更新 Pages,因为 Gitee Pages 不像 GitHub Pages 那样提交代码就自动更新。
    • runs-on:运行环境,支持 windows,Ubuntu 和 macOS
    • steps:指定每个 Job 的运行步骤
    • sma11black/hexo-action@v1.0.4:博客构建发布,引用了 Hexo Action:
    • wearerequired/git-mirror-action@master:仓库同步,引用了 git-mirror-action
    • yanglbme/gitee-pages-action@main:自动更新 Gitee Pages,引用了 Gitee Pages Action

参考资料:GitHub Actions 的工作流程语法 - GitHub Docs

效果

更新文章之后,提交博客源码到 Blog 仓库,满足 GitHub Actions 条件,触发 deploy.yml 中的编写的流水线:

image-20220615235619570

流水线运行成功,查看 Kyire6.github.io 和 Gitee 的 Kyire6 仓库可以发现都有更新(静态页面公共仓库),并且 Gitee Pages 服务也自动触发更新了,这样就通过 GitHub Actions 实现 Hexo 博客的自动发布。

以后只需要将文章写好之后,push 到博客源码仓库后,触发流水线自动编译并部署,实现 CI/CD 操作,提升效率,避免重复的人工操作!