利用 Repository Dispatch 触发 Github Actions 工作流
为提升加载速度,我先前把 Mastodon 集成到博客首页时,采用了静态处理方式。由于博客是通过 Github Actions 构建的,便需要找到一种在 Mastodon 更新后能触发 Github Actions 工作流的方法。实际上,实现这一目标的途径有不少。基于个人需求,我最终选择利用 Mastodon API 结合 Repository Dispatch 来触发 Github Actions 工作流。
Repository Dispatch 工作原理
Repository Dispatch 的核心在于通过向 Github API 发送特定的 HTTP 请求,来触发仓库中的工作流。具体来说,我们可以在请求中指定要触发的工作流以及相关的参数,Github 接收到请求后,会按照预设的规则启动相应的工作流。这就好比给 Github 发送了一个启动信号,告诉它 “嘿,是时候运行这个工作流啦!” 例如,我们可以定时运行脚本,通过 Repository Dispatch 触发 Github Actions 工作流,实现定期自动部署。
一、创建 Github token
要通过 repository_dispatch
事件触发 Github Actions 工作流,需创建一个 Github token,并且这个 token 需要相应的权限来触发工作流并执行相关操作。
二、创建 Shell 脚本来监听 Mastodon API 并按需发送请求来触发工作流
#!/bin/bash
# API URL 只获取最新的三条数据
API_URL="https://Mastodon实例/api/v1/accounts/用户ID/statuses?limit=3"
# POST 地址
POST_URL="https://api.github.com/repos/用户名/仓库名/dispatches"
# GITHUB TOKEN 格式如 AUTH_HEADER="Authorization: Bearer ghp_1234567890987654321"
AUTH_HEADER="Authorization: Bearer Github token"
CONTENT_HEADER="Content-Type: application/json"
# 存储上次获取的数据的本地文件
LAST_DATA_FILE="/root/mastodon/last_status.json"
# 获取 API 数据
current_data=$(curl -s "$API_URL")
# 如果没有旧数据,初始化
if [[ ! -f "$LAST_DATA_FILE" ]]; then
echo "$current_data" > "$LAST_DATA_FILE"
exit 0
fi
# 将当前数据与上次数据进行比较,如果数据不一样就发送 POST 请求
last_data=$(cat "$LAST_DATA_FILE")
if [[ "$current_data" != "$last_data" ]]; then
curl -X POST \
"$POST_URL" \
-H "$AUTH_HEADER" \
-H "$CONTENT_HEADER" \
-d '{
"event_type": "mastodon-post",
"client_payload": {
"user": "username",
"status": "Some status content"
}
}'
# 更新数据供下次对比使用
echo "$current_data" > "$LAST_DATA_FILE"
fi
三、创建定时任务
使用 crontab -e
来创建定时任务来运行上面创建的 Shell 脚本,在任务列表后添加任务。
*/10 * * * * /root/mastodon/mastodon_check.sh
四、创建新的工作流
在项目里创建 .github/workflows/mastodon.yml
来配置新的工作流,便于区分。这里只需将原来的工流复制一份,修改其中的 on 参数。
如:
on:
push:
branches: ['main']
workflow_dispatch:
修改成
on:
repository_dispatch:
types: [mastodon-post]
END