Hexo使用Git Actions自动化部署

背景

之前一篇文章介绍了hexo与gitbook集成,主题博客还是使用hexo搭建,部分系列文章使用gitbook构建。但是每次书写了新文章都要编译、集成gitbook,然后push到git仓库中,最后去服务器上拉取静态页面代码,生成我们的网站界面。整个操作还是略显麻烦,所以研究了下Github Action将hexo自动部署到我的服务器上。

GitHub Actions

实现代码提交的自动化工作流,要依靠持续集成(或者加上持续交付)服务。现在主流的公用免费的持续集成服务有:

  • Travis CI
  • Jenkins
  • Circle CI
  • Azure Pipeline
  • GitHub Actions

本文使用GitHub Actions来完成自动化部署工作。GitHub ActionsGitHub自家的持续集成及自动化工作流服务,简单易用。只要在仓库目录下建立github/workflows文件夹,将我们的工作流配置(YAML)文件放到这个目录下,就能启用GitHub Actions服务

创建GitHub仓库

GitHub上创建blog仓库在存放我们的Hexo项目

创建SSH 密钥对连接

要把文件部署到远程服务器,首先要解决登录校验的问题。要么用密码登录、要么用 SSH 密钥登录。这里推荐用第二种方式,因为密码可能要定期更换,而用 SSH 密钥可以一劳永逸。

其实主要是GitHub偷偷在七夕(2021年8月14日)这天将密码认证给取消了!

1
2
remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead.
remote: Please see https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/ for more information.

生成秘钥

首先登录我们的服务器,然后执行

1
2
cd ~/.ssh
ssh-keygen -t rsa -f blog

默认回车执行,就会在我们的~/.ssh文件夹下生成两个文件blog(私钥)和blog.pub(公钥)。其中私钥是我们的个人登录凭证,公钥则存放到需要登录的服务器上。

存放公钥

将公钥blog.pub存放到服务器上的~/.ssh/authorized_keys中:

1
2
cd ~/.ssh
cat blog.pub >> authorized_keys

存放私钥

私钥需要存放到我们的github仓库中,这样我们的仓库才能连接到我们的服务器。

具体操作:
打开代码仓库,点击 Settings 标签,找到 Secrets 设定:
secrets

选择Add a new secret,添加一个配置项DEPLOY_KEY,将私钥的内容粘贴在其中。
可以看到我这里还将服务的ip和用户名,添加到了配置中,方便后续登录使用。

编写工作流文件

可以在github仓库界面上点击Actions创建新的工作流,这里可以选择很多模板。

或者干脆在本地仓库跟目录下建立github/workflows文件夹,再创建一个main.yml文件,文件内容参考如下:

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
# This is a basic workflow to help you get started with Actions

name: CI

# Controls when the workflow will run
on:
# Triggers the workflow on push or pull request events but only for the main branch
push:
branches: [ main ]
pull_request:
branches: [ main ]

# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:

env:
GIT_USER: TiannV
GIT_EMAIL: [email protected]
DEPLOY_BRANCH: main

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
# This workflow contains a single job called "build"
build:
# The type of runner that the job will run on
runs-on: ubuntu-latest

# Steps represent a sequence of tasks that will be executed as part of the job
steps:
# Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
- uses: actions/checkout@v2 #第一步,下载代码仓库
- name: Deploy gitbook # 第二步,部署gitbook
uses: actions/setup-node@v1
with:
node-version: '10.14.1'
- run: |
npm i -g gitbook-cli
cd /home/runner/work/blog/blog/gitbook
sh run.sh
- name: Deploy public # 第三步,rsync推文件
uses: AEnterprise/[email protected] # 使用别人包装好的步骤镜像
env:
DEPLOY_KEY: ${{ secrets.DEPLOY_KEY }} # 引用配置,SSH私钥
ARGS: -avz --delete --exclude='*.pyc' # rsync参数,排除.pyc文件
SERVER_PORT: "22" # SSH端口
FOLDER: ./public # 要推送的文件夹,路径相对于代码仓库的根目录
SERVER_IP: ${{ secrets.SSH_HOST }} # 引用配置,服务器的host名(IP或者域名domain.com)
USERNAME: ${{ secrets.SSH_USERNAME }} # 引用配置,服务器登录名
SERVER_DESTINATION: /home/blog # 部署到目标文件夹

- name: Restart server # 第四步,重启服务
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.SSH_HOST }} # 下面三个配置与上一步类似
username: ${{ secrets.SSH_USERNAME }}
key: ${{ secrets.DEPLOY_KEY }}
# 重启的脚本,根据自身情况做相应改动,一般要做的是migrate数据库以及重启服务器
script: |
service nginx restart

流程第一步

下载代码仓库;

流程第二步

使用我自己的脚本,将gitbook集成到hexo中,可以查看hexo与gitbook集成这篇文章。

流程第三步

将代码仓库下的public仓库推送到我们的服务器中,因为我们需要的静态网站资源也就存放在public目录下。这里就用上了我们之前创建的秘钥。

流程第四步

因为我的博客网站主要是靠nginx服务映射到服务器的本地目录下,所以这里重启一下nginx服务,强制刷新一下。

yml文件提交到仓库中,我们的Actions就已经启动了!

执行自动化部署

在本地目录执行一次提交,看看我们的Action执行结果:

actions

成功!