chore(tradein/deploy): don't recreate scraper on infra-only deploys + 120s graceful stop (phase 0+1)
The tradein-scraper container runs the same image as backend (python -m app.scheduler_main, in-app scheduler) and owns the in-flight scrape sweeps (a browser card takes ~15-27s). Two problems compounded to kill running jobs on every deploy: Phase 0 (deploy-tradein.yml): SCRAPER_CHANGED also fired on the `infra` paths-filter (compose / workflow / deploy/**), so any generic infra edit recreated the scraper container and SIGKILLed the running job. Dropped the `|| infra == 'true'` term — only real scraper-code paths (already covered by the `scraper` paths-filter) or a manual workflow_dispatch recreate it. Phase 1 (docker-compose.prod.yml): the scraper had no stop_grace_period, so Docker's default 10s window SIGKILLed an in-flight card (15-27s) before it could finish. Added stop_grace_period: 120s + explicit stop_signal: SIGTERM so a running unit can finish + checkpoint. The cooperative-drain handler that consumes SIGTERM lands in a later phase; this is the foundation.
This commit is contained in:
parent
57ae2dfe00
commit
8aaa42f101
2 changed files with 12 additions and 1 deletions
|
|
@ -276,7 +276,13 @@ jobs:
|
||||||
env:
|
env:
|
||||||
IMAGE_TAG: latest
|
IMAGE_TAG: latest
|
||||||
GHCR_PAT: ${{ secrets.GHCR_PAT }}
|
GHCR_PAT: ${{ secrets.GHCR_PAT }}
|
||||||
SCRAPER_CHANGED: ${{ needs.changes.outputs.scraper == 'true' || needs.changes.outputs.infra == 'true' || github.event_name == 'workflow_dispatch' }}
|
# Phase 0: generic infra edits (compose / workflow / deploy/**) must NOT
|
||||||
|
# recreate the scraper and SIGKILL a running multi-hour job. Only genuine
|
||||||
|
# scraper-code paths (the `scraper` paths-filter already covers
|
||||||
|
# app/services/scrapers/**, scrape_pipeline.py, scheduler.py,
|
||||||
|
# scheduler_main.py, app/tasks/**) — or a manual workflow_dispatch —
|
||||||
|
# should trigger a scraper recreate. (infra term intentionally dropped.)
|
||||||
|
SCRAPER_CHANGED: ${{ needs.changes.outputs.scraper == 'true' || github.event_name == 'workflow_dispatch' }}
|
||||||
GITHUB_SHA: ${{ github.sha }}
|
GITHUB_SHA: ${{ github.sha }}
|
||||||
with:
|
with:
|
||||||
host: ${{ secrets.DEPLOY_HOST }}
|
host: ${{ secrets.DEPLOY_HOST }}
|
||||||
|
|
|
||||||
|
|
@ -129,6 +129,11 @@ services:
|
||||||
browser:
|
browser:
|
||||||
condition: service_started
|
condition: service_started
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
# Phase 1: give the in-flight scrape unit (browser card ~15-27s) time to finish
|
||||||
|
# + checkpoint on SIGTERM before Docker SIGKILLs. Default grace is only 10s, which
|
||||||
|
# SIGKILLs a running card mid-flight. (Cooperative-drain handler lands in a later phase.)
|
||||||
|
stop_grace_period: 120s
|
||||||
|
stop_signal: SIGTERM
|
||||||
networks:
|
networks:
|
||||||
- tradein-net
|
- tradein-net
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue