Skip to content

🐛 日本の Dojo が海外 Dojo として描画される不具合を直す - #43

Merged
yasulab merged 1 commit into
mainfrom
fix-japan-dojo-fallback
Aug 27, 2026
Merged

yasulab merged 1 commit into
mainfrom
fix-japan-dojo-fallback

Conversation

@yasulab

@yasulab yasulab commented Aug 27, 2026

Copy link
Copy Markdown
Member

何が起きたか

CoderDojo鞍手 を地図に追加した直後、ポップアップが汎用の CoderDojo ロゴと**「連絡先を見る」(zen.coderdojo.com)** で表示されました。urlSlug が無いためリンク先は一覧トップで、その Dojo には辿り着けない状態でした。

表示されたもの 正しい表示
ロゴ /images/coderdojo.webp(汎用) /images/dojos/kurate.webp
リンク 連絡先を見る → zen の一覧トップ Webサイトを見る → connpass

なぜ起きたか

upsert_dojos_geojson.rbname2logo[name]nil のとき海外 Dojo 用のフォールバックに落ちます。name2logo_data/dojos_japan.json から作るため、dojo2dojo.csv には居るが dojos_japan.json にはまだ居ない日本の Dojo が、海外 Dojo として描画されます

これは新規 Dojo を追加した直後に必ず通る経路です。CSV を push すると deploy_to_pages.yml が発火しますが、このワークフローはデータを再取得しません。Jekyll の after_init フックは GeoJSON を再生成するだけでデータ取得はしないため、追加した Dojo を含まない古いデータでビルドされます。

さらに今回は 2 つのワークフローが競合しました。

ワークフロー 開始 終了 使ったデータ
Deploy to GitHub Pages 15:44:48 15:51:50 古い(鞍手なし)
Daily Update 15:44:56 15:46:58 最新(鞍手あり)

Daily Update が正しい内容を 15:46 にデプロイした後、7 分かかった Deploy to GitHub Pages が 15:51 に古い内容で上書きしました。リポジトリにコミット済みの dojos.geojson は正しいのに配信は誤った版、という状態でした。

対処

1. 生成側のガード(_tasks/upsert_dojos_geojson.rb

JP の Dojo が dojos_japan.json に未反映なら、フォールバックで描画せずスキップし、Actions のログに警告を残します。誤った情報と辿り着けないリンクを出すより、次のデータ更新まで地図に出さない方が安全という判断です。

SKIP: 鞍手 は dojo2dojo.csv にありますが _data/dojos_japan.json にありません (coderdojo.jp へのデプロイ待ち?)

黙ってスキップすると次に「地図に出ない、なぜ?」で調査をやり直すことになるため、警告を出しています。

2. ワークフロー(.github/workflows/deploy_to_pages.yml

push 契機のデプロイでも最新データを取得します。ただし失敗してもデプロイは止めませんcontinue-on-error)。Geolonia 障害時に marker 設定を変えて緊急デプロイする復旧手順が、外部 API の状態に左右されてはならないためです。取得に失敗した場合はコミット済みのデータへ戻し、従来どおりの挙動に落とします。データのコミットはしません(scheduler_daily.yml の責務のまま)。

concurrency による直列化は見送りました。同一グループの pending は 1 件しか保持されず、queued された Daily Update が取り消されてデータ更新ごとスキップされる副作用があるためです。両方が同じ入力でビルドするようになれば、上書き順序はほぼ無害化します。

テスト

tests/markers_integrity_test.rb に 4 件追加しました。

出荷される GeoJSON に対して(独立した 2 つの目印で見る。片方の文言・パスが変わってももう片方が検出する)

  • dojo2dojo.csv 記載の Dojo が汎用ロゴで描画されていないこと
  • 同じく「連絡先を見る」で描画されていないこと

生成ロジックに対して(フィクスチャで再現。出荷データの検査だけでは、データが正しい間は欠陥を検出できないため)

  • CSV に居るが Japan DB に居ない日本の Dojo が、フォールバックで描画されないこと
  • 海外 Dojo は引き続きフォールバックで描画されること(ガードが効きすぎて海外 1117 件を消す退行の検出)
  • Japan DB に居る日本の Dojo は自前ロゴと公式サイトで描画されること

検出することの確認

実際に配信されていた壊れた descriptiondojos.geojson に差し戻して実行し、2 件とも鞍手を名指しで検出することを確認しました。

JapanDojoFallbackTest#test_no_japan_dojo_uses_overseas_fallback
  日本の Dojo が 1 件、海外 Dojo 用のフォールバックで描画されています。…

JapanDojoFallbackTest#test_no_japan_dojo_shows_the_overseas_contact_link
  日本の Dojo が 1 件、海外 Dojo 用の「連絡先を見る」リンクで描画されています。…

ガードを外した場合も生成テストが落ちることを確認しています。

影響範囲

  • 現在のデータでは生成される GeoJSON に差分はありませんSKIP 0 件)
  • 海外 Dojo 1117 件は countryCode != "JP" なのでガードに触れません
  • 本番の表示は再デプロイで既に正常化済みです

マージ後に確認すること

  • Deploy to GitHub Pages が成功する(新しいデータ取得ステップを含む)
  • 鞍手が引き続き自前ロゴ・connpass リンクで表示される
    curl -s https://map.coderdojo.jp/dojos.geojson | grep -c kurate.webp
  • マーカー総数が減っていない(現在 1313 件)

CoderDojo鞍手 を追加した直後、地図のポップアップが汎用の CoderDojo ロゴと
「連絡先を見る」(zen.coderdojo.com) のリンクで表示された。urlSlug が無いため
リンク先は一覧トップで、その Dojo には辿り着けない状態だった。

