Open15

GitHubとNotionの連携を無理やりマルチリポジトリ対応にしていく

さざんかぬふさざんかぬふ

今年も年末、妻の実家でいつものように高校サッカーを見ながらゆっくり作業をしている。
多分明日以降は、天皇杯や箱根駅伝を見ながら同じようにやっていくのだと思う。
日大藤沢と近江でPKかーとか思いながらやっていく。
本当はもうちょっとAndroidのコード書かないといけないのだけど、GitHubのリポジトリオーナーを変えたりする作業に着手してしまったため、このNotion連携をやる。

さざんかぬふさざんかぬふ

テストを書いてたのは2020→21だったか、2021→22だったか。前者かな。
去年はリアルタイムで高負荷対応があったりした。今年は安定しているのでのんびりしている。

さざんかぬふさざんかぬふ

運用に必要な追加項目は次の4つ

Last edited time

そのレコードを最後に編集した時間。Notionが勝手に入れてくれる。これを使ってクエリする想定なので必要になる。Updated At等はすべてGitHub側の時刻なので、Notion側を直接更新したときに拾えなくなる。

Release status

独自のフローで、現在そのPRの内容がどの環境までリリースされているかを示すステータス。

Released at

本番環境にいつリリースしたか。あくまでも参考情報で、正確な日時をいれるつもりはなく、日付しか入れていない。

開発要望

開発要望メモという別で運用しているデータベースとリンクさせるカラム。PRにこの開発要望メモのURLを記載しておけば勝手にリンクしてくれる。

さざんかぬふさざんかぬふ

これめちゃくちゃめんどくさいことが分かってきたな
例えば、GitHub Related Creatorは、スキーマ取得すると存在してなくて、データを取得するとUUIDで
a5f328731b674d90bb6c9357eef2xxxx
とかで入っているんだけど、これに直接アクセスすると(notion.so/a5f3....)ちゃんとユーザーの情報を格納した謎DBを取得できる。
これStateとかもそうなってるな...なんぞこれ
GitHub側のStateが格納されているカラムの定義、いちいちUUIDを辿らないといけないのか!?

まあ、データ取得すればいけるというのはあるんだが...

さざんかぬふさざんかぬふ

まあ、元のDBを見てわかる情報はUnionDBからは除くか...
Assigneeとか、GitHub Relatedじゃない方は一応取ってあるのと、Stateをどうするか問題はあるけど、StateはRelease Statusにいれてるからいいか...(そういえばこれRelease stateが正しいのでは?と言われるとはいそうですとしかならないやつだな)

さざんかぬふさざんかぬふ

とりあえずNotionからデータを取得するコードをCopilotを使って書いているが、こういうのがすっと出てくるのがやばいところがある

さざんかぬふさざんかぬふ

結局治す必要はあったな

def query_to_database(database_id, filter_condition=None, sorts=None, start_cursor=None, page_size=100):
    url = f"https://api.notion.com/v1/databases/{database_id}/query"
    data = {
        "page_size": page_size,
    }
    if filter_condition:
        data['filter'] = filter_condition
    if sorts:
        data['sorts'] = sorts
    if start_cursor:
        data['start_cursor'] = start_cursor
    return notion_post(url, data)


def query_to_database_all(database_id, filter_condition=None, sorts=None, page_size=100):
    start_cursor = None
    result = []
    while True:
        response = query_to_database(database_id, filter_condition, sorts, start_cursor, page_size)
        result += (response['results'] or [])
        if response.get('next_cursor'):
            start_cursor = response['next_cursor']
        else:
            break
        # api rate limitが3req/secなので、0.3秒待つ
        sleep(0.3)
    return result
さざんかぬふさざんかぬふ

すくなくともbulk updateはなさそうだから、3rpsでinsert/updateをやっていくしかないのか...
仮にPRが12,000あったら初回は4000秒かかるな
毎分1クエリとかした方が良い説がでてしまうな
やっぱりLambdaとかでやるべきなのか

さざんかぬふさざんかぬふ

前回実行してからもう一回実行するときどうするとか色々あるなあと思ったが、まあいいか
せっかくだからDynamo使ってみるかと思ったけど、Chaliceで作るかなあ

さざんかぬふさざんかぬふ

Notionを触っての感想を唐突にまとめておく

ファイルサーバーにmdを置くのとNotionと何が本質的な違いかを少し考えている
スクショ等の画像のペーストが楽(ファイルにしなくてもいい)、WYSIWYG、データソースと同期を作れる、GitHub等の外部データソースと連携できる、簡易フォームでデータを入力できる、みたいな部分かな?

mdは文字数可変の表などインデントが揃わない表に弱い(課題管理表などがその筆頭)し、単一データソースに対して表示形式を縦横変えたりとかができない。
単票でも一覧でもみたい、みたいな事に大してmdは無力。
NotionはGitHub等の外部データソースとも連携できる。

ドキュメントツールとしてだけ考えると、単に重いだけのWebサービスではという考え方はあるけど、NotionはUUID管理なので、mdファイルで言うところのファイル配置変更みたいな事にかなり強いというのはある。
もちろんmdでもツールを使えばリンクが切れないようにはできるけど。

NotionのAPIを触って少しわかったけど、やっぱりUUIDで徹底的に管理されているというのは中々面白くて、機能や概念としてはよく出来ているとは感じる。ちょいちょい重いし、たまにブラウザの応答が止まるのは残念ではあるが、ベターExcel(管理表)としては割と欠かせないツールになっている。

単票で登録した課題を俯瞰的に見たいという需要は、ある程度漏らさない実装・対応が必要になる時によく発生して、それをRedmineでやるかGitHub IssueでやるかJIRAでやるかみたいな時に、Excelでやるの代わりにNotionでやるという選択を取れるのが強みかな。Excelには画像貼りにくいがNotionはいける。