Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
75 commits
Select commit Hold shift + click to select a range
4da9673
Merge branch 'env/dev' of github.com:428lab/debug-shrine into env/dev
ShinoharaTa Feb 1, 2024
1af5aa8
Merge branch 'alpha-0.2' into env/dev
ShinoharaTa Feb 1, 2024
8225564
Merge remote-tracking branch 'origin/alpha-0.2' into env/dev
cursoragent Jun 30, 2026
81d393d
Merge remote-tracking branch 'origin/alpha-0.2' into env/dev
cursoragent Jun 30, 2026
c40080f
ci: env/dev デプロイ再実行 (Node 22 ランタイム反映の完全検証)
cursoragent Jun 30, 2026
5a5a556
ci(debug): firebase deploy を --debug 付き+エラー出力キャプチャに一時変更 (env/dev 反映失敗…
cursoragent Jun 30, 2026
758a17b
Revert "ci(debug): firebase deploy を --debug 付き+エラー出力キャプチャに一時変更 (env/…
cursoragent Jun 30, 2026
c45cefb
Merge remote-tracking branch 'origin/alpha-0.2' into env/dev
cursoragent Jun 30, 2026
16aa4fd
ci: env/dev デプロイ再トリガー (Node 24 ランナーで firebase deploy 実行)
cursoragent Jun 30, 2026
8093d45
Merge remote-tracking branch 'origin/alpha-0.2' into env/dev
cursoragent Jun 30, 2026
fbe4318
Merge remote-tracking branch 'origin/alpha-0.2' into env/dev
cursoragent Jun 30, 2026
36b0185
Merge branch 'cursor/cache-mypage-status-5520' into env/dev
cursoragent Jun 30, 2026
cf91e49
Merge branch 'cursor/cache-mypage-status-5520' into env/dev
cursoragent Jun 30, 2026
48cc48f
Merge branch 'alpha-0.2' into env/dev
cursoragent Jun 30, 2026
45253db
Merge branch 'alpha-0.2' into env/dev
cursoragent Jun 30, 2026
0f979db
Merge: Service Worker自動更新を env/dev に反映 (#123)
cursoragent Jun 30, 2026
57d4621
Merge: 参拝結果遷移のトランジションを env/dev に反映 (#124)
cursoragent Jun 30, 2026
a6be382
Merge: ステップ→プッシュ回数の修正を env/dev に反映 (#125)
cursoragent Jun 30, 2026
3ae940d
Merge: アクション数表示への変更を env/dev に反映 (#125)
cursoragent Jun 30, 2026
1c526ed
feat(status): マイページ表示の高速化のため status エンドポイントをGoへ移植(statusGo)
cursoragent Jul 1, 2026
695a15e
Merge cursor/go-status-endpoint-5520 into alpha-0.2
cursoragent Jul 1, 2026
38f2460
Merge alpha-0.2 into env/dev: status エンドポイントGo移植(statusGo)の動作確認 (#126)
cursoragent Jul 1, 2026
6f48290
fix(statusGo): プロジェクトIDをfirestore.DetectProjectIDで自動検出
cursoragent Jul 1, 2026
ccf1db3
Merge cursor/go-status-endpoint-5520 into alpha-0.2 (fix: DetectProje…
cursoragent Jul 1, 2026
0ed4602
Merge alpha-0.2 into env/dev: statusGo DetectProjectID修正の反映
cursoragent Jul 1, 2026
ae502ab
feat(status): マイページ/プロフィール表示をstatusGoに切替
cursoragent Jul 1, 2026
58ae5f3
Merge cursor/go-status-endpoint-5520 into alpha-0.2 (frontend: status…
cursoragent Jul 1, 2026
d765033
Merge alpha-0.2 into env/dev: マイページ/プロフィールをstatusGoに切替
cursoragent Jul 1, 2026
dba2a88
feat(performance-go): sanpaiに必要な増分計算ロジックをGoにポート
cursoragent Jul 1, 2026
f50b3d0
feat(sanpai-go): sanpaiエンドポイントをGo(Cloud Run functions)に移植
cursoragent Jul 1, 2026
72c044b
ci(sanpai-go): CIにsanpaiGoのデプロイステップとdocsを追加
cursoragent Jul 1, 2026
9b93088
fix(sanpai-go): 第三者レビュー指摘への対応
cursoragent Jul 1, 2026
3a7a308
feat(ranking-go): rankingエンドポイントをGoへ移植
cursoragent Jul 1, 2026
6d18e8f
feat(register-go): registerエンドポイントをGoへ移植
cursoragent Jul 1, 2026
8877ba6
feat(ogp-rewrite-go): ogpRewriteエンドポイントをGoへ移植
cursoragent Jul 1, 2026
fb283a7
ci(go-endpoints): rankingGo/registerGo/ogpRewriteGoのデプロイステップとdocsを追加
cursoragent Jul 1, 2026
2bb49b9
fix(go-endpoints): 第三者レビュー指摘への対応(ranking/register)
cursoragent Jul 1, 2026
5b09049
Merge cursor/go-sanpai-endpoint-5520 into alpha-0.2 (sanpai/ranking/r…
cursoragent Jul 1, 2026
e37a35a
feat(frontend): sanpai/register/ranking/ogpRewriteをGo版へ切替
cursoragent Jul 1, 2026
6b536f0
Merge cursor/go-sanpai-endpoint-5520 into alpha-0.2 (frontend: sanpai…
cursoragent Jul 1, 2026
559c7f9
Merge alpha-0.2 into env/dev: sanpai/ranking/register/ogpRewriteのGo移植…
cursoragent Jul 1, 2026
4b183ed
feat(go-endpoints): スケジュール関数4本をGoへ移植(rankingUpdate/rankingCache/statu…
cursoragent Jul 1, 2026
ec0cfc9
Merge cursor/go-scheduled-functions-5520 into alpha-0.2 (スケジュール関数4本のG…
cursoragent Jul 1, 2026
39bd5c9
Merge alpha-0.2 into env/dev: スケジュール関数4本のGo移植
cursoragent Jul 1, 2026
2d5bca7
fix(ci): FirestoreエミュレータテストにJDK 21セットアップを追加
cursoragent Jul 1, 2026
030417b
Merge cursor/go-scheduled-functions-5520 into alpha-0.2 (CI: Firestor…
cursoragent Jul 1, 2026
fdd1015
Merge alpha-0.2 into env/dev: CI Firestoreエミュレータ用JDK21セットアップ追加
cursoragent Jul 1, 2026
27b4b3e
fix(performance): IssuesEventをpayload.actionで加点する(既存の常時未加点バグを修正)
cursoragent Jul 1, 2026
d45d5cf
fix(status): last_sanpai未設定時のクラッシュを修正し未参拝表示を返す
cursoragent Jul 1, 2026
53b56d8
fix(ci): スケジュールGo関数のPub/Subトピックを事前作成しデプロイ失敗を修正
cursoragent Jul 1, 2026
bbd9cf2
feat(status): status_versionで解析キャッシュをバージョン管理し旧ロジックのキャッシュを自己修復
cursoragent Jul 1, 2026
cf9f161
Merge pull request #129 from cursor/go-scheduled-functions-5520
cursoragent Jul 1, 2026
e408ec8
Merge branch 'main' into env/dev (PR #131)
cursoragent Jul 1, 2026
1556a84
ci(dev-deploy): Go関数のデプロイを直列から並列(一括)に変更しデプロイ時間を短縮
cursoragent Jul 1, 2026
aa82f70
feat(ogpimage): OGPカード画像生成パッケージを追加
cursoragent Jul 1, 2026
cc50bd5
feat(userOGPGo): OGP画像生成エンドポイントのGo版を追加
cursoragent Jul 1, 2026
d87dcb2
feat(ogpRewriteGo): og:imageをuserOGPGo(WebP)へ張替え
cursoragent Jul 1, 2026
0a306cc
ci(dev-deploy): userOGPGoの並列デプロイ追加とOGP QCアーティファクト生成
cursoragent Jul 1, 2026
d92df4f
chore(ogpimage): QC用の生成OGPサンプル(PNG/WebP)をリポジトリに追加
cursoragent Jul 1, 2026
4f3b9b2
feat(ogpimage): カード領域をOG比でクロップし余白除去(元解像度でレンダ→クロップ→一度だけ縮小)
cursoragent Jul 1, 2026
8fc4f03
docs: userOGPのGo移植(userOGPGo)・余白クロップ・WebP・QCを反映
cursoragent Jul 1, 2026
3aca1d6
fix(ogpimage): 左ラベルのレーダー被り解消とグリッド本数の削減
cursoragent Jul 1, 2026
5c16570
fix(ogpimage): 左ラベルの右寄せを1.0→0.7に緩め青パネルへの被りを解消
cursoragent Jul 1, 2026
1c4b80e
fix(ogpimage): ステータス行を左へ寄せ+上限幅ガードで大きい値のはみ出し防止
cursoragent Jul 1, 2026
123ee89
Merge pull request #132 from 428lab/cursor/parallelize-go-deploy-5520
kojira Jul 1, 2026
4f7f330
Merge pull request #133 from 428lab/main
kojira Jul 1, 2026
cc0ed5a
ci(prod-deploy): 本番にもGo関数デプロイ工程を追加(devと同等・本番設定)
cursoragent Jul 1, 2026
841f5cf
Merge pull request #134: prod-deploy.yml に Go関数デプロイ工程を追加(dev同等・本番設定)
cursoragent Jul 1, 2026
52de97b
Merge pull request: main -> env/dev (prod-deploy.yml Go関数デプロイ工程の反映)
cursoragent Jul 1, 2026
440524e
ci(prod-deploy): 本番はGo関数を先にデプロイしてからフロントを公開する
cursoragent Jul 1, 2026
bc2aa8b
Merge pull request #135: 本番はGo関数を先にデプロイしてからフロントを公開
cursoragent Jul 1, 2026
ac3d323
Merge pull request: main -> env/dev (prod-deploy 順序をバックエンド先行に変更)
cursoragent Jul 1, 2026
1c50fa0
ci: gen2並列デプロイのdockerRepositoryクラッシュを根本修正
cursoragent Jul 1, 2026
4da86ac
Merge pull request #136: gen2並列デプロイのdockerRepositoryクラッシュを根本修正
cursoragent Jul 1, 2026
e0918bd
Merge pull request: main -> env/dev (gen2並列デプロイ競合の根本修正)
cursoragent Jul 1, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
243 changes: 243 additions & 0 deletions .github/workflows/dev-deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -78,3 +78,246 @@ jobs:
run: |
firebase deploy --project d-shrine-dev --force
working-directory: ./app

- name: setup go
uses: actions/setup-go@v5
with:
go-version: "1.25"

- name: go build & test (functions-go)
run: |
go build ./...
go vet ./...
working-directory: ./app/functions-go

# Firestoreエミュレータの実行にはJDK 21以上が必要(firebase-toolsの要件)。
# ubuntu-22.04ランナーのデフォルトJavaはこれを満たさないため明示的にセットアップする。
- name: setup java (for Firestore emulator)
uses: actions/setup-java@v4
with:
distribution: "temurin"
java-version: "21"

# sanpai/ranking/register/statusCacheBackfill等のFirestore統合テストは
# FIRESTORE_EMULATOR_HOST未設定時は自動スキップされる設計(README参照)。
# CIでも実際に検証されるよう、Firestoreエミュレータを起動した状態で
# go test を実行する(firebase emulators:exec が終了時に自動でエミュレータを
# 落とすため、後続ステップに影響しない)。
- name: go test (functions-go, with Firestore emulator)
run: |
firebase emulators:exec --project d-shrine-dev --only firestore \
'cd functions-go && go test ./...'
working-directory: ./app

# OGP画像生成(userOGPGo)のQC。サンプルOGPをPNG/WebPでレンダリングして
# アーティファクト化し、生成物を目視確認できるようにする(描画の破綻を
# デプロイ前に検知する目的も兼ねる)。
- name: generate OGP sample for QC
run: |
go test ./internal/ogpimage/ -run TestWriteQCArtifacts -count=1 -v
working-directory: ./app/functions-go
env:
OGP_QC_OUT: ${{ github.workspace }}/ogp-qc

- name: upload OGP sample artifact
uses: actions/upload-artifact@v4
with:
name: ogp-sample
path: ${{ github.workspace }}/ogp-qc/
if-no-files-found: error

# ここから Go版 Cloud Run functions のデプロイ。
# Gen2(Cloud Run)関数のデプロイは内部でCloud Buildのコンテナビルドを伴い
# 1本あたり数分かかる。関数間に依存が無いため、以前のように1本ずつ直列で
# deployすると全体で15〜30分規模になっていた。そこで前提処理(サービス有効化・
# Pub/Subトピック作成・認証情報取得・ロケーション解決)を先に済ませてから、
# 全関数のdeployをバックグラウンドで同時に起動して一括waitする
# (体感で最も遅い1本分の時間に短縮)。

# HTTP関数とスケジュール関数(Pub/Subトリガー)の両方に必要なGCPサービスを一括有効化。
- name: enable required GCP services
run: |
gcloud services enable \
cloudfunctions.googleapis.com \
run.googleapis.com \
cloudbuild.googleapis.com \
artifactregistry.googleapis.com \
pubsub.googleapis.com \
cloudscheduler.googleapis.com \
eventarc.googleapis.com \
--project=d-shrine-dev

# gen2(Cloud Run)関数のイメージ格納先であるArtifact Registryリポジトリ
# (デフォルト名 gcf-artifacts)を事前に作成しておく(冪等)。
# gcloudは通常このリポジトリを遅延自動解決するが、複数のdeployを並列実行すると
# その解決が競合し、一部が
# `gcloud crashed (AttributeError): 'NoneType' object has no attribute 'dockerRepository'`
# でクラッシュする(並列時のみ・ランダムな一部で発生する非決定的な競合)。
# 事前作成し、各deployで --docker-repository を明示指定することで自動解決の競合を無くす。
- name: ensure Artifact Registry repo for gen2 functions
run: |
gcloud artifacts repositories describe gcf-artifacts \
--location=us-central1 --project=d-shrine-dev \
|| gcloud artifacts repositories create gcf-artifacts \
--location=us-central1 --repository-format=docker --project=d-shrine-dev

# Cloud Functions(Gen2)の --trigger-topic は Gen1と異なりPub/Subトピックを
# 自動作成しない(存在しないトピックを指定すると
# `Validation failed for trigger ...: Resource not found` で即失敗する)。
# そのため各スケジュール関数用トピックを事前に作成しておく
# (既に存在すれば describe が成功するのでスキップする、冪等な実装)。
- name: create Pub/Sub topics for scheduled Go functions
run: |
for TOPIC in ranking-update-go ranking-cache-go status-cache-backfill-go scheduled-ogp-delete-go; do
gcloud pubsub topics describe "$TOPIC" --project=d-shrine-dev \
|| gcloud pubsub topics create "$TOPIC" --project=d-shrine-dev
done

# GitHub OAuth Appのclient_id/client_secretは、Node版が使う
# `firebase functions:config:get` (既にGCP側に設定済みの値)からそのまま取得し、
# 新規のGitHub Secretsは増やさない。ログに値が出ないよう ::add-mask:: で
# マスクしてから $GITHUB_ENV に渡す(sanpaiGoで使用)。
- name: fetch GitHub OAuth credentials for sanpaiGo
run: |
set -eo pipefail
CONFIG_JSON=$(firebase functions:config:get github --project d-shrine-dev)
CLIENT_ID=$(echo "$CONFIG_JSON" | jq -r '.client_id')
CLIENT_SECRET=$(echo "$CONFIG_JSON" | jq -r '.client_secret')
echo "::add-mask::$CLIENT_ID"
echo "::add-mask::$CLIENT_SECRET"
echo "SANPAI_GH_CLIENT_ID=$CLIENT_ID" >> "$GITHUB_ENV"
echo "SANPAI_GH_CLIENT_SECRET=$CLIENT_SECRET" >> "$GITHUB_ENV"
working-directory: ./app

# FUNC_BASE_URLはNode版が functions.config().func.base_url から読む値と同じもので、
# sanpaiGoのGitHub資格情報と同様に既存のFirebase Functions Configから取得する
# (ogpRewriteGoで使用)。
- name: fetch base_url for ogpRewriteGo
run: |
set -eo pipefail
CONFIG_JSON=$(firebase functions:config:get func --project d-shrine-dev)
BASE_URL=$(echo "$CONFIG_JSON" | jq -r '.base_url')
echo "OGP_FUNC_BASE_URL=$BASE_URL" >> "$GITHUB_ENV"
working-directory: ./app

# Cloud SchedulerジョブのlocationはプロジェクトのApp Engineアプリと
# 同一でなければならない(App Engineが存在するプロジェクトでは、それ以外の
# リージョンを指定すると `Location must equal <app-engine-location>` エラーになる)。
# `gcloud app describe` が返す locationId はレガシーなApp Engine表記
# (例: "us-central")の場合があり、Cloud Scheduler/Cloud Functions等の
# 通常のCloudリージョン表記(例: "us-central1")とは異なることがあるため、
# 既知の対応表で変換する。
- name: resolve App Engine location for Cloud Scheduler
run: |
set -eo pipefail
RAW_LOCATION=$(gcloud app describe --project=d-shrine-dev --format='value(locationId)')
case "$RAW_LOCATION" in
us-central) LOCATION=us-central1 ;;
europe-west) LOCATION=europe-west1 ;;
*) LOCATION="$RAW_LOCATION" ;;
esac
echo "resolved App Engine location: $RAW_LOCATION -> $LOCATION"
echo "APP_ENGINE_LOCATION=$LOCATION" >> "$GITHUB_ENV"

# 全Go関数のデプロイをバックグラウンドで同時起動し、まとめてwaitする。
# 依存関係(トピック/認証情報/ロケーション)は上の先行ステップで解決済み。
# timeout: HTTP関数は30s、スケジュール関数は全ユーザースキャン等で長くなり得るため
# 安全側に300sを明示。ログは関数ごとにファイルへ退避し、最後に順番に出力する
# (並行実行でログが混ざるのを防ぐ)。1本でも失敗したらステップを失敗させる。
- name: deploy all Go Cloud Run functions in parallel
working-directory: ./app/functions-go
run: |
set -uo pipefail
# 事前作成済みのAR docker リポジトリを明示指定し、並列deploy時の自動解決競合を防ぐ。
DOCKER_REPO="projects/d-shrine-dev/locations/us-central1/repositories/gcf-artifacts"
declare -a PIDS NAMES
deploy() {
local name="$1"; shift
local entry="$1"; shift
echo "start deploy: $name"
( gcloud functions deploy "$name" \
--project=d-shrine-dev \
--gen2 \
--runtime=go125 \
--region=us-central1 \
--docker-repository="$DOCKER_REPO" \
--source=. \
--entry-point="$entry" \
"$@" ) > "/tmp/deploy-$name.log" 2>&1 &
PIDS+=("$!")
NAMES+=("$name")
}

# HTTPトリガー関数
deploy statusGo StatusGo \
--trigger-http --allow-unauthenticated --memory=256Mi --timeout=30s
deploy sanpaiGo SanpaiGo \
--trigger-http --allow-unauthenticated --memory=256Mi --timeout=30s \
--set-env-vars="GITHUB_CLIENT_ID=$SANPAI_GH_CLIENT_ID,GITHUB_CLIENT_SECRET=$SANPAI_GH_CLIENT_SECRET,SANPAI_NEXT_TIME_SECONDS=60"
deploy registerGo RegisterGo \
--trigger-http --allow-unauthenticated --memory=256Mi --timeout=30s
deploy rankingGo RankingGo \
--trigger-http --allow-unauthenticated --memory=256Mi --timeout=30s
deploy ogpRewriteGo OgpRewriteGo \
--trigger-http --allow-unauthenticated --memory=256Mi --timeout=30s \
--set-env-vars="FUNC_BASE_URL=$OGP_FUNC_BASE_URL,OGP_PROJECT_ID=d-shrine-dev"
# userOGPGoは画像合成(base同梱)+WebPエンコード+アバター取得+GCSアップロードを
# 行うため、他HTTP関数より余裕を持たせる(512Mi/60s)。
deploy userOGPGo UserOGPGo \
--trigger-http --allow-unauthenticated --memory=512Mi --timeout=60s \
--set-env-vars="STORAGE_BUCKET_NAME=d-shrine-dev.appspot.com"

# Pub/Subトリガー(スケジュール)関数
deploy rankingUpdateGo RankingUpdateGo \
--trigger-topic=ranking-update-go --memory=256Mi --timeout=300s
deploy rankingCacheGo RankingCacheGo \
--trigger-topic=ranking-cache-go --memory=256Mi --timeout=300s
deploy statusCacheBackfillGo StatusCacheBackfillGo \
--trigger-topic=status-cache-backfill-go --memory=512Mi --timeout=300s
deploy scheduledOgpDeleteGo ScheduledOgpDeleteGo \
--trigger-topic=scheduled-ogp-delete-go --memory=256Mi --timeout=300s \
--set-env-vars="STORAGE_BUCKET_NAME=d-shrine-dev.appspot.com"

fail=0
for idx in "${!NAMES[@]}"; do
name="${NAMES[$idx]}"
if wait "${PIDS[$idx]}"; then
status=OK
else
status=FAILED
fail=1
fi
echo "::group::deploy $status: $name"
cat "/tmp/deploy-$name.log"
echo "::endgroup::"
done
if [ "$fail" -ne 0 ]; then
echo "one or more Go function deployments failed" >&2
fi
exit "$fail"

# スケジュール関数用のCloud Schedulerジョブを作成/更新する(冪等)。
# ジョブはトピックにメッセージを流すだけなので関数デプロイ完了後に一括で行う。
# update が存在しないジョブに対して失敗したら create にフォールバックする。
- name: create/update Cloud Scheduler jobs for scheduled Go functions
run: |
set -uo pipefail
upsert_job() {
local job="$1" schedule="$2" topic="$3"
gcloud scheduler jobs update pubsub "$job" \
--project=d-shrine-dev --location="$APP_ENGINE_LOCATION" \
--schedule="$schedule" \
--topic="$topic" \
--message-body="{}" \
--time-zone=Etc/UTC \
|| gcloud scheduler jobs create pubsub "$job" \
--project=d-shrine-dev --location="$APP_ENGINE_LOCATION" \
--schedule="$schedule" \
--topic="$topic" \
--message-body="{}" \
--time-zone=Etc/UTC
}
upsert_job ranking-update-go "0 * * * *" ranking-update-go
upsert_job ranking-cache-go "0 */2 * * *" ranking-cache-go
upsert_job status-cache-backfill-go "*/30 * * * *" status-cache-backfill-go
upsert_job scheduled-ogp-delete-go "0 */1 * * *" scheduled-ogp-delete-go
Loading
Loading