Skip to content

Commit c7ca324

Browse files
azuclaude
andauthored
ci: Bluesky への RSS 自動投稿 workflow を追加 (#1373)
* docs: add design spec for rss-to-bluesky workflow Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * ci: add rss-to-bluesky workflow Post jser.info and realtime.jser.info feeds to Bluesky (@jser.info) using joschi/blueskyfeedbot, mirroring the existing Mastodon workflow. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 122a8d8 commit c7ca324

2 files changed

Lines changed: 158 additions & 0 deletions

File tree

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
# Source: https://github.com/joschi/blueskyfeedbot
2+
name: rss-to-bluesky
3+
on:
4+
schedule:
5+
- cron: '*/5 * * * *'
6+
workflow_dispatch:
7+
concurrency:
8+
group: feedbot-bluesky
9+
jobs:
10+
realtime:
11+
runs-on: ubuntu-latest
12+
permissions:
13+
actions: write
14+
steps:
15+
- name: Generate cache key
16+
uses: actions/github-script@d7906e4ad0b1822421a7e6a35d5ca353c962f410 # v6.4.1
17+
id: generate-key
18+
with:
19+
script: |
20+
core.setOutput('cache-key', new Date().valueOf())
21+
22+
- name: Retrieve cache
23+
uses: actions/cache@6f8efc29b200d32929f49075959781ed54ec270c # v3.5.0
24+
with:
25+
path: ${{ github.workspace }}/blueskyfeedbot
26+
key: feed-cache-realtime-jser-info-bluesky-${{ steps.generate-key.outputs.cache-key }}
27+
restore-keys: feed-cache-realtime-jser-info-bluesky-
28+
29+
- name: JSer.info realtime
30+
uses: 'joschi/blueskyfeedbot@ded1962e3afb0d7283f49a037bf4d4fd9d7b86ad' # v1
31+
with:
32+
rss-feed: https://realtime.jser.info/feed.xml
33+
template: |
34+
{{item.title}}
35+
{{item.link}}
36+
37+
{{item.description}}
38+
service-url: https://bsky.social
39+
username: ${{ secrets.JSER_BLUESKY_USERNAME }}
40+
password: ${{ secrets.JSER_BLUESKY_PASSWORD }}
41+
cache-file: ${{ github.workspace }}/blueskyfeedbot/cache.json
42+
initial-post-limit: 1
43+
44+
jser:
45+
runs-on: ubuntu-latest
46+
permissions:
47+
actions: write
48+
steps:
49+
- name: Generate cache key
50+
uses: actions/github-script@d7906e4ad0b1822421a7e6a35d5ca353c962f410 # v6.4.1
51+
id: generate-key
52+
with:
53+
script: |
54+
core.setOutput('cache-key', new Date().valueOf())
55+
56+
- name: Retrieve cache
57+
uses: actions/cache@6f8efc29b200d32929f49075959781ed54ec270c # v3.5.0
58+
with:
59+
path: ${{ github.workspace }}/blueskyfeedbot
60+
key: feed-cache-jser-info-bluesky-${{ steps.generate-key.outputs.cache-key }}
61+
restore-keys: feed-cache-jser-info-bluesky-
62+
63+
- name: JSer.info
64+
uses: 'joschi/blueskyfeedbot@ded1962e3afb0d7283f49a037bf4d4fd9d7b86ad' # v1
65+
with:
66+
rss-feed: https://jser.info/rss/
67+
template: |
68+
今週のJSer.infoを更新しました!
69+
{{item.title}}
70+
{{item.link}}
71+
service-url: https://bsky.social
72+
username: ${{ secrets.JSER_BLUESKY_USERNAME }}
73+
password: ${{ secrets.JSER_BLUESKY_PASSWORD }}
74+
cache-file: ${{ github.workspace }}/blueskyfeedbot/cache.json
75+
initial-post-limit: 1
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
# RSS to Bluesky workflow design
2+
3+
## 概要
4+
5+
JSer.info の RSS フィードを Bluesky (`@jser.info`) に自動投稿する GitHub Actions workflow を追加する。既存の Mastodon workflow (`rss-to-mastodon.yml`) と同じ構造で、`joschi/blueskyfeedbot` を使用する。
6+
7+
## 動機
8+
9+
- 既存の Mastodon (`@jser@mstdn.jp`) と Twitter への投稿に加え、Bluesky (`@jser.info`) でも更新を配信する
10+
- Bluesky アカウントは既に存在: <https://bsky.app/profile/jser.info> (DID: `did:plc:fqprbc6qtifjv7cpx5vjhwgq`)
11+
12+
## 設計
13+
14+
### ファイル
15+
16+
`.github/workflows/rss-to-bluesky.yml` を新規追加する。
17+
18+
### Action
19+
20+
`joschi/blueskyfeedbot` を使用する。
21+
22+
- バージョン: v1 (`ded1962e3afb0d7283f49a037bf4d4fd9d7b86ad`)
23+
- 既存の workflow と同じく commit SHA で pinning する
24+
- 参照: <https://github.com/joschi/blueskyfeedbot>
25+
26+
### トリガー
27+
28+
- `schedule: '*/5 * * * *'` (5分毎)
29+
- `workflow_dispatch` (手動実行用)
30+
31+
5分毎にする理由: Bluesky 投稿は public な情報のみで、Mastodon (15分毎) より低レイテンシで配信したい。`joschi/blueskyfeedbot` の README デフォルトも 5 分。
32+
33+
### 投稿対象
34+
35+
| Job | RSS フィード | テンプレート |
36+
|---|---|---|
37+
| `realtime` | `https://realtime.jser.info/feed.xml` | `{{item.title}}\n{{item.link}}\n\n{{item.description}}` |
38+
| `jser` | `https://jser.info/rss/` | `今週のJSer.infoを更新しました!\n{{item.title}}\n{{item.link}}` |
39+
40+
テンプレートは Mastodon と揃える。ただし `joschi/blueskyfeedbot` は Handlebars + `{{item.*}}` プレフィックスで、`jser/mastofeedbot``{{title}}` 形式なので、フィールド参照は読み替える。
41+
42+
### 共通設定
43+
44+
```yaml
45+
service-url: https://bsky.social
46+
username: ${{ secrets.JSER_BLUESKY_USERNAME }}
47+
password: ${{ secrets.JSER_BLUESKY_PASSWORD }}
48+
cache-file: ${{ github.workspace }}/blueskyfeedbot/cache.json
49+
initial-post-limit: 1
50+
```
51+
52+
`initial-post-limit: 1` を設定する理由: 初回実行時にキャッシュが無いと過去の RSS 全件が一気に投稿される可能性があるため、最初の 1 件だけに絞る。
53+
54+
### キャッシュ
55+
56+
各ジョブで個別の cache key を使用する (Mastodon workflow と同じパターン)。
57+
58+
- `realtime` ジョブ: `feed-cache-realtime-jser-info-bluesky-${cache-key}`
59+
- `jser` ジョブ: `feed-cache-jser-info-bluesky-${cache-key}`
60+
61+
`actions/cache` と `actions/github-script` のバージョンも既存 workflow に合わせて pinning する。
62+
63+
### 並列実行制御
64+
65+
`concurrency: group: feedbot-bluesky` を設定し、ジョブが重複実行されないようにする。
66+
67+
## ユーザー側で必要な作業
68+
69+
1. <https://bsky.app/settings/app-passwords> で App Password を作成
70+
2. リポジトリの Secrets に以下を追加:
71+
- `JSER_BLUESKY_USERNAME`: `jser.info`
72+
- `JSER_BLUESKY_PASSWORD`: 上で作成した App Password
73+
74+
## 影響範囲
75+
76+
- 新規ファイル `.github/workflows/rss-to-bluesky.yml` の追加のみ
77+
- 既存の Mastodon/Twitter workflow には影響しない
78+
79+
## 検証方法
80+
81+
1. Secrets 設定後、`workflow_dispatch` で手動実行して動作確認
82+
2. 初回は `initial-post-limit: 1` により最新記事 1 件のみ投稿されることを確認
83+
3. 以降は新しい記事が出たタイミングで自動投稿されることを確認

0 commit comments

Comments
 (0)