我用Hexo有些时间了,虽然Hexo简单可靠,但每次写新文章后页面都要手动上传,多少不太方便。恰巧Gitea刚发布了带有Actions功能的1.20版本,这下写好文章只管推送就行,Actions会自动更新博客的内容。
先说一下我的情况,以及为什么不直接用Github Actions而是自己搭建Gitea。
- 首先Github Actions的主机在国外,而我博客是在国内,有时候会出现网络问题连不上。(概率很小但是很烦人)
- 其次我倾向于把图片存到博客里,而不喜欢使用图床,所以我的博客仓库还是比较大的,可能会超过500MB大小。
- 最后是国内有时候直连Github推代码会推不上,网络超时。
综合考虑后把博客迁移到了自己的Gitea实例里,国内直连嘎嘎快,单仓库还没有容量限制,可以上传任意多的图片和文章。
打开Actions功能
Gitea Actions这个功能默认是关闭的,我们要手动给他打开,方法如下。
打开Gitea安装目录,找到app.ini文件。在文件的最末尾,添加以下内容,然后重启Gitea本身就可以了。
[actions]
ENABLED = true
想要验证开启成功也很简单,登录Gitea后打开管理面板,如果左侧菜单中出现了“Runner”选项,那说明开启成功了。接下来我们就要注册Gitea Runner了。
Gitea Runner是实际负责跑Actions任务的程序,之所以不把Runner直接集成到Gitea里面是因为如果我们有一大堆的机器,可以在每个机器上都运行一个Runner,这样如果同时有很多个任务过来的时候,每个Runner都能有活干,这样就能分担跑Gitea那台主机的压力了。所以这里我们要单独安装负责干活的Runner,Gitea本身只是负责指挥而已。
安装Gitea Runner
这里我使用Docker Compose安装Actions Runner,如果你喜欢也可以直接运行的。无论用什么方法运行Runner,都需要安装Docker,因为Runner需要Docker来隔离运行环境!所以安装Runner前务必装好Docker。
我们新建一个叫actions的文件夹,然后在里面新建两个文件夹,一个叫cache,另一个叫data。cache用来保存Runner的缓存数据,data用来保存配置文件。
另外再创建一个docker-compose.yml文件。接着编辑这个文件:
粘贴以下内容进去:
version: '3'
services:
main:
image: gitea/act_runner:0.2.5 # 这里使用0.2.5版本
restart: unless-stopped
environment:
- LANG=C.UTF-8
- CONFIG_FILE=/data/config.yml # 指定配置文件
- GITEA_RUNNER_NAME=DefaultRunner # 指定Runner的在Giea里显示的名字
- GITEA_INSTANCE_URL=https://my-own-gitea.com # Gitea的链接
- GITEA_RUNNER_REGISTRATION_TOKEN=A18XXXXXXXXXXXXXXXXXXXX # 这是Gitea给Runner的注册密钥
volumes:
- /etc/localtime:/etc/localtime:r # 同步时区信息
- /var/run/docker.sock:/var/run/docker.sock # 将docker权限暴露给runner
- ./data:/data # 挂载数据卷
- ./cache:/root/.cache # 挂载缓存卷
好了以后先不着急启动Runner,因为我们的密钥还没有生成好。
打开Gitea管理面板,找到Actions选项,点击页面右上角的 “创建 Runner”按钮就可以看到密钥了,我们把这个密钥复制然后粘贴替换上面文件中的GITEA_RUNNER_REGISTRATION_TOKEN选项后面的值就好了。
接着启动Runner就能在Gitea里看到Runner已经连接了。(如上图)到此Runner就选配置完毕了。
编写workflow文件
接下来我们开始配置博客的自动更新。
首先我们要准备一个可以正常运行的Hexo博客,然后把它推送到Gitea仓库里,之后大概长这样:
接着需要在仓库的根目录创建Gitea Actions的工作流文件:.gitea/workflows/publish.yml
,我这里叫它publush.yml了,你也可以叫别的名字.yml。这个文件就存储了我们仓库推送后要执行哪些命令和任务。
自动更新博客的过程可以分成三个:1.安装node依赖;2.构建博客页面;3.发布博客页面
然后我们在publish.yml文件里粘贴这些内容:
name: Publish Blog
on:
push:
branches: [ "main" ] # 在main分支推送代码时触发任务
pull_request:
branches: [ "main" ] # 在合并到main分支时触发任务
jobs:
main: # 这里只定义了一个main任务
runs-on: ubuntu-latest # 任务再哪个机器上跑
steps:
# 首先需要检出仓库的内容
- name: Check out repository
uses: actions/checkout@v3
# 然后设置缓存,这样后续允许就会变快
- name: Load Cache
uses: actions/cache@v3
with:
path: ./node_modules # 这里只缓存node_modules文件
key: node_modules
# 安装node 16
- name: Setup NodeJs
uses: actions/setup-node@v3
with:
node-version: 16
# 安装node依赖
- name: Install node packages
run: yarn install
# 允许yarn hexo build来构建博客页面
- name: Generate site pages
run: yarn run build
# 发布到网上,这里的publish-blog是我自己写的上传到对象存储的工具,所以就打码了
- name: Publish Pages
uses: https://my-own-gitea.com/actions/publish-blog@main
with:
access_id: xxxxxxxxxxxxxxxxxxxxxxxxxxxx
access_key: xxxxxxxxxxxxxxxxxxxxxx
其实这个过程不复杂:在检出仓库后,就安装nodejs,接着运行yarn hexo build
来构建hexo页面就好了,我这里使用的是yarn,你也可以使用npm,效果是一样的。最后是发布,我自己的博客是部署在对象存储的,所以我写了一个小脚本来上传public目录下的内容。如果你的博客部署在其它地方,这一步可能要自己去找相关的actions包去上传。
推送博客测试
最后一步就是推送博客内容进行测试了,一般来说,如果是第一次使用Gitea Actions,那么这Actions大概率会报错。如果发生报错不要着急,自行看报错信息,大部分问题都可以通过看报错信息解决。因为Actions调试起来很慢,要有耐心慢慢去调试。
最后如果运行之后所有的任务都是勾,那么就说明博客推送成功了。