Skip to content

release: env/dev → env/prod(Go移植・userOGPGo/OGP刷新・prod-deploy修正を本番反映)#130

Merged
cursor[bot] merged 75 commits into
env/prodfrom
env/dev
Jul 1, 2026
Merged

release: env/dev → env/prod(Go移植・userOGPGo/OGP刷新・prod-deploy修正を本番反映)#130
cursor[bot] merged 75 commits into
env/prodfrom
env/dev

Conversation

@kojira

@kojira kojira commented Jul 1, 2026

Copy link
Copy Markdown
Member

これは本番リリースPR(env/devenv/prod

env/dev は dev 環境にデプロイ済み・実地検証済みの状態。これを本番(d-shrine)へ昇格する。対象 75コミット

含まれる主な変更

  • Cloud Functions の Go 移植(レイテンシ/課金対策): statusGo / sanpaiGo / registerGo / rankingGo / ogpRewriteGo と、スケジュール4本(rankingUpdateGo / rankingCacheGo / statusCacheBackfillGo / scheduledOgpDeleteGo)。
  • userOGPGo: OGP画像生成の Go 移植。高解像度レンダリング→カード領域クロップ→1200x630へ1回だけ縮小、WebP出力ogpRewriteGouserOGPGo(WebP) を指し、og:image:type/width/height メタを付与。
  • status_version 自己修復キャッシュ(Go/Node両方)。
  • フロントエンド: sanpai結果表示強化、解析アニメーション、Service Worker自動更新 ほか。

本番デプロイ経路の是正(今回まとめて修正)

  1. prod-deploy.ymlGo関数デプロイ工程が無かった → dev同等の工程を本番設定で追加。
  2. 本番初回切替の安全化 → Go関数を先にデプロイ → 最後にフロント(firebase deploy) の順に変更(firebase.json/u/*ogpRewriteGo rewrite 対策)。バックエンド失敗時はフロントを公開しないため本番は保護される。
  3. gen2並列デプロイの dockerRepository クラッシュを根本修正(gcf-artifacts 事前作成+--docker-repository 明示)。

本番固有設定: project=d-shrine / bucket=d-shrine.appspot.com / SANPAI_NEXT_TIME_SECONDS=300 / OGP_PROJECT_ID=d-shrine

検証(dev で実地確認済み)

  • env/dev の dev-deploy(e0918bd)が 成功。Go関数 10本すべて deploy OK、各関数が gcf-artifacts を使用、dockerRepository クラッシュ再発なし。
  • actionlint パス。OGP QC アーティファクト(ogp-sample)生成。

マージ = 本番リリース

このPRのマージで env/prod へ push され、本番デプロイ(Go関数→フロントの順)が走る。マージ操作=本番公開

Open in Web Open in Cursor 

ShinoharaTa and others added 30 commits February 1, 2024 23:19
Co-authored-by: kojira <kojira@users.noreply.github.com>
Co-authored-by: kojira <kojira@users.noreply.github.com>
Co-authored-by: kojira <kojira@users.noreply.github.com>
…の原因調査用)

Co-authored-by: kojira <kojira@users.noreply.github.com>
Co-authored-by: kojira <kojira@users.noreply.github.com>
Co-authored-by: kojira <kojira@users.noreply.github.com>
Co-authored-by: kojira <kojira@users.noreply.github.com>
マイページ解析キャッシュの事前生成バックフィル(statusCacheBackfill)を dev へ反映

Co-authored-by: kojira <kojira@users.noreply.github.com>
バックフィル対象を直近半年以内の活動ユーザーに限定する更新を dev へ反映

Co-authored-by: kojira <kojira@users.noreply.github.com>
参拝結果の表示拡充を dev へ反映

Co-authored-by: kojira <kojira@users.noreply.github.com>
解析中ローディング演出のリッチ化を dev へ反映

Co-authored-by: kojira <kojira@users.noreply.github.com>
Co-authored-by: kojira <kojira@users.noreply.github.com>
Co-authored-by: kojira <kojira@users.noreply.github.com>
Co-authored-by: kojira <kojira@users.noreply.github.com>
Co-authored-by: kojira <kojira@users.noreply.github.com>
コールドスタート短縮によるレイテンシー削減のため、Node.js版の status エンドポイント
と等価なロジックを Go で実装し、Cloud Run functions として statusGo という別関数名で
デプロイする(既存の status(Node)は変更せず共存させ、フロントエンドの切替は別途行う)。

- app/functions-go/internal/performance: performance.js の対象範囲(get_level/
  user_performance/user_formatted_performance)をGoへポート。performance.test.js
  と同一の入出力をGoテストとして移植し検証済み
- app/functions-go/status.go: status エンドポイントのHTTPハンドラ実装
  (Firestore読み書き、CORS、キャッシュ有無での分岐をNode版と同一ロジックで実装)
- Firestoreエミュレータに同一データを投入し、Node版・Go版の応答をフィールド単位で
  比較して等価性を確認(キャッシュ有り/初回計算/未登録ユーザーの3パターン)
- .github/workflows/dev-deploy.yml: gcloud functions deploy(Go, gen2, go125
  ランタイム)のデプロイステップを追加(dev環境のみ、既存のNode関数デプロイは
  変更しない)
- docs/backend.md: 設計・移植方針・既知の挙動差異を記載

検証中に発見した既存のNode側バグ(statusキャッシュはあるがlast_sanpaiトップレベル
フィールドが無いユーザーで例外になる)は本タスクの対象外のため未修正。

Co-authored-by: kojira <kojira@users.noreply.github.com>
Co-authored-by: kojira <kojira@users.noreply.github.com>
Cloud Run functions(2nd gen)の実行環境ではGOOGLE_CLOUD_PROJECT等の環境変数が
常に設定される保証がなく、空文字のprojectIDでFirestoreクライアントを初期化して
いたため全リクエストが500エラーになっていた(dev環境への実デプロイで確認)。
firestore.DetectProjectIDを使いADC経由でプロジェクトIDを自動検出するよう修正。

Co-authored-by: kojira <kojira@users.noreply.github.com>
…ctID)

Co-authored-by: kojira <kojira@users.noreply.github.com>
Co-authored-by: kojira <kojira@users.noreply.github.com>
dev環境での実測(コールドスタート込み)で Node版status: 約2.05秒 → Go版statusGo:
約0.48秒 (約1.57秒短縮)。実データ(複数の実在ユーザー)で全フィールドが一致する
ことを確認済み。既存のstatus(Node)は当面残し、フロントエンドの呼び出し先のみ
切り替える(即座にロールバックできるようにするため)。

Co-authored-by: kojira <kojira@users.noreply.github.com>
…Goへ切替)

Co-authored-by: kojira <kojira@users.noreply.github.com>
Co-authored-by: kojira <kojira@users.noreply.github.com>
- RawUserDataFromStatus / ComputePerformanceIncrement / LatestActivityCreatedAt を
  Node版(performance.js)と同一ロジックでポート
- 全件計算と増分計算の一致をランダム生成データで検証するプロパティテストを追加
  (2バッチ2000ケース、3バッチ1000ケース)

Co-authored-by: kojira <kojira@users.noreply.github.com>
- Firebase Admin Go SDK(auth)でIDトークンを検証
- GitHub Events APIを取得し、Node版と同一のロジックで参拝処理を実装
  (クールダウン判定・ボーナスブランチ加点・増分/フル計算の切替・
  Firestoreへのアクティビティ/ログ/ステータス書き込み)
- 別関数名 sanpaiGo としてデプロイし、既存の sanpai(Node) と共存させる
- Firestoreエミュレータ + モックGitHub APIサーバーによる統合テストを追加
  (FIRESTORE_EMULATOR_HOST未設定時は自動スキップしCIに影響しない)

Co-authored-by: kojira <kojira@users.noreply.github.com>
移植中に判明した既存バグをまとめて修正:
- IssuesEvent を payload.action で加点(常時未加点バグの修正)
- status の last_sanpai 未設定時クラッシュ修正
- スケジュールGo関数のPub/Subトピック事前作成(CIデプロイ失敗修正)
- status_version による解析キャッシュのバージョン管理と自己修復

Co-authored-by: kojira <kojira@users.noreply.github.com>
cursoragent and others added 13 commits July 1, 2026 15:36
PR #129 の4修正を dev へ反映:
- IssuesEvent を payload.action で加点(常時未加点バグ修正)
- status の last_sanpai 未設定時クラッシュ修正
- スケジュールGo関数のPub/Subトピック事前作成(dev-deployデプロイ失敗の修正)
- status_version による解析キャッシュのバージョン管理と自己修復

Co-authored-by: kojira <kojira@users.noreply.github.com>
Gen2(Cloud Run)関数のデプロイはCloud Buildのコンテナビルドを伴い1本あたり
数分かかる。従来は9関数を1本ずつ直列deployしており全体で15〜30分規模だった。

関数間に依存が無いため、前提処理(サービス有効化・Pub/Subトピック作成・
GitHub OAuth資格情報/base_url取得・App Engineロケーション解決)を先行ステップに
集約したうえで、全Go関数のdeployをバックグラウンド(&)で同時起動し一括waitする
方式に変更(体感で最も遅い1本分の時間に短縮)。ログは関数ごとにファイルへ退避して
順に出力し、1本でも失敗したらステップを失敗させる。Cloud Schedulerジョブ作成は
関数デプロイ後に冪等なupsertでまとめて実行。

- 挙動(デプロイ対象関数・引数・トリガ・env-vars・スケジュール)は従来と同一
- actionlint(shellcheck含む)通過、並列/ログ退避/失敗伝播をローカルでモック検証済

Co-authored-by: kojira <kojira@users.noreply.github.com>
- Node版userOGP(canvas+chartjs-node-canvas)相当の合成をGoネイティブで再現
- base.png(2500x1313)をOGP標準の1200x630へ縮小・最適化して go:embed 同梱
  (実行時のGCSダウンロード往復を廃止。出力面積も約1/4に)
- Noto Sans JP を同梱し日本語テキストを描画
- レーダーチャートをGoで実装(Chart.js設定に対応、単体テスト可能に分離)
- 出力は WebP(可逆VP8L, 純Go nativewebp)。PNGより小さい
- QC用: サンプルOGPをPNG/WebPで書き出すテスト(OGP_QC_OUT)を追加

Co-authored-by: kojira <kojira@users.noreply.github.com>
- screen_nameでFirestore検索→status(version判定つき)を解決→OGP合成→GCSへアップロード→リダイレクト
- キャッシュオブジェクトは ogps/{user}.webp (Content-Type: image/webp)
- 表示名/アイコンはFirestore(display_name/image_path)から取得しGitHub API往復を排除
- 既存パッケージ内ヘルパ(findUserByScreenName/loadActivities/statusCacheIsCurrent/getStorageClient等)を再利用

Co-authored-by: kojira <kojira@users.noreply.github.com>
- og:image/twitter:image の生成先を userOGP(Node) から userOGPGo(gen2) に変更
- WebP/固定サイズをクローラに伝えるため og:image:type=image/webp と :width=1200 / :height=630 を注入
- テストを新URL・注入メタに合わせて更新

Co-authored-by: kojira <kojira@users.noreply.github.com>
- userOGPGo(HTTP, 512Mi/60s, STORAGE_BUCKET_NAME)を並列デプロイ群に追加
- ビルド後にサンプルOGP(PNG/WebP)をレンダリングしupload-artifactで確認可能に

Co-authored-by: kojira <kojira@users.noreply.github.com>
目視確認用の参照画像。TestWriteQCArtifacts で再生成できる。

Co-authored-by: kojira <kojira@users.noreply.github.com>
- 元画像は上下左右の暗い背景余白が広く、そのまま縮小するとカード=文字が小さく可読性が低い
- 同梱baseを元の2500x1313に戻し、レンダリングは元解像度で実施
- 合成後にカード塗り(黒/青)の実測bbox+小マージンをOG比(1200:630)でクロップし、
  最後に一度だけ1200x630へ高品質縮小(CatmullRom)。再拡大による画質劣化を回避
- 出力寸法は1200x630のまま(og:image:width/heightと一致)
- QCサンプルをクロップ版に更新

Co-authored-by: kojira <kojira@users.noreply.github.com>
- backend.md: 「見送った機能」節をuserOGPGo移植節に置換、ogpRewrite節/status_version節を更新
- functions-go/README.md: userogp.go/ogpimageをディレクトリ構成とデプロイ節に追記
- internal/ogpimage/README.md: パッケージ設計(描画パイプライン/座標保守/QC/依存)を新規作成

Co-authored-by: kojira <kojira@users.noreply.github.com>
- 左方向へ伸びる軸(すばやさ/しゅびりょく)のラベルを右寄せにし、中心(レーダー)への被りを解消
  (右側/上下は従来どおり中央寄せ。右寄せにするとカード外へはみ出すため変更しない)
- グリッド同心リングを15→8本に削減し蜘蛛の巣状の見づらさを改善
- QCサンプルを更新

Co-authored-by: kojira <kojira@users.noreply.github.com>
- すばやさが左に寄りすぎて青パネルに重なっていたため、右寄せ量を控えめにして
  青パネルとレーダーの中間に収める
- QCサンプル更新

Co-authored-by: kojira <kojira@users.noreply.github.com>
- 青パネル(ステータス行)の右端は実測 design x≈1292、幅668と狭く、せんとうりょく等が
  大きい値だと右端をはみ出す
- statsX を 680→640 に左寄せし、上限幅ガード(statsMaxWidth=650)を追加。
  せんとうりょく:99999(645px)は縮小なしで収まり、6桁など上限超過値のみ横縮小する
- QCサンプルを大きい値(ポイント12345/せんとうりょく99999)に更新し収まりを検証

Co-authored-by: kojira <kojira@users.noreply.github.com>
feat: userOGPをGoへ移植(WebP出力)+Go関数デプロイの並列化
kojira and others added 2 commits July 2, 2026 02:26
promote: main → env/dev(userOGPのGo移植/WebP/余白クロップ + Go関数デプロイ並列化)
prod-deploy.ymlはfirebase deploy(フロント+Node関数)のみで、Go関数(userOGPGo等)を
一切デプロイしていなかった。これではenv/prodへ反映してもGo移植が本番に出ない。
dev-deploy.ymlと同等の工程を本番設定で移植する:
- go build/vet + Firestoreエミュレータ統合テスト(デプロイ前ゲート)
- OGPサンプルQCアーティファクト生成
- GCPサービス有効化・Pub/Subトピック作成・OAuth/base_url取得・App Engineロケーション解決
- 全Go関数(HTTP6+スケジュール4)の並列デプロイ + Cloud Schedulerジョブ作成/更新
本番固有値: project=d-shrine, bucket=d-shrine.appspot.com,
SANPAI_NEXT_TIME_SECONDS=300, OGP_PROJECT_ID=d-shrine
(Node版 buggetName=projectID+.appspot.com / next_time=300 と一致)

Co-authored-by: kojira <kojira@users.noreply.github.com>
cursoragent and others added 5 commits July 1, 2026 18:19
firebase.jsonのhosting rewrite (/u/* -> ogpRewriteGo) やフロントからのGo関数呼び出しが
あるため、firebase deploy(フロント)を先に実行するとGo関数未デプロイの窓でプロフィール/OGP等が
一時的に落ちる。本番初回切替を安全にするため順序を
  Go関数の並列デプロイ+Scheduler -> nuxt generate -> firebase deploy(フロント+Node)
に変更する(バックエンドを先に出す)。devは非公開のため従来順のまま。

Co-authored-by: kojira <kojira@users.noreply.github.com>
@cursor cursor Bot changed the title release: env/dev → env/prod (Cloud FunctionsのGo移植ほかをまとめて本番反映) release: env/dev → env/prod(Go移植・userOGPGo/OGP刷新・prod-deploy修正を本番反映) Jul 1, 2026
cursoragent and others added 3 commits July 1, 2026 18:38
Go関数(gen2)の並列デプロイで一部が
  gcloud crashed (AttributeError): 'NoneType' object has no attribute 'dockerRepository'
で非決定的に失敗していた(並列時のみ・ランダムな一部・前回は偶然全成功)。
原因はgcloudがイメージ格納先のArtifact Registryリポジトリ(gcf-artifacts)を
遅延自動解決する際、並列実行で解決が競合しNoneになること。
対策(根本): gcf-artifactsリポジトリを事前作成し、各deployに
--docker-repositoryを明示指定して自動解決の競合そのものを除去する。
dev/prod両方に適用。

Co-authored-by: kojira <kojira@users.noreply.github.com>
Co-authored-by: kojira <kojira@users.noreply.github.com>
@cursor cursor Bot merged commit 961e17e into env/prod Jul 1, 2026
4 checks passed
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.

3 participants