# Cloud Build pipeline for the preview-realtime container.
#
# - Builds infra/Dockerfile against the repo root.
# - Tags the image with both :latest and :$SHORT_SHA in Artifact Registry.
# - Creates or updates the Cloud Run Job (`gcloud run jobs deploy` is
#   create-or-update), so the first run bootstraps the Job and subsequent
#   runs roll out a new image revision. The Job spec lives here, making
#   this file the single source of truth.
#
# Manual run:
#   gcloud builds submit \
#     --config infra/cloudbuild.yaml \
#     --substitutions=SHORT_SHA=$(git rev-parse --short HEAD) \
#     --project boatrace-487212
#
# Recommended trigger: GitHub push to main with included files
#   infra/**, scripts/requirements.txt, scripts/**

substitutions:
  _REGION: asia-northeast1
  _AR_REPO: containers
  # イメージは preview-realtime / daily-sync の 2 Job で共通。歴史的経緯で
  # イメージ名は preview-realtime のままにしておく (Artifact Registry の
  # 既存タグを温存するため)。
  _IMAGE: preview-realtime
  _JOB_NAME: preview-realtime
  _JOB_NAME_DAILY: daily-sync
  _JOB_NAME_MONTHLY: monthly-weights
  _PROJECT_ID: boatrace-487212
  _RUNNER_SA: preview-realtime-runner
  _SECRET_NAME: github-token
  _GITHUB_REPO: BoatraceCSV/boatracecsv.github.io
  _GIT_BRANCH: main
  # fun-site への CSV ミラー / Pub/Sub publish 用。Job spec の単一情報源を
  # cloudbuild.yaml に集約する目的でここに定義し、deploy 時に毎回流し込む。
  # gcloud run jobs --set-env-vars は列挙したキーで全置換するため、
  # ここに含めておかないとデプロイのたびに値が消える。
  _GCS_CSV_BUCKET: boatrace-realtime-data-boatrace-487212
  _PUBSUB_TOPIC: projects/boatrace-487212/topics/fun-site-realtime-completed

options:
  logging: CLOUD_LOGGING_ONLY
  machineType: E2_HIGHCPU_8

images:
  - '${_REGION}-docker.pkg.dev/${_PROJECT_ID}/${_AR_REPO}/${_IMAGE}:${SHORT_SHA}'
  - '${_REGION}-docker.pkg.dev/${_PROJECT_ID}/${_AR_REPO}/${_IMAGE}:latest'

