我用Hexo有些时间了,虽然Hexo简单可靠,但每次写新文章后页面都要手动上传,多少不太方便。恰巧Gitea刚发布了带有Actions功能的1.20版本,这下写好文章只管推送就行,Actions会自动更新博客的内容。

先说一下我的情况,以及为什么不直接用Github Actions而是自己搭建Gitea。

  1. 首先Github Actions的主机在国外,而我博客是在国内,有时候会出现网络问题连不上。(概率很小但是很烦人)
  2. 其次我倾向于把图片存到博客里,而不喜欢使用图床,所以我的博客仓库还是比较大的,可能会超过500MB大小。
  3. 最后是国内有时候直连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选项后面的值就好了。

2

接着启动Runner就能在Gitea里看到Runner已经连接了。(如上图)到此Runner就选配置完毕了。

编写workflow文件

接下来我们开始配置博客的自动更新。

首先我们要准备一个可以正常运行的Hexo博客,然后把它推送到Gitea仓库里,之后大概长这样:

1

接着需要在仓库的根目录创建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调试起来很慢,要有耐心慢慢去调试。

最后如果运行之后所有的任务都是勾,那么就说明博客推送成功了。

3