Merge pull request 'chore(ci): не проглатывать падение сборки + починить самолечение buildcache' (#2890) from chore/ci-gates-runner-and-deploy into main
Some checks failed
Deploy Trade-In / test (push) Blocked by required conditions
Deploy Trade-In / build-backend (push) Blocked by required conditions
Deploy Trade-In / build-frontend (push) Blocked by required conditions
Deploy Trade-In / build-browser (push) Blocked by required conditions
Deploy Trade-In / deploy-status (push) Blocked by required conditions
Deploy Trade-In / deploy (push) Blocked by required conditions
Deploy Trade-In / changes (push) Has been cancelled
Deploy / changes (push) Successful in 11s
Deploy / build-frontend (push) Successful in 48s
Deploy / build-worker (push) Successful in 50s
Deploy / build-backend (push) Successful in 51s
Deploy / deploy (push) Successful in 1m31s
Deploy / deploy-status (push) Successful in 2s
Some checks failed
Deploy Trade-In / test (push) Blocked by required conditions
Deploy Trade-In / build-backend (push) Blocked by required conditions
Deploy Trade-In / build-frontend (push) Blocked by required conditions
Deploy Trade-In / build-browser (push) Blocked by required conditions
Deploy Trade-In / deploy-status (push) Blocked by required conditions
Deploy Trade-In / deploy (push) Blocked by required conditions
Deploy Trade-In / changes (push) Has been cancelled
Deploy / changes (push) Successful in 11s
Deploy / build-frontend (push) Successful in 48s
Deploy / build-worker (push) Successful in 50s
Deploy / build-backend (push) Successful in 51s
Deploy / deploy (push) Successful in 1m31s
Deploy / deploy-status (push) Successful in 2s
This commit is contained in:
commit
e9abf1cd31
2 changed files with 249 additions and 2 deletions
|
|
@ -264,6 +264,12 @@ jobs:
|
||||||
id: buildx
|
id: buildx
|
||||||
|
|
||||||
- name: Build & push tradein-backend
|
- name: Build & push tradein-backend
|
||||||
|
# id + continue-on-error: битый blob в удалённом buildcache-манифесте
|
||||||
|
# валит весь шаг ДО push нового образа — деплой тогда молча
|
||||||
|
# пропускается (#2841), хотя собрать образ можно и без кеша. Ретрай
|
||||||
|
# без cache-from — ниже.
|
||||||
|
id: build
|
||||||
|
continue-on-error: true
|
||||||
uses: docker/build-push-action@v6
|
uses: docker/build-push-action@v6
|
||||||
with:
|
with:
|
||||||
# Context = tradein-mvp/ (uv workspace root): образу нужен packages/scraper-kit
|
# Context = tradein-mvp/ (uv workspace root): образу нужен packages/scraper-kit
|
||||||
|
|
@ -284,6 +290,35 @@ jobs:
|
||||||
${{ env.IMAGE_BACKEND }}:latest
|
${{ env.IMAGE_BACKEND }}:latest
|
||||||
${{ env.IMAGE_BACKEND }}:${{ github.sha }}
|
${{ env.IMAGE_BACKEND }}:${{ github.sha }}
|
||||||
|
|
||||||
|
- name: Retry build & push tradein-backend без кеша (битый buildcache, #2841)
|
||||||
|
# cache-from опущен (источник падения), cache-to ОСТАВЛЕН (ревью #2841 R2,
|
||||||
|
# issue #2): успешный ретрай перезаписывает битый buildcache-тег своими
|
||||||
|
# слоями (mode=max) — это и есть самолечение. Без cache-to здесь порча
|
||||||
|
# оставалась навсегда, следующий прогон снова падал на том же cache-from.
|
||||||
|
if: steps.build.outcome == 'failure'
|
||||||
|
uses: docker/build-push-action@v6
|
||||||
|
with:
|
||||||
|
context: ./tradein-mvp
|
||||||
|
file: ./tradein-mvp/backend/Dockerfile
|
||||||
|
push: true
|
||||||
|
build-args: |
|
||||||
|
APP_VERSION=${{ needs.changes.outputs.app_version }}
|
||||||
|
BUILD_SHA=${{ needs.changes.outputs.build_sha }}
|
||||||
|
BUILD_DATE=${{ needs.changes.outputs.build_date }}
|
||||||
|
cache-to: type=registry,ref=${{ env.IMAGE_BACKEND }}:buildcache,mode=max
|
||||||
|
tags: |
|
||||||
|
${{ env.IMAGE_BACKEND }}:latest
|
||||||
|
${{ env.IMAGE_BACKEND }}:${{ github.sha }}
|
||||||
|
|
||||||
|
- name: Проверить, что tradein-backend:${{ github.sha }} реально в registry (fail-safe, #2841 R2)
|
||||||
|
# НЕ полагается на семантику steps.build.outcome/continue-on-error раннера —
|
||||||
|
# проверяет РЕАЛЬНОЕ состояние registry через buildx (уже настроен выше).
|
||||||
|
# Если act_runner не заполняет outcome, ретрай выше молча НЕ побежит при
|
||||||
|
# упавшем build — этот шаг единственный это заметит: манифеста с этим SHA
|
||||||
|
# не будет → шаг падает БЕЗ continue-on-error → job честно FAILURE → deploy
|
||||||
|
# ниже пропускается вместо накатки старого :latest на прод.
|
||||||
|
run: docker buildx imagetools inspect ${{ env.IMAGE_BACKEND }}:${{ github.sha }} > /dev/null
|
||||||
|
|
||||||
- name: Убрать buildx-билдер (#2869 — иначе копятся по одному на прогон)
|
- name: Убрать buildx-билдер (#2869 — иначе копятся по одному на прогон)
|
||||||
# setup-buildx-action создаёт билдер `docker-container` на КАЖДЫЙ прогон.
|
# setup-buildx-action создаёт билдер `docker-container` на КАЖДЫЙ прогон.
|
||||||
# Его post-step под Forgejo act_runner не срабатывает, поэтому к 13.08 на
|
# Его post-step под Forgejo act_runner не срабатывает, поэтому к 13.08 на
|
||||||
|
|
@ -362,6 +397,10 @@ jobs:
|
||||||
run: cp tradein-mvp/CHANGELOG.md tradein-mvp/frontend/CHANGELOG.md
|
run: cp tradein-mvp/CHANGELOG.md tradein-mvp/frontend/CHANGELOG.md
|
||||||
|
|
||||||
- name: Build & push tradein-frontend
|
- name: Build & push tradein-frontend
|
||||||
|
# id + continue-on-error — см. tradein-backend (#2841): битый blob в
|
||||||
|
# удалённом buildcache не должен ронять сборку и молча пропускать деплой.
|
||||||
|
id: build
|
||||||
|
continue-on-error: true
|
||||||
uses: docker/build-push-action@v6
|
uses: docker/build-push-action@v6
|
||||||
with:
|
with:
|
||||||
context: ./tradein-mvp/frontend
|
context: ./tradein-mvp/frontend
|
||||||
|
|
@ -386,6 +425,30 @@ jobs:
|
||||||
${{ env.IMAGE_FRONTEND }}:latest
|
${{ env.IMAGE_FRONTEND }}:latest
|
||||||
${{ env.IMAGE_FRONTEND }}:${{ github.sha }}
|
${{ env.IMAGE_FRONTEND }}:${{ github.sha }}
|
||||||
|
|
||||||
|
- name: Retry build & push tradein-frontend без кеша (битый buildcache, #2841)
|
||||||
|
# См. tradein-backend (issue #2, ревью R2): cache-from опущен, cache-to
|
||||||
|
# ОСТАВЛЕН — успешный ретрай перезаписывает битый buildcache-тег своими
|
||||||
|
# слоями (mode=max), это и есть самолечение.
|
||||||
|
if: steps.build.outcome == 'failure'
|
||||||
|
uses: docker/build-push-action@v6
|
||||||
|
with:
|
||||||
|
context: ./tradein-mvp/frontend
|
||||||
|
push: true
|
||||||
|
build-args: |
|
||||||
|
NEXT_PUBLIC_BASE_PATH=/trade-in
|
||||||
|
NEXT_PUBLIC_API_BASE_URL=/trade-in
|
||||||
|
NEXT_PUBLIC_APP_VERSION=${{ needs.changes.outputs.app_version }}
|
||||||
|
NEXT_PUBLIC_BUILD_SHA=${{ needs.changes.outputs.build_sha }}
|
||||||
|
NEXT_PUBLIC_BUILD_DATE=${{ needs.changes.outputs.build_date }}
|
||||||
|
cache-to: type=registry,ref=${{ env.IMAGE_FRONTEND }}:buildcache,mode=max
|
||||||
|
tags: |
|
||||||
|
${{ env.IMAGE_FRONTEND }}:latest
|
||||||
|
${{ env.IMAGE_FRONTEND }}:${{ github.sha }}
|
||||||
|
|
||||||
|
- name: Проверить, что tradein-frontend:${{ github.sha }} реально в registry (fail-safe, #2841 R2)
|
||||||
|
# См. tradein-backend выше — не полагается на steps.build.outcome раннера.
|
||||||
|
run: docker buildx imagetools inspect ${{ env.IMAGE_FRONTEND }}:${{ github.sha }} > /dev/null
|
||||||
|
|
||||||
- name: Убрать buildx-билдер (#2869 — иначе копятся по одному на прогон)
|
- name: Убрать buildx-билдер (#2869 — иначе копятся по одному на прогон)
|
||||||
# setup-buildx-action создаёт билдер `docker-container` на КАЖДЫЙ прогон.
|
# setup-buildx-action создаёт билдер `docker-container` на КАЖДЫЙ прогон.
|
||||||
# Его post-step под Forgejo act_runner не срабатывает, поэтому к 13.08 на
|
# Его post-step под Forgejo act_runner не срабатывает, поэтому к 13.08 на
|
||||||
|
|
@ -458,6 +521,10 @@ jobs:
|
||||||
id: buildx
|
id: buildx
|
||||||
|
|
||||||
- name: Build & push tradein-browser
|
- name: Build & push tradein-browser
|
||||||
|
# id + continue-on-error — см. tradein-backend выше (#2841): битый blob
|
||||||
|
# в удалённом buildcache не должен ронять сборку и молча пропускать деплой.
|
||||||
|
id: build
|
||||||
|
continue-on-error: true
|
||||||
uses: docker/build-push-action@v6
|
uses: docker/build-push-action@v6
|
||||||
with:
|
with:
|
||||||
context: ./tradein-mvp/browser
|
context: ./tradein-mvp/browser
|
||||||
|
|
@ -468,6 +535,24 @@ jobs:
|
||||||
${{ env.IMAGE_BROWSER }}:latest
|
${{ env.IMAGE_BROWSER }}:latest
|
||||||
${{ env.IMAGE_BROWSER }}:${{ github.sha }}
|
${{ env.IMAGE_BROWSER }}:${{ github.sha }}
|
||||||
|
|
||||||
|
- name: Retry build & push tradein-browser без кеша (битый buildcache, #2841)
|
||||||
|
# См. tradein-backend (issue #2, ревью R2): cache-from опущен, cache-to
|
||||||
|
# ОСТАВЛЕН — успешный ретрай перезаписывает битый buildcache-тег своими
|
||||||
|
# слоями (mode=max), это и есть самолечение.
|
||||||
|
if: steps.build.outcome == 'failure'
|
||||||
|
uses: docker/build-push-action@v6
|
||||||
|
with:
|
||||||
|
context: ./tradein-mvp/browser
|
||||||
|
push: true
|
||||||
|
cache-to: type=registry,ref=${{ env.IMAGE_BROWSER }}:buildcache,mode=max
|
||||||
|
tags: |
|
||||||
|
${{ env.IMAGE_BROWSER }}:latest
|
||||||
|
${{ env.IMAGE_BROWSER }}:${{ github.sha }}
|
||||||
|
|
||||||
|
- name: Проверить, что tradein-browser:${{ github.sha }} реально в registry (fail-safe, #2841 R2)
|
||||||
|
# См. tradein-backend выше — не полагается на steps.build.outcome раннера.
|
||||||
|
run: docker buildx imagetools inspect ${{ env.IMAGE_BROWSER }}:${{ github.sha }} > /dev/null
|
||||||
|
|
||||||
- name: Убрать buildx-билдер (#2869 — иначе копятся по одному на прогон)
|
- name: Убрать buildx-билдер (#2869 — иначе копятся по одному на прогон)
|
||||||
# setup-buildx-action создаёт билдер `docker-container` на КАЖДЫЙ прогон.
|
# setup-buildx-action создаёт билдер `docker-container` на КАЖДЫЙ прогон.
|
||||||
# Его post-step под Forgejo act_runner не срабатывает, поэтому к 13.08 на
|
# Его post-step под Forgejo act_runner не срабатывает, поэтому к 13.08 на
|
||||||
|
|
@ -1019,3 +1104,33 @@ jobs:
|
||||||
# The changes job reads this file on the next run to compute cumulative diff.
|
# The changes job reads this file on the next run to compute cumulative diff.
|
||||||
echo "$GITHUB_SHA" > /opt/gendesign/.tradein-deployed-sha
|
echo "$GITHUB_SHA" > /opt/gendesign/.tradein-deployed-sha
|
||||||
echo "→ Deployed SHA marker updated: $GITHUB_SHA"
|
echo "→ Deployed SHA marker updated: $GITHUB_SHA"
|
||||||
|
|
||||||
|
# Честный итог прогона (#2841). ПРОБЛЕМА: `deploy` пропускается своим `if:`
|
||||||
|
# молча (result=skipped), когда `test` или один из build-* падает (например,
|
||||||
|
# битый blob в buildcache роняет `docker/build-push-action` — до ретрая
|
||||||
|
# выше, #2841). skipped-job не красит прогон явным «FAILED» так, чтобы это
|
||||||
|
# было видно на первый взгляд — итог выглядит зелёным/нейтральным, хотя
|
||||||
|
# tradein-стек на проде не обновился. Эта job бежит ВСЕГДА (`if: always()`,
|
||||||
|
# кроме отмены прогона) и сама падает, если deploy не завершился success —
|
||||||
|
# неважно, пропущен он (test/build упали) или упал сам (SSH/миграция/
|
||||||
|
# health-check/сверка образов #2679). Красная точка встаёт именно там, где
|
||||||
|
# решение реально принято, а не там, где она случайно оказалась по цепочке if.
|
||||||
|
deploy-status:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: [test, build-backend, build-frontend, build-browser, deploy]
|
||||||
|
if: always() && !cancelled()
|
||||||
|
steps:
|
||||||
|
- name: Итог прогона — деплой обязан быть success, не skipped/failure
|
||||||
|
run: |
|
||||||
|
echo "test: ${{ needs.test.result }}"
|
||||||
|
echo "build-backend: ${{ needs.build-backend.result }}"
|
||||||
|
echo "build-frontend: ${{ needs.build-frontend.result }}"
|
||||||
|
echo "build-browser: ${{ needs.build-browser.result }}"
|
||||||
|
echo "deploy: ${{ needs.deploy.result }}"
|
||||||
|
if [ "${{ needs.deploy.result }}" != "success" ]; then
|
||||||
|
echo "::error::деплой НЕ прошёл (deploy.result=${{ needs.deploy.result }})." \
|
||||||
|
"Прогон должен читаться как FAILED, а не как пропущенный шаг (#2841)." \
|
||||||
|
"Смотри логи test/build-backend/build-frontend/build-browser/deploy выше."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "✓ деплой прошёл успешно"
|
||||||
|
|
|
||||||
|
|
@ -113,6 +113,12 @@ jobs:
|
||||||
id: buildx
|
id: buildx
|
||||||
|
|
||||||
- name: Build & push backend (lean — без Chromium)
|
- name: Build & push backend (lean — без Chromium)
|
||||||
|
# id + continue-on-error: битый blob в удалённом buildcache-манифесте
|
||||||
|
# (registry cache, не local) валит весь шаг ДО push нового образа —
|
||||||
|
# деплой тогда молча пропускается (#2841), хотя код собрать можно, просто
|
||||||
|
# без кеша. cache-from нефатален: при падении ретраим БЕЗ него ниже.
|
||||||
|
id: build
|
||||||
|
continue-on-error: true
|
||||||
uses: docker/build-push-action@v6
|
uses: docker/build-push-action@v6
|
||||||
with:
|
with:
|
||||||
context: ./backend
|
context: ./backend
|
||||||
|
|
@ -124,6 +130,36 @@ jobs:
|
||||||
${{ env.IMAGE_BACKEND }}:latest
|
${{ env.IMAGE_BACKEND }}:latest
|
||||||
${{ env.IMAGE_BACKEND }}:${{ github.sha }}
|
${{ env.IMAGE_BACKEND }}:${{ github.sha }}
|
||||||
|
|
||||||
|
- name: Retry build & push backend без кеша (битый buildcache, #2841)
|
||||||
|
# cache-from опущен (источник падения), а cache-to ОСТАВЛЕН: успешный
|
||||||
|
# ретрай пушит свежие слои в buildcache-тег и тем самым сам перезаписывает
|
||||||
|
# битый blob (mode=max — полная перезапись манифеста). Раньше cache-to был
|
||||||
|
# опущен и здесь тоже — но следующий обычный прогон опять получает cache-from
|
||||||
|
# на детерминированно битый тег и падает СНОВА: самолечения не было НИКОГДА
|
||||||
|
# (ревью #2841 R2, issue #2). Если и retry упадёт — шаг красный БЕЗ
|
||||||
|
# continue-on-error, job честно FAILURE, и deploy ниже корректно
|
||||||
|
# пропускается (уже настоящая причина, не кеш).
|
||||||
|
if: steps.build.outcome == 'failure'
|
||||||
|
uses: docker/build-push-action@v6
|
||||||
|
with:
|
||||||
|
context: ./backend
|
||||||
|
target: runner
|
||||||
|
push: true
|
||||||
|
cache-to: type=registry,ref=${{ env.IMAGE_BACKEND }}:buildcache,mode=max
|
||||||
|
tags: |
|
||||||
|
${{ env.IMAGE_BACKEND }}:latest
|
||||||
|
${{ env.IMAGE_BACKEND }}:${{ github.sha }}
|
||||||
|
|
||||||
|
- name: Проверить, что backend:${{ github.sha }} реально в registry (fail-safe, #2841 R2)
|
||||||
|
# НЕ полагается на семантику steps.build.outcome/continue-on-error раннера —
|
||||||
|
# проверяет РЕАЛЬНОЕ состояние registry напрямую через buildx (уже настроен
|
||||||
|
# выше). Если act_runner не заполняет outcome (не проверено живым прогоном,
|
||||||
|
# см. ревью), ретрай выше молча НЕ побежит при упавшем build, а этот шаг —
|
||||||
|
# единственный, кто это заметит: манифеста с этим SHA не будет → шаг падает
|
||||||
|
# БЕЗ continue-on-error → job честно FAILURE → deploy ниже пропускается
|
||||||
|
# вместо накатки старого :latest на прод.
|
||||||
|
run: docker buildx imagetools inspect ${{ env.IMAGE_BACKEND }}:${{ github.sha }} > /dev/null
|
||||||
|
|
||||||
- name: Убрать buildx-билдер (#2869 — иначе копятся по одному на прогон)
|
- name: Убрать buildx-билдер (#2869 — иначе копятся по одному на прогон)
|
||||||
# setup-buildx-action создаёт билдер `docker-container` на КАЖДЫЙ прогон.
|
# setup-buildx-action создаёт билдер `docker-container` на КАЖДЫЙ прогон.
|
||||||
# Его post-step под Forgejo act_runner не срабатывает, поэтому к 13.08 на
|
# Его post-step под Forgejo act_runner не срабатывает, поэтому к 13.08 на
|
||||||
|
|
@ -194,6 +230,10 @@ jobs:
|
||||||
id: buildx
|
id: buildx
|
||||||
|
|
||||||
- name: Build & push worker (с Chromium для Playwright)
|
- name: Build & push worker (с Chromium для Playwright)
|
||||||
|
# id + continue-on-error — см. build-backend выше (#2841): битый blob в
|
||||||
|
# удалённом buildcache не должен ронять сборку и молча пропускать деплой.
|
||||||
|
id: build
|
||||||
|
continue-on-error: true
|
||||||
uses: docker/build-push-action@v6
|
uses: docker/build-push-action@v6
|
||||||
with:
|
with:
|
||||||
context: ./backend
|
context: ./backend
|
||||||
|
|
@ -205,6 +245,28 @@ jobs:
|
||||||
${{ env.IMAGE_WORKER }}:latest
|
${{ env.IMAGE_WORKER }}:latest
|
||||||
${{ env.IMAGE_WORKER }}:${{ github.sha }}
|
${{ env.IMAGE_WORKER }}:${{ github.sha }}
|
||||||
|
|
||||||
|
- name: Retry build & push worker без кеша (битый buildcache, #2841)
|
||||||
|
# См. backend (issue #2, ревью R2): cache-from опущен, cache-to ОСТАВЛЕН —
|
||||||
|
# успешный ретрай перезаписывает битый buildcache-тег своими слоями
|
||||||
|
# (mode=max), это и есть самолечение. Без cache-to здесь порча оставалась
|
||||||
|
# навсегда — следующий прогон снова падал на том же cache-from.
|
||||||
|
if: steps.build.outcome == 'failure'
|
||||||
|
uses: docker/build-push-action@v6
|
||||||
|
with:
|
||||||
|
context: ./backend
|
||||||
|
target: runner-with-chromium
|
||||||
|
push: true
|
||||||
|
cache-to: type=registry,ref=${{ env.IMAGE_WORKER }}:buildcache,mode=max
|
||||||
|
tags: |
|
||||||
|
${{ env.IMAGE_WORKER }}:latest
|
||||||
|
${{ env.IMAGE_WORKER }}:${{ github.sha }}
|
||||||
|
|
||||||
|
- name: Проверить, что worker:${{ github.sha }} реально в registry (fail-safe, #2841 R2)
|
||||||
|
# См. backend выше — не полагается на steps.build.outcome раннера, проверяет
|
||||||
|
# реальное состояние registry, чтобы молча пропущенный ретрай (если outcome
|
||||||
|
# не поддержан) честно уронил job вместо зелёного прогона с непушнутым образом.
|
||||||
|
run: docker buildx imagetools inspect ${{ env.IMAGE_WORKER }}:${{ github.sha }} > /dev/null
|
||||||
|
|
||||||
- name: Убрать buildx-билдер (#2869 — иначе копятся по одному на прогон)
|
- name: Убрать buildx-билдер (#2869 — иначе копятся по одному на прогон)
|
||||||
# setup-buildx-action создаёт билдер `docker-container` на КАЖДЫЙ прогон.
|
# setup-buildx-action создаёт билдер `docker-container` на КАЖДЫЙ прогон.
|
||||||
# Его post-step под Forgejo act_runner не срабатывает, поэтому к 13.08 на
|
# Его post-step под Forgejo act_runner не срабатывает, поэтому к 13.08 на
|
||||||
|
|
@ -275,6 +337,10 @@ jobs:
|
||||||
id: buildx
|
id: buildx
|
||||||
|
|
||||||
- name: Build & push frontend
|
- name: Build & push frontend
|
||||||
|
# id + continue-on-error — см. build-backend выше (#2841): битый blob в
|
||||||
|
# удалённом buildcache не должен ронять сборку и молча пропускать деплой.
|
||||||
|
id: build
|
||||||
|
continue-on-error: true
|
||||||
uses: docker/build-push-action@v6
|
uses: docker/build-push-action@v6
|
||||||
with:
|
with:
|
||||||
context: ./frontend
|
context: ./frontend
|
||||||
|
|
@ -288,6 +354,30 @@ jobs:
|
||||||
${{ env.IMAGE_FRONTEND }}:latest
|
${{ env.IMAGE_FRONTEND }}:latest
|
||||||
${{ env.IMAGE_FRONTEND }}:${{ github.sha }}
|
${{ env.IMAGE_FRONTEND }}:${{ github.sha }}
|
||||||
|
|
||||||
|
- name: Retry build & push frontend без кеша (битый buildcache, #2841)
|
||||||
|
# См. backend (issue #2, ревью R2): cache-from опущен, cache-to ОСТАВЛЕН —
|
||||||
|
# успешный ретрай перезаписывает битый buildcache-тег своими слоями
|
||||||
|
# (mode=max), это и есть самолечение. Без cache-to здесь порча оставалась
|
||||||
|
# навсегда — следующий прогон снова падал на том же cache-from.
|
||||||
|
if: steps.build.outcome == 'failure'
|
||||||
|
uses: docker/build-push-action@v6
|
||||||
|
with:
|
||||||
|
context: ./frontend
|
||||||
|
push: true
|
||||||
|
build-args: |
|
||||||
|
NEXT_PUBLIC_GLITCHTIP_DSN=${{ secrets.GLITCHTIP_FRONTEND_DSN }}
|
||||||
|
NEXT_PUBLIC_ENVIRONMENT=production
|
||||||
|
cache-to: type=registry,ref=${{ env.IMAGE_FRONTEND }}:buildcache,mode=max
|
||||||
|
tags: |
|
||||||
|
${{ env.IMAGE_FRONTEND }}:latest
|
||||||
|
${{ env.IMAGE_FRONTEND }}:${{ github.sha }}
|
||||||
|
|
||||||
|
- name: Проверить, что frontend:${{ github.sha }} реально в registry (fail-safe, #2841 R2)
|
||||||
|
# См. backend выше — не полагается на steps.build.outcome раннера, проверяет
|
||||||
|
# реальное состояние registry, чтобы молча пропущенный ретрай (если outcome
|
||||||
|
# не поддержан) честно уронил job вместо зелёного прогона с непушнутым образом.
|
||||||
|
run: docker buildx imagetools inspect ${{ env.IMAGE_FRONTEND }}:${{ github.sha }} > /dev/null
|
||||||
|
|
||||||
- name: Убрать buildx-билдер (#2869 — иначе копятся по одному на прогон)
|
- name: Убрать buildx-билдер (#2869 — иначе копятся по одному на прогон)
|
||||||
# setup-buildx-action создаёт билдер `docker-container` на КАЖДЫЙ прогон.
|
# setup-buildx-action создаёт билдер `docker-container` на КАЖДЫЙ прогон.
|
||||||
# Его post-step под Forgejo act_runner не срабатывает, поэтому к 13.08 на
|
# Его post-step под Forgejo act_runner не срабатывает, поэтому к 13.08 на
|
||||||
|
|
@ -622,8 +712,50 @@ jobs:
|
||||||
docker image prune -af || true
|
docker image prune -af || true
|
||||||
docker builder prune -af || true
|
docker builder prune -af || true
|
||||||
|
|
||||||
# Health check
|
# Health check — деплой ВАЛИТСЯ, если backend не поднялся (см. #2214,
|
||||||
|
# уже сделано так в deploy-tradein.yml; ревью #2841 R2 issue #3).
|
||||||
|
# `curl ... && break` под set -e НЕ мог провалить скрипт: curl — не
|
||||||
|
# последняя команда &&-списка, а POSIX прямо освобождает от errexit
|
||||||
|
# все команды AND/OR-списка кроме последней. После 30 неуспешных
|
||||||
|
# попыток цикл завершался кодом последнего sleep (0) — скрипт тихо
|
||||||
|
# продолжался, деплой уходил success с мёртвым бэкендом.
|
||||||
|
healthy=""
|
||||||
for i in $(seq 1 30); do
|
for i in $(seq 1 30); do
|
||||||
curl -fsS http://localhost:8000/health && break
|
if curl -fsS http://localhost:8000/health >/dev/null 2>&1; then
|
||||||
|
healthy="yes"; break
|
||||||
|
fi
|
||||||
sleep 1
|
sleep 1
|
||||||
done
|
done
|
||||||
|
if [ -z "$healthy" ]; then
|
||||||
|
echo "ERROR: backend не ответил на /health за 30s — деплой FAILED"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "→ backend healthy на /health."
|
||||||
|
|
||||||
|
# Честный итог прогона (#2841). ПРОБЛЕМА: `deploy` пропускается своим `if:`
|
||||||
|
# молча (result=skipped), когда build падает (например, битый blob в
|
||||||
|
# buildcache роняет `docker/build-push-action` — до ретрая выше, #2841).
|
||||||
|
# skipped-job НЕ красит прогон явным «FAILED» так, чтобы это было видно на
|
||||||
|
# первый взгляд — итог выглядит зелёным/нейтральным, хотя прод не обновился.
|
||||||
|
# Эта job бежит ВСЕГДА (`if: always()`, кроме отмены прогона) и сама падает,
|
||||||
|
# если deploy не завершился success — неважно, пропущен он (build упал) или
|
||||||
|
# упал сам (SSH/миграция/health-check). Красная точка встаёт именно там, где
|
||||||
|
# решение реально принято, а не там, где она случайно оказалась по цепочке if.
|
||||||
|
deploy-status:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs: [build-backend, build-worker, build-frontend, deploy]
|
||||||
|
if: always() && !cancelled()
|
||||||
|
steps:
|
||||||
|
- name: Итог прогона — деплой обязан быть success, не skipped/failure
|
||||||
|
run: |
|
||||||
|
echo "build-backend: ${{ needs.build-backend.result }}"
|
||||||
|
echo "build-worker: ${{ needs.build-worker.result }}"
|
||||||
|
echo "build-frontend: ${{ needs.build-frontend.result }}"
|
||||||
|
echo "deploy: ${{ needs.deploy.result }}"
|
||||||
|
if [ "${{ needs.deploy.result }}" != "success" ]; then
|
||||||
|
echo "::error::деплой НЕ прошёл (deploy.result=${{ needs.deploy.result }})." \
|
||||||
|
"Прогон должен читаться как FAILED, а не как пропущенный шаг (#2841)." \
|
||||||
|
"Смотри логи build-backend/build-worker/build-frontend/deploy выше."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "✓ деплой прошёл успешно"
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue