release: env/dev → env/prod(Go移植・userOGPGo/OGP刷新・prod-deploy修正を本番反映)#130
Merged
Conversation
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>
…dev 反映失敗の原因調査用)" This reverts commit 5a5a556.
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>
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>
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関数デプロイの並列化
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>
Co-authored-by: kojira <kojira@users.noreply.github.com>
Co-authored-by: kojira <kojira@users.noreply.github.com>
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>
Co-authored-by: kojira <kojira@users.noreply.github.com>
Co-authored-by: kojira <kojira@users.noreply.github.com>
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>
Co-authored-by: kojira <kojira@users.noreply.github.com>
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.
これは本番リリースPR(
env/dev→env/prod)env/devは dev 環境にデプロイ済み・実地検証済みの状態。これを本番(d-shrine)へ昇格する。対象 75コミット。含まれる主な変更
statusGo/sanpaiGo/registerGo/rankingGo/ogpRewriteGoと、スケジュール4本(rankingUpdateGo/rankingCacheGo/statusCacheBackfillGo/scheduledOgpDeleteGo)。userOGPGo: OGP画像生成の Go 移植。高解像度レンダリング→カード領域クロップ→1200x630へ1回だけ縮小、WebP出力。ogpRewriteGoはuserOGPGo(WebP) を指し、og:image:type/width/heightメタを付与。status_version自己修復キャッシュ(Go/Node両方)。本番デプロイ経路の是正(今回まとめて修正)
prod-deploy.ymlに Go関数デプロイ工程が無かった → dev同等の工程を本番設定で追加。firebase.jsonの/u/*→ogpRewriteGorewrite 対策)。バックエンド失敗時はフロントを公開しないため本番は保護される。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関数→フロントの順)が走る。マージ操作=本番公開。