Compare commits
No commits in common. "8aacd1385eb5c3cf3cb527f13817512cb59f23d5" and "ef6813d6706d08c67a6ffa2efbaddb764fd5a0e3" have entirely different histories.
8aacd1385e
...
ef6813d670
3 changed files with 2 additions and 316 deletions
|
|
@ -246,34 +246,20 @@ jobs:
|
||||||
# если переменная пустая/файла нет, печатаем в обычный лог (fallback).
|
# если переменная пустая/файла нет, печатаем в обычный лог (fallback).
|
||||||
if: always()
|
if: always()
|
||||||
run: |
|
run: |
|
||||||
echo "### шаг «Coverage summary» начался"
|
|
||||||
[ -f coverage.xml ] || { echo "coverage.xml отсутствует — пропускаю summary"; exit 0; }
|
[ -f coverage.xml ] || { echo "coverage.xml отсутствует — пропускаю summary"; exit 0; }
|
||||||
# NB (#2871): `coverage report` уважает fail_under из pyproject и выходит с
|
report="$(uv run coverage report --skip-covered --sort=cover | tail -40)"
|
||||||
# кодом 2, когда порог не набран, а `run:` идёт под `bash -eo pipefail` —
|
|
||||||
# то есть падение ЭТОГО шага гасит зелёный pytest и выглядит как «job упал
|
|
||||||
# неизвестно где». Разделяем вычисление и вывод, чтобы код возврата был виден.
|
|
||||||
# `|| cov_rc=$?`, а не отдельная строка: под `set -e` присваивание после
|
|
||||||
# упавшей команды просто не выполнится, и код возврата снова потеряется.
|
|
||||||
cov_rc=0
|
|
||||||
uv run coverage report --skip-covered --sort=cover > /tmp/cov_report.txt || cov_rc=$?
|
|
||||||
echo "### coverage report вернул код $cov_rc"
|
|
||||||
report="$(tail -40 /tmp/cov_report.txt)"
|
|
||||||
if [ -n "${GITHUB_STEP_SUMMARY:-}" ]; then
|
if [ -n "${GITHUB_STEP_SUMMARY:-}" ]; then
|
||||||
{ echo '```'; echo "$report"; echo '```'; } >> "$GITHUB_STEP_SUMMARY"
|
{ echo '```'; echo "$report"; echo '```'; } >> "$GITHUB_STEP_SUMMARY"
|
||||||
else
|
else
|
||||||
echo "$report"
|
echo "$report"
|
||||||
fi
|
fi
|
||||||
echo "### шаг «Coverage summary» закончился успешно"
|
|
||||||
|
|
||||||
- name: Снести тестовый Postgres
|
- name: Снести тестовый Postgres
|
||||||
# if: always() — контейнер уходит и когда сьют красный, и когда прогон
|
# if: always() — контейнер уходит и когда сьют красный, и когда прогон
|
||||||
# отменён concurrency-группой. Иначе на раннере копятся мёртвые контейнеры.
|
# отменён concurrency-группой. Иначе на раннере копятся мёртвые контейнеры.
|
||||||
if: always()
|
if: always()
|
||||||
working-directory: .
|
working-directory: .
|
||||||
run: |
|
run: docker rm -f "$CI_PG" >/dev/null 2>&1 || true
|
||||||
echo "### шаг «Снести тестовый Postgres» начался (CI_PG=${CI_PG:-<пусто>})"
|
|
||||||
docker rm -f "$CI_PG" >/dev/null 2>&1 || true
|
|
||||||
echo "### шаг «Снести тестовый Postgres» закончился успешно"
|
|
||||||
|
|
||||||
frontend-tests:
|
frontend-tests:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
|
||||||
|
|
@ -227,41 +227,8 @@ jobs:
|
||||||
run: |
|
run: |
|
||||||
echo "$GHCR_PAT" | docker login ghcr.io -u lekss361 --password-stdin
|
echo "$GHCR_PAT" | docker login ghcr.io -u lekss361 --password-stdin
|
||||||
|
|
||||||
- name: Подобрать протёкшие buildx-билдеры (#2869)
|
|
||||||
# Билдеры протекают НЕ на обычном падении, а когда job умирает аварийно
|
|
||||||
# (ENOSPC, OOM, отмена concurrency-группой): тогда ни post-step действия,
|
|
||||||
# ни завершающий шаг не выполняются — контейнер job'а уже мёртв.
|
|
||||||
# Замер 13.08: 20 висящих билдеров, созданных в 8 дат за три месяца
|
|
||||||
# (17.05, 30.05, 31.05, 13.06, 17.06, 20.06, 28.06, 05.07) — и ни одного
|
|
||||||
# за пять недель между 05.07 и 13.08, когда аварий не было. Два последних
|
|
||||||
# созданы 13.08 11:57:43 — ровно тот прогон, что упал с
|
|
||||||
# `no space left on device`.
|
|
||||||
# Поэтому чистим ЧУЖОЙ мусор НА ВХОДЕ: всё старше 6 часов заведомо не
|
|
||||||
# принадлежит живому прогону (самый долгий job — ~17 минут).
|
|
||||||
run: |
|
|
||||||
now=$(date +%s); reaped=0; kept=0
|
|
||||||
for c in $(docker ps -a --filter "name=^buildx_buildkit_builder-" --format '{{.Names}}'); do
|
|
||||||
created=$(docker inspect "$c" --format '{{.Created}}' 2>/dev/null) || continue
|
|
||||||
ts=$(date -d "$created" +%s 2>/dev/null) || continue
|
|
||||||
age_h=$(( (now - ts) / 3600 ))
|
|
||||||
if [ "$age_h" -ge 6 ]; then
|
|
||||||
echo "buildx: убираю протёкший билдер $c (возраст ${age_h} ч)"
|
|
||||||
if docker rm -f "$c" >/dev/null 2>&1; then
|
|
||||||
reaped=$((reaped+1))
|
|
||||||
else
|
|
||||||
echo "buildx: не удалось убрать $c (не фатально)"
|
|
||||||
fi
|
|
||||||
docker volume rm "${c}_state" >/dev/null 2>&1 || true
|
|
||||||
else
|
|
||||||
kept=$((kept+1))
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
echo "buildx: убрано протёкших ${reaped}, оставлено свежих ${kept}"
|
|
||||||
df -h / | tail -1
|
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@v3
|
uses: docker/setup-buildx-action@v3
|
||||||
id: buildx
|
|
||||||
|
|
||||||
- name: Build & push tradein-backend
|
- name: Build & push tradein-backend
|
||||||
uses: docker/build-push-action@v6
|
uses: docker/build-push-action@v6
|
||||||
|
|
@ -284,23 +251,6 @@ jobs:
|
||||||
${{ env.IMAGE_BACKEND }}:latest
|
${{ env.IMAGE_BACKEND }}:latest
|
||||||
${{ env.IMAGE_BACKEND }}:${{ github.sha }}
|
${{ env.IMAGE_BACKEND }}:${{ github.sha }}
|
||||||
|
|
||||||
- name: Убрать buildx-билдер (#2869 — иначе копятся по одному на прогон)
|
|
||||||
# setup-buildx-action создаёт билдер `docker-container` на КАЖДЫЙ прогон.
|
|
||||||
# Его post-step под Forgejo act_runner не срабатывает, поэтому к 13.08 на
|
|
||||||
# хосте накопилось 20 контейнеров возрастом до двух месяцев и ~19 ГБ в
|
|
||||||
# их `_state`-томах — диск ушёл на 94%, деплой упал с
|
|
||||||
# `no space left on device`. Убираем явно, `if: always()` и `|| true`,
|
|
||||||
# чтобы уборка не могла уронить прогон.
|
|
||||||
if: always()
|
|
||||||
run: |
|
|
||||||
name="${{ steps.buildx.outputs.name }}"
|
|
||||||
if [ -z "$name" ]; then
|
|
||||||
echo "buildx: имя билдера не пришло из outputs — уборка НЕ сработала (см. #2869)"
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
echo "buildx: убираю билдер $name"
|
|
||||||
docker buildx rm --force "$name" || echo "buildx: не удалось убрать $name (не фатально)"
|
|
||||||
|
|
||||||
build-frontend:
|
build-frontend:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: changes
|
needs: changes
|
||||||
|
|
@ -317,41 +267,8 @@ jobs:
|
||||||
run: |
|
run: |
|
||||||
echo "$GHCR_PAT" | docker login ghcr.io -u lekss361 --password-stdin
|
echo "$GHCR_PAT" | docker login ghcr.io -u lekss361 --password-stdin
|
||||||
|
|
||||||
- name: Подобрать протёкшие buildx-билдеры (#2869)
|
|
||||||
# Билдеры протекают НЕ на обычном падении, а когда job умирает аварийно
|
|
||||||
# (ENOSPC, OOM, отмена concurrency-группой): тогда ни post-step действия,
|
|
||||||
# ни завершающий шаг не выполняются — контейнер job'а уже мёртв.
|
|
||||||
# Замер 13.08: 20 висящих билдеров, созданных в 8 дат за три месяца
|
|
||||||
# (17.05, 30.05, 31.05, 13.06, 17.06, 20.06, 28.06, 05.07) — и ни одного
|
|
||||||
# за пять недель между 05.07 и 13.08, когда аварий не было. Два последних
|
|
||||||
# созданы 13.08 11:57:43 — ровно тот прогон, что упал с
|
|
||||||
# `no space left on device`.
|
|
||||||
# Поэтому чистим ЧУЖОЙ мусор НА ВХОДЕ: всё старше 6 часов заведомо не
|
|
||||||
# принадлежит живому прогону (самый долгий job — ~17 минут).
|
|
||||||
run: |
|
|
||||||
now=$(date +%s); reaped=0; kept=0
|
|
||||||
for c in $(docker ps -a --filter "name=^buildx_buildkit_builder-" --format '{{.Names}}'); do
|
|
||||||
created=$(docker inspect "$c" --format '{{.Created}}' 2>/dev/null) || continue
|
|
||||||
ts=$(date -d "$created" +%s 2>/dev/null) || continue
|
|
||||||
age_h=$(( (now - ts) / 3600 ))
|
|
||||||
if [ "$age_h" -ge 6 ]; then
|
|
||||||
echo "buildx: убираю протёкший билдер $c (возраст ${age_h} ч)"
|
|
||||||
if docker rm -f "$c" >/dev/null 2>&1; then
|
|
||||||
reaped=$((reaped+1))
|
|
||||||
else
|
|
||||||
echo "buildx: не удалось убрать $c (не фатально)"
|
|
||||||
fi
|
|
||||||
docker volume rm "${c}_state" >/dev/null 2>&1 || true
|
|
||||||
else
|
|
||||||
kept=$((kept+1))
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
echo "buildx: убрано протёкших ${reaped}, оставлено свежих ${kept}"
|
|
||||||
df -h / | tail -1
|
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@v3
|
uses: docker/setup-buildx-action@v3
|
||||||
id: buildx
|
|
||||||
|
|
||||||
# CHANGELOG.md живёт в tradein-mvp/, ОДИН уровень выше build context
|
# CHANGELOG.md живёт в tradein-mvp/, ОДИН уровень выше build context
|
||||||
# (./tradein-mvp/frontend) — Docker не пускает COPY за пределы контекста,
|
# (./tradein-mvp/frontend) — Docker не пускает COPY за пределы контекста,
|
||||||
|
|
@ -386,23 +303,6 @@ jobs:
|
||||||
${{ env.IMAGE_FRONTEND }}:latest
|
${{ env.IMAGE_FRONTEND }}:latest
|
||||||
${{ env.IMAGE_FRONTEND }}:${{ github.sha }}
|
${{ env.IMAGE_FRONTEND }}:${{ github.sha }}
|
||||||
|
|
||||||
- name: Убрать buildx-билдер (#2869 — иначе копятся по одному на прогон)
|
|
||||||
# setup-buildx-action создаёт билдер `docker-container` на КАЖДЫЙ прогон.
|
|
||||||
# Его post-step под Forgejo act_runner не срабатывает, поэтому к 13.08 на
|
|
||||||
# хосте накопилось 20 контейнеров возрастом до двух месяцев и ~19 ГБ в
|
|
||||||
# их `_state`-томах — диск ушёл на 94%, деплой упал с
|
|
||||||
# `no space left on device`. Убираем явно, `if: always()` и `|| true`,
|
|
||||||
# чтобы уборка не могла уронить прогон.
|
|
||||||
if: always()
|
|
||||||
run: |
|
|
||||||
name="${{ steps.buildx.outputs.name }}"
|
|
||||||
if [ -z "$name" ]; then
|
|
||||||
echo "buildx: имя билдера не пришло из outputs — уборка НЕ сработала (см. #2869)"
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
echo "buildx: убираю билдер $name"
|
|
||||||
docker buildx rm --force "$name" || echo "buildx: не удалось убрать $name (не фатально)"
|
|
||||||
|
|
||||||
build-browser:
|
build-browser:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: changes
|
needs: changes
|
||||||
|
|
@ -421,41 +321,8 @@ jobs:
|
||||||
run: |
|
run: |
|
||||||
echo "$GHCR_PAT" | docker login ghcr.io -u lekss361 --password-stdin
|
echo "$GHCR_PAT" | docker login ghcr.io -u lekss361 --password-stdin
|
||||||
|
|
||||||
- name: Подобрать протёкшие buildx-билдеры (#2869)
|
|
||||||
# Билдеры протекают НЕ на обычном падении, а когда job умирает аварийно
|
|
||||||
# (ENOSPC, OOM, отмена concurrency-группой): тогда ни post-step действия,
|
|
||||||
# ни завершающий шаг не выполняются — контейнер job'а уже мёртв.
|
|
||||||
# Замер 13.08: 20 висящих билдеров, созданных в 8 дат за три месяца
|
|
||||||
# (17.05, 30.05, 31.05, 13.06, 17.06, 20.06, 28.06, 05.07) — и ни одного
|
|
||||||
# за пять недель между 05.07 и 13.08, когда аварий не было. Два последних
|
|
||||||
# созданы 13.08 11:57:43 — ровно тот прогон, что упал с
|
|
||||||
# `no space left on device`.
|
|
||||||
# Поэтому чистим ЧУЖОЙ мусор НА ВХОДЕ: всё старше 6 часов заведомо не
|
|
||||||
# принадлежит живому прогону (самый долгий job — ~17 минут).
|
|
||||||
run: |
|
|
||||||
now=$(date +%s); reaped=0; kept=0
|
|
||||||
for c in $(docker ps -a --filter "name=^buildx_buildkit_builder-" --format '{{.Names}}'); do
|
|
||||||
created=$(docker inspect "$c" --format '{{.Created}}' 2>/dev/null) || continue
|
|
||||||
ts=$(date -d "$created" +%s 2>/dev/null) || continue
|
|
||||||
age_h=$(( (now - ts) / 3600 ))
|
|
||||||
if [ "$age_h" -ge 6 ]; then
|
|
||||||
echo "buildx: убираю протёкший билдер $c (возраст ${age_h} ч)"
|
|
||||||
if docker rm -f "$c" >/dev/null 2>&1; then
|
|
||||||
reaped=$((reaped+1))
|
|
||||||
else
|
|
||||||
echo "buildx: не удалось убрать $c (не фатально)"
|
|
||||||
fi
|
|
||||||
docker volume rm "${c}_state" >/dev/null 2>&1 || true
|
|
||||||
else
|
|
||||||
kept=$((kept+1))
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
echo "buildx: убрано протёкших ${reaped}, оставлено свежих ${kept}"
|
|
||||||
df -h / | tail -1
|
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@v3
|
uses: docker/setup-buildx-action@v3
|
||||||
id: buildx
|
|
||||||
|
|
||||||
- name: Build & push tradein-browser
|
- name: Build & push tradein-browser
|
||||||
uses: docker/build-push-action@v6
|
uses: docker/build-push-action@v6
|
||||||
|
|
@ -468,23 +335,6 @@ jobs:
|
||||||
${{ env.IMAGE_BROWSER }}:latest
|
${{ env.IMAGE_BROWSER }}:latest
|
||||||
${{ env.IMAGE_BROWSER }}:${{ github.sha }}
|
${{ env.IMAGE_BROWSER }}:${{ github.sha }}
|
||||||
|
|
||||||
- name: Убрать buildx-билдер (#2869 — иначе копятся по одному на прогон)
|
|
||||||
# setup-buildx-action создаёт билдер `docker-container` на КАЖДЫЙ прогон.
|
|
||||||
# Его post-step под Forgejo act_runner не срабатывает, поэтому к 13.08 на
|
|
||||||
# хосте накопилось 20 контейнеров возрастом до двух месяцев и ~19 ГБ в
|
|
||||||
# их `_state`-томах — диск ушёл на 94%, деплой упал с
|
|
||||||
# `no space left on device`. Убираем явно, `if: always()` и `|| true`,
|
|
||||||
# чтобы уборка не могла уронить прогон.
|
|
||||||
if: always()
|
|
||||||
run: |
|
|
||||||
name="${{ steps.buildx.outputs.name }}"
|
|
||||||
if [ -z "$name" ]; then
|
|
||||||
echo "buildx: имя билдера не пришло из outputs — уборка НЕ сработала (см. #2869)"
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
echo "buildx: убираю билдер $name"
|
|
||||||
docker buildx rm --force "$name" || echo "buildx: не удалось убрать $name (не фатально)"
|
|
||||||
|
|
||||||
deploy:
|
deploy:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: [changes, test, build-backend, build-frontend, build-browser]
|
needs: [changes, test, build-backend, build-frontend, build-browser]
|
||||||
|
|
|
||||||
|
|
@ -71,41 +71,8 @@ jobs:
|
||||||
run: |
|
run: |
|
||||||
echo "$GHCR_PAT" | docker login ghcr.io -u lekss361 --password-stdin
|
echo "$GHCR_PAT" | docker login ghcr.io -u lekss361 --password-stdin
|
||||||
|
|
||||||
- name: Подобрать протёкшие buildx-билдеры (#2869)
|
|
||||||
# Билдеры протекают НЕ на обычном падении, а когда job умирает аварийно
|
|
||||||
# (ENOSPC, OOM, отмена concurrency-группой): тогда ни post-step действия,
|
|
||||||
# ни завершающий шаг не выполняются — контейнер job'а уже мёртв.
|
|
||||||
# Замер 13.08: 20 висящих билдеров, созданных в 8 дат за три месяца
|
|
||||||
# (17.05, 30.05, 31.05, 13.06, 17.06, 20.06, 28.06, 05.07) — и ни одного
|
|
||||||
# за пять недель между 05.07 и 13.08, когда аварий не было. Два последних
|
|
||||||
# созданы 13.08 11:57:43 — ровно тот прогон, что упал с
|
|
||||||
# `no space left on device`.
|
|
||||||
# Поэтому чистим ЧУЖОЙ мусор НА ВХОДЕ: всё старше 6 часов заведомо не
|
|
||||||
# принадлежит живому прогону (самый долгий job — ~17 минут).
|
|
||||||
run: |
|
|
||||||
now=$(date +%s); reaped=0; kept=0
|
|
||||||
for c in $(docker ps -a --filter "name=^buildx_buildkit_builder-" --format '{{.Names}}'); do
|
|
||||||
created=$(docker inspect "$c" --format '{{.Created}}' 2>/dev/null) || continue
|
|
||||||
ts=$(date -d "$created" +%s 2>/dev/null) || continue
|
|
||||||
age_h=$(( (now - ts) / 3600 ))
|
|
||||||
if [ "$age_h" -ge 6 ]; then
|
|
||||||
echo "buildx: убираю протёкший билдер $c (возраст ${age_h} ч)"
|
|
||||||
if docker rm -f "$c" >/dev/null 2>&1; then
|
|
||||||
reaped=$((reaped+1))
|
|
||||||
else
|
|
||||||
echo "buildx: не удалось убрать $c (не фатально)"
|
|
||||||
fi
|
|
||||||
docker volume rm "${c}_state" >/dev/null 2>&1 || true
|
|
||||||
else
|
|
||||||
kept=$((kept+1))
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
echo "buildx: убрано протёкших ${reaped}, оставлено свежих ${kept}"
|
|
||||||
df -h / | tail -1
|
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@v3
|
uses: docker/setup-buildx-action@v3
|
||||||
id: buildx
|
|
||||||
|
|
||||||
- name: Build & push backend (lean — без Chromium)
|
- name: Build & push backend (lean — без Chromium)
|
||||||
uses: docker/build-push-action@v6
|
uses: docker/build-push-action@v6
|
||||||
|
|
@ -119,23 +86,6 @@ jobs:
|
||||||
${{ env.IMAGE_BACKEND }}:latest
|
${{ env.IMAGE_BACKEND }}:latest
|
||||||
${{ env.IMAGE_BACKEND }}:${{ github.sha }}
|
${{ env.IMAGE_BACKEND }}:${{ github.sha }}
|
||||||
|
|
||||||
- name: Убрать buildx-билдер (#2869 — иначе копятся по одному на прогон)
|
|
||||||
# setup-buildx-action создаёт билдер `docker-container` на КАЖДЫЙ прогон.
|
|
||||||
# Его post-step под Forgejo act_runner не срабатывает, поэтому к 13.08 на
|
|
||||||
# хосте накопилось 20 контейнеров возрастом до двух месяцев и ~19 ГБ в
|
|
||||||
# их `_state`-томах — диск ушёл на 94%, деплой упал с
|
|
||||||
# `no space left on device`. Убираем явно, `if: always()` и `|| true`,
|
|
||||||
# чтобы уборка не могла уронить прогон.
|
|
||||||
if: always()
|
|
||||||
run: |
|
|
||||||
name="${{ steps.buildx.outputs.name }}"
|
|
||||||
if [ -z "$name" ]; then
|
|
||||||
echo "buildx: имя билдера не пришло из outputs — уборка НЕ сработала (см. #2869)"
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
echo "buildx: убираю билдер $name"
|
|
||||||
docker buildx rm --force "$name" || echo "buildx: не удалось убрать $name (не фатально)"
|
|
||||||
|
|
||||||
build-worker:
|
build-worker:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: changes
|
needs: changes
|
||||||
|
|
@ -152,41 +102,8 @@ jobs:
|
||||||
run: |
|
run: |
|
||||||
echo "$GHCR_PAT" | docker login ghcr.io -u lekss361 --password-stdin
|
echo "$GHCR_PAT" | docker login ghcr.io -u lekss361 --password-stdin
|
||||||
|
|
||||||
- name: Подобрать протёкшие buildx-билдеры (#2869)
|
|
||||||
# Билдеры протекают НЕ на обычном падении, а когда job умирает аварийно
|
|
||||||
# (ENOSPC, OOM, отмена concurrency-группой): тогда ни post-step действия,
|
|
||||||
# ни завершающий шаг не выполняются — контейнер job'а уже мёртв.
|
|
||||||
# Замер 13.08: 20 висящих билдеров, созданных в 8 дат за три месяца
|
|
||||||
# (17.05, 30.05, 31.05, 13.06, 17.06, 20.06, 28.06, 05.07) — и ни одного
|
|
||||||
# за пять недель между 05.07 и 13.08, когда аварий не было. Два последних
|
|
||||||
# созданы 13.08 11:57:43 — ровно тот прогон, что упал с
|
|
||||||
# `no space left on device`.
|
|
||||||
# Поэтому чистим ЧУЖОЙ мусор НА ВХОДЕ: всё старше 6 часов заведомо не
|
|
||||||
# принадлежит живому прогону (самый долгий job — ~17 минут).
|
|
||||||
run: |
|
|
||||||
now=$(date +%s); reaped=0; kept=0
|
|
||||||
for c in $(docker ps -a --filter "name=^buildx_buildkit_builder-" --format '{{.Names}}'); do
|
|
||||||
created=$(docker inspect "$c" --format '{{.Created}}' 2>/dev/null) || continue
|
|
||||||
ts=$(date -d "$created" +%s 2>/dev/null) || continue
|
|
||||||
age_h=$(( (now - ts) / 3600 ))
|
|
||||||
if [ "$age_h" -ge 6 ]; then
|
|
||||||
echo "buildx: убираю протёкший билдер $c (возраст ${age_h} ч)"
|
|
||||||
if docker rm -f "$c" >/dev/null 2>&1; then
|
|
||||||
reaped=$((reaped+1))
|
|
||||||
else
|
|
||||||
echo "buildx: не удалось убрать $c (не фатально)"
|
|
||||||
fi
|
|
||||||
docker volume rm "${c}_state" >/dev/null 2>&1 || true
|
|
||||||
else
|
|
||||||
kept=$((kept+1))
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
echo "buildx: убрано протёкших ${reaped}, оставлено свежих ${kept}"
|
|
||||||
df -h / | tail -1
|
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@v3
|
uses: docker/setup-buildx-action@v3
|
||||||
id: buildx
|
|
||||||
|
|
||||||
- name: Build & push worker (с Chromium для Playwright)
|
- name: Build & push worker (с Chromium для Playwright)
|
||||||
uses: docker/build-push-action@v6
|
uses: docker/build-push-action@v6
|
||||||
|
|
@ -200,23 +117,6 @@ jobs:
|
||||||
${{ env.IMAGE_WORKER }}:latest
|
${{ env.IMAGE_WORKER }}:latest
|
||||||
${{ env.IMAGE_WORKER }}:${{ github.sha }}
|
${{ env.IMAGE_WORKER }}:${{ github.sha }}
|
||||||
|
|
||||||
- name: Убрать buildx-билдер (#2869 — иначе копятся по одному на прогон)
|
|
||||||
# setup-buildx-action создаёт билдер `docker-container` на КАЖДЫЙ прогон.
|
|
||||||
# Его post-step под Forgejo act_runner не срабатывает, поэтому к 13.08 на
|
|
||||||
# хосте накопилось 20 контейнеров возрастом до двух месяцев и ~19 ГБ в
|
|
||||||
# их `_state`-томах — диск ушёл на 94%, деплой упал с
|
|
||||||
# `no space left on device`. Убираем явно, `if: always()` и `|| true`,
|
|
||||||
# чтобы уборка не могла уронить прогон.
|
|
||||||
if: always()
|
|
||||||
run: |
|
|
||||||
name="${{ steps.buildx.outputs.name }}"
|
|
||||||
if [ -z "$name" ]; then
|
|
||||||
echo "buildx: имя билдера не пришло из outputs — уборка НЕ сработала (см. #2869)"
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
echo "buildx: убираю билдер $name"
|
|
||||||
docker buildx rm --force "$name" || echo "buildx: не удалось убрать $name (не фатально)"
|
|
||||||
|
|
||||||
build-frontend:
|
build-frontend:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: changes
|
needs: changes
|
||||||
|
|
@ -233,41 +133,8 @@ jobs:
|
||||||
run: |
|
run: |
|
||||||
echo "$GHCR_PAT" | docker login ghcr.io -u lekss361 --password-stdin
|
echo "$GHCR_PAT" | docker login ghcr.io -u lekss361 --password-stdin
|
||||||
|
|
||||||
- name: Подобрать протёкшие buildx-билдеры (#2869)
|
|
||||||
# Билдеры протекают НЕ на обычном падении, а когда job умирает аварийно
|
|
||||||
# (ENOSPC, OOM, отмена concurrency-группой): тогда ни post-step действия,
|
|
||||||
# ни завершающий шаг не выполняются — контейнер job'а уже мёртв.
|
|
||||||
# Замер 13.08: 20 висящих билдеров, созданных в 8 дат за три месяца
|
|
||||||
# (17.05, 30.05, 31.05, 13.06, 17.06, 20.06, 28.06, 05.07) — и ни одного
|
|
||||||
# за пять недель между 05.07 и 13.08, когда аварий не было. Два последних
|
|
||||||
# созданы 13.08 11:57:43 — ровно тот прогон, что упал с
|
|
||||||
# `no space left on device`.
|
|
||||||
# Поэтому чистим ЧУЖОЙ мусор НА ВХОДЕ: всё старше 6 часов заведомо не
|
|
||||||
# принадлежит живому прогону (самый долгий job — ~17 минут).
|
|
||||||
run: |
|
|
||||||
now=$(date +%s); reaped=0; kept=0
|
|
||||||
for c in $(docker ps -a --filter "name=^buildx_buildkit_builder-" --format '{{.Names}}'); do
|
|
||||||
created=$(docker inspect "$c" --format '{{.Created}}' 2>/dev/null) || continue
|
|
||||||
ts=$(date -d "$created" +%s 2>/dev/null) || continue
|
|
||||||
age_h=$(( (now - ts) / 3600 ))
|
|
||||||
if [ "$age_h" -ge 6 ]; then
|
|
||||||
echo "buildx: убираю протёкший билдер $c (возраст ${age_h} ч)"
|
|
||||||
if docker rm -f "$c" >/dev/null 2>&1; then
|
|
||||||
reaped=$((reaped+1))
|
|
||||||
else
|
|
||||||
echo "buildx: не удалось убрать $c (не фатально)"
|
|
||||||
fi
|
|
||||||
docker volume rm "${c}_state" >/dev/null 2>&1 || true
|
|
||||||
else
|
|
||||||
kept=$((kept+1))
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
echo "buildx: убрано протёкших ${reaped}, оставлено свежих ${kept}"
|
|
||||||
df -h / | tail -1
|
|
||||||
|
|
||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@v3
|
uses: docker/setup-buildx-action@v3
|
||||||
id: buildx
|
|
||||||
|
|
||||||
- name: Build & push frontend
|
- name: Build & push frontend
|
||||||
uses: docker/build-push-action@v6
|
uses: docker/build-push-action@v6
|
||||||
|
|
@ -283,23 +150,6 @@ jobs:
|
||||||
${{ env.IMAGE_FRONTEND }}:latest
|
${{ env.IMAGE_FRONTEND }}:latest
|
||||||
${{ env.IMAGE_FRONTEND }}:${{ github.sha }}
|
${{ env.IMAGE_FRONTEND }}:${{ github.sha }}
|
||||||
|
|
||||||
- name: Убрать buildx-билдер (#2869 — иначе копятся по одному на прогон)
|
|
||||||
# setup-buildx-action создаёт билдер `docker-container` на КАЖДЫЙ прогон.
|
|
||||||
# Его post-step под Forgejo act_runner не срабатывает, поэтому к 13.08 на
|
|
||||||
# хосте накопилось 20 контейнеров возрастом до двух месяцев и ~19 ГБ в
|
|
||||||
# их `_state`-томах — диск ушёл на 94%, деплой упал с
|
|
||||||
# `no space left on device`. Убираем явно, `if: always()` и `|| true`,
|
|
||||||
# чтобы уборка не могла уронить прогон.
|
|
||||||
if: always()
|
|
||||||
run: |
|
|
||||||
name="${{ steps.buildx.outputs.name }}"
|
|
||||||
if [ -z "$name" ]; then
|
|
||||||
echo "buildx: имя билдера не пришло из outputs — уборка НЕ сработала (см. #2869)"
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
echo "buildx: убираю билдер $name"
|
|
||||||
docker buildx rm --force "$name" || echo "buildx: не удалось убрать $name (не фатально)"
|
|
||||||
|
|
||||||
deploy:
|
deploy:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: [changes, build-backend, build-worker, build-frontend]
|
needs: [changes, build-backend, build-worker, build-frontend]
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue