要件 ​
- 逐次、タイムライン的な形で更新できる
- Markdown で入力できる
- クローズできる
- タグをつけられる
- ブログ記事と共有する
- https://www.codingfeline.com/tags/ にまとめて表示できる
- ブログ記事と共有する
- ブログ本体のデプロイ毎に GitHub API を使いすぎないようにする
- Issue の更新トリガーで JSON を生成するような感じがよさそ
- 並び順は作成の降順?
- 各コメントにアンカーつけたい
# yshrsmz/scraps
name: dispatch scrap update
on:
issues:
issue_comment:
jobs:
create-scrap:
# yshrsmz.github.io の workflow を参照
uses: yshrsmz/yshrsmz.github.io/.github/workflows/_create-scrap.yml@scraps
with:
issue_number: ${{ github.event.issue.number }}
secrets:
target_github_token: ${{ secrets.GITHUB_TOKEN }}
# _create-scrap.yml
jobs:
create-scrap:
runs-on: ubuntu-latest
steps:
- name: create scrap
# action も workflow も同じレポジトリ内ではあるが、ここもフルパスで指定する必要有り
uses: yshrsmz/yshrsmz.github.io/packages/action-create-scrap@scraps
with:
issue_number: ${{ github.event.inputs.issue_number }}
github_token: ${{ secrets.target_github_token }}
repository_dispatch するか、 yshrsmz.github.io を clone & push するか
repository_dispatch だと各レポジトリで PAT が必要になるから、 clone & push のほうが楽ぽい
ページネーション、これでいけるらしい
const comments = await octokit.paginate(
octokit.rest.issues.listComments,
{
...repo,
issue_number: issueNumber,
per_page: 10,
},
(response) => response.data,
)
commit は git config が必要
credential は @actions/core
に token
を与えると persist してくれる
vitepress で JSON からページを描画するには
が必要
paths loader
は本文を content
として渡すことができるが、html か Markdown を想定しているようなので、今回の用途には合わないdata loader
を別で作る必要あり
data loader
で MarkdownIt をかませる必要ありimport { createMarkdownRenderer, type SiteConfig } from 'vitepress'
export default {
watch: ['data/scraps/*.json'],
async load(watchedFiles: string[]) {
// config は VITEPRESS_CONFIG
const config: SiteConfig = (global as any).VITEPRESS_CONFIG
const md = await createMarkdownRenderer(
// ...
)
return watchedFiles
.map((file) => readFileSync(file, 'utf-8'))
.map<Scrap>((json) => JSON.parse(json))
.map((scrap) => {
return {
...scrap,
body: md.render(scrap.body),
comments: ... // comments の body も md.render() する
}
})
}
}
echo '${{ needs.create-scrap.outputs.output }}' > ./packages/blog/data/scraps/${{ github.event.issue.number }}.json
だと、JSON に含まれる single quote が消えてしまう 🤔
一度環境変数に入れてあげればいけそう
- run: |
echo $SCRAP_JSON > ./packages/blog/data/scraps/${{ github.event.issue.number }}.json
env:
SCRAP_JSON: ${{ needs.create-scrap.outputs.output }}
変数パターンだと連続したスペースがまとめられちゃってそう。インデントが崩れる。
double quote で囲ってあげるといける
- run: |
- echo $SCRAP_JSON > ./packages/blog/data/scraps/${{ github.event.issue.number }}.json
+ echo "$SCRAP_JSON" > ./packages/blog/data/scraps/${{ github.event.issue.number }}.json
env:
SCRAP_JSON: ${{ needs.create-scrap.outputs.output }}
アンカーは issue/comment の node_id
を使うと良さそう。
node_id
は GraphQL API の id
に相当するので、将来的に(あるかどうか知らんけど) GraphQL API に乗り換えるとしたらはかどりそ
残作業
除外設定のラベルをつけるのがよさそ そっちなら余計なラベルをフィルターする処理も不要
このスクラップはに完了しました