使用GitHub Action自动部署Hexo
前言
Hexo
+Github Page
让很多没用服务器的人也拥有了自己的博客,添加好配置文件后可以通过hexo d
直接部署到服务器上,这种方式部署到Github Page
是挺方便,但是如果要部署到自己的服务器就比较麻烦,得编译后再上传到自己的服务器。
Github Actions 可以很方便实现 CI/CD 工作流,通过它可以实现抓取代码、运行测试、登录远程服务器,发布到第三方服务等等,我们使用它来自动部署博客到想部署的位置。
思路
建立yourname.github.io
库,本地写好文章后推送到hexo
分支,自动编译后部署到master
分支,然后在上传到我自己的服务器,这样就实现了gooohlan.github.io和gooohlan.cn的同时部署。
开始
创建所需仓库
创建yourname.github.io
库,并创建hexo
分支,hexo
分支用户存储博客源码,默认的master
分支用于存放编译好的GitHub源码。
配置部署密钥
使用以下命令生成部署密钥(一路回车到底即可)
1 | ssh-keygen -t rsa -b 4096 -C "$(git config user.email)" -f gh-pages -N "" |
切记将生成的密钥文件添加到.gitignore
中!!!
接下来,去仓库设置
-
复制
gh-pages.pub
的内容,仓库的Settings -> Deploy keys -> Add deploy key
页面粘贴你的内容,Title
可随意填写,并勾选Allow write access
,实测可不配置 -
复制
gh-pages
的内容,去仓库的Settings -> Secrets -> Add a new secret
页面上粘贴你的内容,Name
字段填写为ACTION_DEPLOY_KEY(可更改)
添加你的公钥 成功 添加你的私钥 成功 GitHub Secret
可以用来存储一些私密内容,类似一些私钥,Key之类的,在CI中通过${{ Secret Name}}
取出对应的值
编写 Github Actions
在yourname.github.io
创建仓库根目录下创建 .github/workflows/HexoCI.yml
文件,目录结构如下
1 | ├── .github |
编写HexoCI.yml
文件
1 | name: CI |
模版参数说明
-
name 为此 Action 的名字
-
on 触发条件,当满足条件时会触发此任务,这里的
on.push.branches.$.hexo
是指当hexo
分支收到push
后执行任务 -
jobs 为此 Action 下的任务列表
- jobs.{job}.name 任务名称
- jobs.{job}.runs-on 任务所需容器,可选值:
ubuntu-latest
、windows-latest
、macos-latest
。
- jobs.{job}.steps* 一个步骤数组,可以把所要干的事分步骤放到这里。
- jobs.{job}.steps.$.name 步骤名,编译时会会以 LOG 形式输出。
- jobs.{job}.steps.$.uses 所要调用的 Action,可以到 https://github.com/actions 查看更多。
- jobs.{job}.steps.$.with 一个对象,调用 Action 传的参数,具体可以查看所使用 Action 的说明。
- env 为环境变量对象,用于放置一些环节变量
第三方 Actions
使用第三方 Actions 语法 {owner}/{repo}@{ref}
或者 {owner}/{repo}/{path}@{ref}
例如:
1 | steps: |
1 | - name: 清除Hexo |
我使用的大部分都是第三方的Actions,更多第三方Actions可查看官方 Actions 市场
可以根据自己的需求书写对应的配置文件,可以参考我的HexoCI.yml
额外配置
因为上述配置文件使用了第三方Actions:peaceiris/actions-gh-pages,所以需要额外配置个人访问令牌,配置路径你的头像 -> Settings -> Personal access tokens -> Personal access tokens -> Generate new token
,勾选 repo
即可,创建成功后复制生成的token
,回到项目设置中,参考第二步中配置私钥的方式,将token
填入Value
,再配置一个Name
即可,下例中的CI_TOKEN
就是我配置的
1 | - name: 部署到master分支 |
配置个人访问令牌 | 成功 |
---|---|
部署到个人服务器(可选)
通过配置私钥到GitHub Secret
实现服务器的免密登录,再scp
编译好的静态页面到你的服务器,参考如下配置,其中ACTION_DEPLOY_KEY
为免密登录的私钥,SERVER_DIR
为服务器地址及目录
1 | - name: 部署到个人服务器 |
上传配置文件
push
到yourname.github.io
的hexo
分支,到此仓库的Actions
页面查看当前 task
当任务完成后查看您的博客 https://yourname.github.io
,如果不出意外的话已经可以看到自动部署的文章了,如有意外欢迎留言
可能出现的问题
-
问题1:
出现该问题是node版本过低导致的,在
yaml
文件中指定node版本为12+
,或者设置1
2highlight:
enable: false