steps:
  - id: build
    name: gcr.io/cloud-builders/docker
    # BuildKit is required for `COPY --chmod=...` in infra/Dockerfile.
    env:
      - DOCKER_BUILDKIT=1
    args:
      - build
      - --file=infra/Dockerfile
      - --tag=${_REGION}-docker.pkg.dev/${_PROJECT_ID}/${_AR_REPO}/${_IMAGE}:${SHORT_SHA}
      - --tag=${_REGION}-docker.pkg.dev/${_PROJECT_ID}/${_AR_REPO}/${_IMAGE}:latest
      - --cache-from=${_REGION}-docker.pkg.dev/${_PROJECT_ID}/${_AR_REPO}/${_IMAGE}:latest
      - .

  - id: push-sha
    name: gcr.io/cloud-builders/docker
    args:
      - push
      - ${_REGION}-docker.pkg.dev/${_PROJECT_ID}/${_AR_REPO}/${_IMAGE}:${SHORT_SHA}

  - id: push-latest
    name: gcr.io/cloud-builders/docker
    args:
      - push
      - ${_REGION}-docker.pkg.dev/${_PROJECT_ID}/${_AR_REPO}/${_IMAGE}:latest

  # Create-or-update the Cloud Run Job. `deploy` is idempotent: it creates
  # the Job on first run and updates the existing Job on subsequent runs.
  # Cloud Build needs roles/run.developer on the project AND
  # iam.serviceAccountUser on the runner SA — see infra/README.md §5.
  #
  # `--command` を明示するのは、Dockerfile の ENTRYPOINT を tini のみに
  # したため (1 イメージで複数 Job を運用)。preview-realtime は run.sh、
  # daily-sync は run-daily-sync.sh を実行する。
  - id: deploy-job
    name: gcr.io/google.com/cloudsdktool/cloud-sdk:slim
    entrypoint: gcloud
    args:
      - run
      - jobs
      - deploy
      - ${_JOB_NAME}
      - --image=${_REGION}-docker.pkg.dev/${_PROJECT_ID}/${_AR_REPO}/${_IMAGE}:${SHORT_SHA}
      - --region=${_REGION}
      - --project=${_PROJECT_ID}
      - --service-account=${_RUNNER_SA}@${_PROJECT_ID}.iam.gserviceaccount.com
      - --command=/app/run.sh
      - --set-secrets=GITHUB_TOKEN=${_SECRET_NAME}:latest
      - --set-env-vars=GITHUB_REPO=${_GITHUB_REPO},GIT_BRANCH=${_GIT_BRANCH},BOATRACE_GCS_CSV_BUCKET=${_GCS_CSV_BUCKET},BOATRACE_PUBSUB_TOPIC=${_PUBSUB_TOPIC}
      - --max-retries=0
      - --task-timeout=300s
      - --parallelism=1
      - --tasks=1
      - --cpu=1
      # 実測のメモリ使用率は 1Gi 設定で p99 約 21% (~215MB)。partial+sparse
      # clone と pandas/lightgbm の import を含めても 512Mi で 2 倍強の余裕が
      # あるため、課金 (GiB 秒) を半分にする目的で 512Mi にしている。
      - --memory=512Mi

  # daily-sync Job: 旧 .github/workflows/daily-sync.yml を置き換える。
  # JST 07:30 に Cloud Scheduler から起動される (Scheduler の作成は
  # infra/README.md の手順に従う; cloudbuild からは作らない)。
  #
  # preview-realtime と異なる点:
  #   - --command:        /app/run-daily-sync.sh
  #   - --task-timeout:   3600s (実測 ~22 分 + バッファ)
  #   - --memory:         2Gi   (build_index の pandas + lightgbm に余裕)
  #   - --cpu:            2     (22 分の総時間圧縮)
  - id: deploy-job-daily-sync
    name: gcr.io/google.com/cloudsdktool/cloud-sdk:slim
    entrypoint: gcloud
    args:
      - run
      - jobs
      - deploy
      - ${_JOB_NAME_DAILY}
      - --image=${_REGION}-docker.pkg.dev/${_PROJECT_ID}/${_AR_REPO}/${_IMAGE}:${SHORT_SHA}
      - --region=${_REGION}
      - --project=${_PROJECT_ID}
      - --service-account=${_RUNNER_SA}@${_PROJECT_ID}.iam.gserviceaccount.com
      - --command=/app/run-daily-sync.sh
      - --set-secrets=GITHUB_TOKEN=${_SECRET_NAME}:latest
      - --set-env-vars=GITHUB_REPO=${_GITHUB_REPO},GIT_BRANCH=${_GIT_BRANCH},BOATRACE_GCS_CSV_BUCKET=${_GCS_CSV_BUCKET},BOATRACE_PUBSUB_TOPIC=${_PUBSUB_TOPIC}
      - --max-retries=0
      - --task-timeout=3600s
      - --parallelism=1
      - --tasks=1
      - --cpu=2
      - --memory=2Gi

  # monthly-weights Job: 旧 .github/workflows/monthly-weights.yml を置き換える。
  # 毎月 1 日 JST 06:00 に Cloud Scheduler から起動される。
  #
  # daily-sync (07:30 JST) より前に終わらせることで、境界日 (毎月 1 日) の
  # daily index と realtime index が同一 weights で計算される。
  # 詳細トレードオフは infra/monthly-weights-migration-plan.md §5 を参照。
  #
  # daily-sync と異なる点:
  #   - --command:         /app/run-monthly-weights.sh
  #   - --set-env-vars:    GCS / Pub/Sub 系を含めない。weights は fun-site が
  #                        直接読むファミリではないので publish 不要。
  # 他の Job spec パラメータ (timeout, cpu, memory) は daily-sync と同じ値で
  # 開始し、初回実行の実測でチューニングする。
  - id: deploy-job-monthly-weights
    name: gcr.io/google.com/cloudsdktool/cloud-sdk:slim
    entrypoint: gcloud
    args:
      - run
      - jobs
      - deploy
      - ${_JOB_NAME_MONTHLY}
      - --image=${_REGION}-docker.pkg.dev/${_PROJECT_ID}/${_AR_REPO}/${_IMAGE}:${SHORT_SHA}
      - --region=${_REGION}
      - --project=${_PROJECT_ID}
      - --service-account=${_RUNNER_SA}@${_PROJECT_ID}.iam.gserviceaccount.com
      - --command=/app/run-monthly-weights.sh
      - --set-secrets=GITHUB_TOKEN=${_SECRET_NAME}:latest
      - --set-env-vars=GITHUB_REPO=${_GITHUB_REPO},GIT_BRANCH=${_GIT_BRANCH}
      - --max-retries=0
      - --task-timeout=3600s
      - --parallelism=1
      - --tasks=1
      - --cpu=2
      - --memory=2Gi

timeout: 1800s
