0%

Github Actions+宝塔部署hexo博客到云服务器

Github Actions是GitHub的持续集成服务,可以预设动作(如:main分支push)来触发一些自动化操作。可以用来自动化部署hexo博客。

背景

hexo是常用的一个博客框架,搭配GitHub Pages可以搭建博客。有个问题就是无论用户站点还是项目站点,git库必须是Public的,一个分支放博客站点,一个分支放博客源文件,源文件也开放多少有些不好。

当然也有人建两个库,Public的是站点库,Private是源文件的库。这种分库的也可以用Github Actions去自动部署。

还有使用GitHub Pages在国内访问慢是不可避免的问题,有人用github 和 gitee同时部署,国内外分别解析到不同站点。

本文不说博客搭建问题,主要介绍使用Github Actions实现push博客源文件自动化部署博客到云服务器。

云服务器建站

宝塔创建站点

创建站点

使用宝塔创建站点,会设置好域名和网站目录,然后做好域名解析。(国内服务器域名需要备案)

在创建好的文件目录中会初始化一些文件,有一个.user.ini,是php的防跨站文件,需要在后面的.yml文件中忽略,否则在部署时会报错:

1
rsync: delete_file: unlink(.user.ini) failed: Operation not permitted (1)

设置ssh密钥

在宝塔的终端里,cd ~/.ssh,去到.ssh目录下,查看是否有authorized_keysid_rsaid_rsa.pub。如果没有,使用下面的命令创建:

1
ssh-keygen -m PEM -t rsa -b 4096

注意私钥需要pem格式,不然部署时会报错,问题说明见:ssh-deploy/issues

创建完成之后,需要将公钥拷贝到authorized_keys中,使用命令:

1
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

至此,服务器中的设置完成。

GitHub建库

在GitHub中创建hexo源文件库,可以是私有库。建完库之后,设置Secret

设置ACCESS_TOKEN

在项目的 Settings -> Secrets 中新建一个Sectet,设置ACCESS_TOKEN,名称可以自定义,注意在后面写workflow时文件名要对应。

ACCESS_TOKEN对应的值是上面在服务器中生成的私钥id_rsa,查看id_rsa命令:

1
cat ~/.ssh/id_rsa

设置REMOTE_HOST

REMOTE_HOST对应的值是服务器的ip地址

设置REMOTE_USER

REMOTE_USER对应的值是root

设置TARGET

TARGET对应的值是创建的站点根目录,如上图中/www/wwwroot/xxx.com

设置完成如下图:

设置Secrets

这些值设置在Sectets中,相对来说比较安全。这些值设定之后无法再查看,只能更新或删除。

设置workflow

在项目的Actions中设置workflow,这是一个.yml文件。这个文件会被放在项目的.github/workflow/xx.yml,文件名可自定义。GitHub会自动执行这个目录下的.yml文件。

更详细的知识点请见:阮老师的GitHub Actions 入门教程

下面是部署hexo博客到云服务器的完整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
# main.yml
name: deploy to aliyun # 名称
on: # 触发条件,main分支有push操作时,触发这个自动化脚本执行
push:
branches:
- main
jobs: # 任务集合
build:
runs-on: ubuntu-latest # 运行的虚拟机环境,使用最新版本的ubuntu
steps: # 任务步骤
# 切换分支
- name: Checkout
uses: actions/checkout@main
# 下载 git submodule
- uses: srt32/git-actions@v0.0.3
with:
args: git submodule update --init --recursive
# 使用 node:10
- name: use Node.js 10
uses: actions/setup-node@v1
with:
node-version: 10
# npm install
- name: npm install
run: |
npm install -g hexo-cli
npm install
env:
CI: true
# build
- name: hexo build
run: |
hexo clean
hexo generate
env:
CI: true

# Deploy
- name: Deploy
uses: easingthemes/ssh-deploy@main
env:
SSH_PRIVATE_KEY: ${{ secrets.ACCESS_TOKEN }} # 云服务器私钥
ARGS: "-avzr --delete --exclude /.user.ini" # 忽略服务器上的.user.ini文件
SOURCE: "public/" # hexo编译之后的博客文件目录
REMOTE_HOST: ${{ secrets.REMOTE_HOST }} # 云服务器ip地址
REMOTE_USER: ${{ secrets.REMOTE_USER }} # 云服务器用户名
TARGET: ${{ secrets.TARGET }} # 部署的云服务器目录

Deploy脚本详见:ssh-deploy

设置好Actions保存之后,会立即执行一次自动化部署,之后只需要写博客push到GitHub,即会自动部署。香的很!

正确执行结果

参考文章

使用GithubActions自动部署应用到自己的服务器(ECS)

Github Actions实现CI/CD配置

打赏作者一杯咖啡