COS + Github Actions 实现语雀自动发布

配置 Github Actions

Secrets

SECRET_ID操作员账号
SECRET_KEY操作员密码
YUQUE_TOKEN语雀访问令牌
HEXO_DEPLOY_KEY部署私钥(用于 hexo deploy)

Workflows

在根目录下,新增 **.github/workflows/main.yaml **文件

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
60
61
62
63
64
65
66
67
68
name: Deploy

on:
# 外部事件触发
repository_dispatch:
types:
- start
# 定时任务触发
# schedule:
# - cron: '0 0 * * *'

jobs:
build:
runs-on: ubuntu-latest

steps:
- name: checkout
uses: actions/checkout@master

- name: install node
uses: actions/setup-node@master
with:
node-version: "16"

- name: 安装依赖
run: npm install

- name: 语雀同步
env:
SECRET_ID: ${{ secrets.SECRET_ID }}
SECRET_KEY: ${{ secrets.SECRET_KEY }}
YUQUE_TOKEN: ${{ secrets.YUQUE_TOKEN }}
run: |
npm run yuque:clean
npm run yuque:sync

- name: 博客构建
run: |
npm run clean
npm run build

- name: GIT配置
run: |
git config --global user.name "your name"
git config --global user.email "your email"

- name: 提交变更
run: |
echo `date +"%Y-%m-%d %H:%M:%S"` begin > deploy.txt
git add .
git commit -m "Refresh content" -a
git pull origin master

- name: 推送变更
uses: ad-m/github-push-action@master
with:
github_token: ${{ secrets.GITHUB_TOKEN }}

- name: 博客发布
env:
HEXO_DEPLOY_KEY: ${{ secrets.HEXO_DEPLOY_KEY }}
run: |
mkdir -p ~/.ssh/
echo "$HEXO_DEPLOY_KEY" > ~/.ssh/id_rsa
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_rsa
ssh-keyscan github.com >> ~/.ssh/known_hosts
npm run deploy

构建测试

命令行 curl 链接,手动触发查看是否可以构建成功。

1
2
3
4
5
6
curl --location --request POST 'https://api.github.com/repos/用户名/仓库名/dispatches' \
--header 'Authorization: token GITHUB访问令牌' \
--header 'Accept: application/vnd.github.everest-preview+json' \
--header 'Content-Type: application/json' \
--header 'User-Agent: curl/7.52.1' \
--data-raw '{"event_type": "start"}'

如下图所示,则说明可以构建成功。

配置腾讯云函数

由于语雀的 webhook,不支持 POST 请求以及自定义请求头,所以咱们通过腾讯云的云函数进行处理。

访问 Serverless 控制台,选择函数服务,新增云函数。

模板选择“从头开始”,函数类型选择“事件函数”,运行环境选择“python2.7

函数代码选择“在线编辑”,代码如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# -*- coding: utf8 -*-
import requests

def main_handler(event, context):
url = "https://api.github.com/repos/用户名/仓库名/dispatches"
payload="{\"event_type\": \"start\"}"
headers = {
'Authorization': 'token GITHUB访问令牌',
'Accept': 'application/vnd.github.everest-preview+json',
'Content-Type': 'application/json',
'User-Agent': 'curl/7.52.1'
}
response = requests.request("POST", url, headers=headers, data=payload)
if response.status_code == 204:
return "This's OK!"
else:
return response.status_code

注:event_type 的值需要和 Github Actions 中配置的 repository_dispatch 的 types 值保持一致。

注:Authorization 值为 字符串 “token Github 访问 token“。

触发器配置,选择“自定义创建”,触发方式选择“API 网关触发”

完成创建后,点击查看云函数的公网访问路径。

配置语雀 Webhook

知识库设置 -> 消息推送 -> 其他渠道 -> 添加推送。