🐛 日本の Dojo が海外 Dojo として描画される不具合を直す - #43
Merged
Merged
Conversation
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
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 後にしか走っていなかった
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
何が起きたか
CoderDojo鞍手 を地図に追加した直後、ポップアップが汎用の CoderDojo ロゴと**「連絡先を見る」(
zen.coderdojo.com)** で表示されました。urlSlugが無いためリンク先は一覧トップで、その Dojo には辿り着けない状態でした。/images/coderdojo.webp(汎用)/images/dojos/kurate.webp連絡先を見る→ zen の一覧トップWebサイトを見る→ connpassなぜ起きたか
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が発火しますが、このワークフローはデータを再取得しません。Jekyll のafter_initフックは GeoJSON を再生成するだけでデータ取得はしないため、追加した Dojo を含まない古いデータでビルドされます。さらに今回は 2 つのワークフローが競合しました。
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 のログに警告を残します。誤った情報と辿り着けないリンクを出すより、次のデータ更新まで地図に出さない方が安全という判断です。黙ってスキップすると次に「地図に出ない、なぜ?」で調査をやり直すことになるため、警告を出しています。
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 が汎用ロゴで描画されていないこと生成ロジックに対して(フィクスチャで再現。出荷データの検査だけでは、データが正しい間は欠陥を検出できないため)
検出することの確認
実際に配信されていた壊れた description を
dojos.geojsonに差し戻して実行し、2 件とも鞍手を名指しで検出することを確認しました。ガードを外した場合も生成テストが落ちることを確認しています。
影響範囲
SKIP0 件)countryCode != "JP"なのでガードに触れませんマージ後に確認すること
curl -s https://map.coderdojo.jp/dojos.geojson | grep -c kurate.webp