Skip to content

feat: userOGPをGoへ移植(WebP出力)+Go関数デプロイの並列化#132

Merged
kojira merged 11 commits into
mainfrom
cursor/parallelize-go-deploy-5520
Jul 1, 2026
Merged

feat: userOGPをGoへ移植(WebP出力)+Go関数デプロイの並列化#132
kojira merged 11 commits into
mainfrom
cursor/parallelize-go-deploy-5520

Conversation

@kojira

@kojira kojira commented Jul 1, 2026

Copy link
Copy Markdown
Member

概要

Node版に残っていた OGP画像生成 userOGP を Go(userOGPGo)へ移植し、あわせて Go関数デプロイの並列化と OGP出力の軽量化・可読性改善を行う。これで Go相当が存在しない Node関数は無くなり、Node関数の削除に進める状態になる。

変更点

1. userOGP の Go移植 (userOGPGo)

  • internal/ogpimage を新設し、Node版(canvas + chartjs-node-canvas)相当のカード合成をGoネイティブで再現。
    • ベース画像(2500×1313)・Noto Sans JP フォントを go:embed で同梱 → 実行時のGCSダウンロード往復を廃止。
    • レーダーチャートを Chart.js 設定に対応させてGoで実装(外部プロセス依存なし、単体テスト可能に分離)。
  • userogp.go: screen_name で Firestore 検索 → status(version判定つき)解決 → 合成 → GCSアップロード → リダイレクト。表示名/アイコンは Firestore(display_name/image_path)から取得し GitHub API 往復を排除。

2. 余白クロップで可読性改善(重要)

  • 元画像は上下左右の暗い背景余白が広く、そのまま縮小するとカード=文字が小さく読めない。
  • 元解像度(2500×1313)でレンダリング → カード領域(塗り実測bbox+小マージン)を OG比(1200:630)でクロップ → 最後に一度だけ 1200×630 へ高品質縮小(CatmullRom)
    • 再拡大による画質劣化を避けつつ、余白除去でカード/文字が相対的に大きくなる(スーパーサンプリングで縁もくっきり)。

3. 出力の軽量化

  • 出力を PNG → WebP(可逆VP8L, 純Go nativewebp)。キャッシュは ogps/{user}.webp
  • ogpRewriteGoog:image/twitter:imageuserOGPGo に張替え、og:image:type=image/webp:width=1200/:height=630 を注入。

注意: X(Twitter) は WebP の og:image でカード生成に失敗する場合があります。X重視ならPNGへ戻す余地あり(エンコーダ差し替えは1箇所)。

4. デプロイ並列化 & QC

  • Go Cloud Run functions のデプロイを直列→並列(一括wait)化 + userOGPGo(512Mi/60s)を追加。
  • CIに OGPサンプルQCステップを追加(PNG/WebPをレンダリングして upload-artifact で目視確認可能)。

生成サンプル(QC・クロップ後)

生成OGPサンプル(クロップ後)

テスト

  • gofmt / go build ./... / go vet ./... / go test ./...(Firestore統合テストはエミュレータ未設定時スキップ): すべてグリーン
  • actionlint .github/workflows/dev-deploy.yml: パス

備考

  • 本ブランチには先行の「デプロイ並列化」コミットが含まれます(base=main)。
  • カード外接矩形は base.png(2500×1313)から実測。base差し替え時は再計測が必要(ogpimage.go に注記済み)。

To show artifacts inline, enable in settings.

Open in Web Open in Cursor 

cursoragent and others added 5 commits July 1, 2026 15:54
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>
@cursor cursor Bot changed the title ci(dev-deploy): Go関数デプロイを直列→並列(一括)化してデプロイ時間を短縮 feat: userOGPをGoへ移植(WebP出力)+Go関数デプロイの並列化 Jul 1, 2026
cursoragent and others added 6 commits July 1, 2026 16:31
目視確認用の参照画像。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>
@kojira
kojira marked this pull request as ready for review July 1, 2026 17:16
@kojira
kojira merged commit 123ee89 into main Jul 1, 2026
3 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.

2 participants