## 原因

upsert_dojos_geojson.rb は name2logo[name] が nil のとき海外 Dojo 用の
フォールバックに落ちる。name2logo は _data/dojos_japan.json から作るため、
dojo2dojo.csv には居るが dojos_japan.json にはまだ居ない日本の Dojo が
海外 Dojo として描画されていた。

この状態は新規 Dojo を追加した直後に必ず起きる。CSV を push すると
deploy_to_pages.yml が発火するが、このワークフローはデータを再取得しないため、
追加した Dojo を含まない古いデータでビルドされる。

さらに今回は 2 つのワークフローが競合した。Daily Update が最新データで正しい
内容を 15:46 にデプロイした後、7 分かかった Deploy to GitHub Pages が 15:51 に
古い内容で上書きしていた。

## 対処

1. 生成側のガード: JP の Dojo が dojos_japan.json に未反映なら描画せずスキップし、
   Actions のログに警告を出す。誤った情報と辿り着けないリンクを出すより、次の
   データ更新まで地図に出さない方が安全なため。
2. deploy_to_pages.yml でも最新データを取得する。ただし失敗してもデプロイは
   止めない。Geolonia 障害時の緊急デプロイが外部 API の状態に左右されないよう、
   取得に失敗したらコミット済みのデータへ戻して従来どおりの挙動に落とす。

## テスト

フィクスチャで「CSV には居るが Japan DB には居ない」状態を作り、生成スクリプトを
実行して検証する。出荷済みの GeoJSON に対しても、CSV 記載の Dojo が汎用ロゴや
「連絡先を見る」で描画されていないことを検査する。

ガードを外すと落ちることを確認済み。現在のデータでは生成結果に差分はない。
@yasulab
yasulab merged commit 5c0c937 into main Aug 27, 2026
2 checks passed
@yasulab
yasulab deleted the fix-japan-dojo-fallback branch August 27, 2026 16:16
yasulab added a commit that referenced this pull request Aug 29, 2026
クラブ名を手で対応付ける dojo2dojo.csv (301 行) をやめ、coderdojo.jp の
global_club_id で直接突き合わせる。CSV は削除した。

名前での突合には次の問題があった。

- 新しい Dojo を追加するたび CSV に 1 行足す運用が必要で、実際に漏れていた
- Clubs 側で改名されると追従できない
- 同名クラブが二重登録されていると、先に現れた方を拾ってしまう

active な全エントリが global_club_id を持つことは coderdojo.jp 側の spec が
保証しているため、名前で救済する経路は置いていない。

## 同じ入力データで新旧の出力を比較した結果

- 日本のマーカー 195 -> 202 件。地図から消えた Dojo は 0 件
- 増えた 7 件は CSV に行が無く漏れていたもの
  播磨科学公園都市 / 八戸@吹上 / 川西 / 明石 / 吉祥寺 / 氷見@bigberries / 豊橋
- 流山・古河は約 0.1km 移動。Clubs 側の同名二重登録のうち、coderdojo.jp が
  指定した UUID のクラブを選ぶようになったため

## あわせて整理したもの

- tmp/unmatched_dojos.json と Slack 通知を追加。CSV が無くなった今、Clubs 側の
  削除・ID 変更を検知できるのはこれだけになる
- deploy_to_pages.yml のデータ取得に Japan 側の件数・UUID 数チェックを追加。
  取得は成功したが中身が劣化した場合に、コミット済みデータへ復元させる
- 突合の情報源が Japan DB 自体になり到達不能となったガードを削除 (#43)
- 名前突合を前提にしたテスト・ドキュメントを更新
yasulab added a commit that referenced this pull request Aug 29, 2026
クラブ名を手で対応付ける dojo2dojo.csv (301 行) をやめ、coderdojo.jp の
global_club_id で直接突き合わせる。CSV は削除した。

名前での突合には次の問題があった。

- 新しい Dojo を追加するたび CSV に 1 行足す運用が必要で、実際に漏れていた
- Clubs 側で改名されると追従できない(那覇の登録名が変わっていた)
- 同名クラブが二重登録されていると、先に現れた方を拾ってしまう(流山・古河)

active な全エントリが global_club_id を持つことは coderdojo.jp 側の spec が
保証しているため、名前で救済する経路は置いていない。

## 同じ入力データで新旧の出力を比較した結果

- 日本のマーカー 195 -> 202 件。地図から消えた Dojo は 0 件
- 増えた 7 件は CSV に行が無く漏れていたもの
- 流山・古河は約 0.1km 移動。Clubs 側の同名二重登録のうち、coderdojo.jp が
  指定した UUID のクラブを選ぶようになったため

## あわせて整理したもの

- tmp/unmatched_dojos.json と Slack 通知を追加。CSV が無くなった今、Clubs 側の
  削除・ID 変更を検知できるのはこれだけになる
- deploy_to_pages.yml のデータ取得に Japan 側の件数・UUID 数チェックを追加
- 突合の情報源が Japan DB 自体になり到達不能となったガードを削除 (#43)
- /dojo2dojo.json を /dojos.json に改名(dojo2dojo は CSV に由来する名前)
- _plugins/build_hooks.rb が生成タスクの終了コードを見ていなかったため、
  失敗しても古い地図が出荷されていた。exception: true で止める
- PR でもビルドとテストを走らせる (deploy_to_pages.yml -> ci.yml)。
  これまで rake test は main への push 後にしか走っていなかった
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant