From 1b970c9b412e44ef6c83948ebeef68c8d84f4b74 Mon Sep 17 00:00:00 2001 From: h Date: Thu, 10 Sep 2026 16:23:01 +0200 Subject: [PATCH] =?UTF-8?q?chore(renovate):=20=D0=BA=D0=BE=D0=BD=D1=84?= =?UTF-8?q?=D0=B8=D0=B3=20Renovate=20=E2=80=94=20=D0=B4=D0=BE=D0=BA=D0=B5?= =?UTF-8?q?=D1=80=20=D1=81=D0=B0=D0=BC,=20=D0=B7=D0=B0=D0=B2=D0=B8=D1=81?= =?UTF-8?q?=D0=B8=D0=BC=D0=BE=D1=81=D1=82=D0=B8=20=D0=BA=D0=BE=D0=B4=D0=B0?= =?UTF-8?q?=20PR-=D0=B0=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- renovate.jsonc | 109 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 renovate.jsonc diff --git a/renovate.jsonc b/renovate.jsonc new file mode 100644 index 0000000..32e6384 --- /dev/null +++ b/renovate.jsonc @@ -0,0 +1,109 @@ +// Шаблон конфига Renovate для РЕПЫ ПРИЛОЖЕНИЯ (не для infra/komodo). +// +// Кладётся в корень репы проекта под именем renovate.jsonc. Файл одинаков +// для всех реп: ничего репо-специфичного здесь нет намеренно, отличия +// (ветки, область) живут в projects/personal/renovate/renovate-config.js. +// +// Схема целиком — docs/image-updates.md, раздел 7.1. +// +// ЧТО ЗДЕСЬ ПРОИСХОДИТ, В ДВУХ СТРОЧКАХ: +// образы из реестра -> выдержка трое суток -> автомёрдж -> вебхук проекта +// -> pre_deploy делает git pull --ff-only -> прод; +// зависимости кода -> один сгруппированный PR, автомёрджа НЕТ, ждёт человека. +// +// Про локально собираемые образы (`image: msos/backend` рядом с `build:`) +// думать не надо: менеджер docker-compose их не извлекает вообще. Проверено +// прогоном `--platform=local --dry-run=lookup` на минимальном примере — +// в выдаче остаётся только postgres, `msos/backend` даже не ищется в реестре. +{ + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "extends": ["config:recommended", ":dependencyDashboard"], + "timezone": "Europe/Warsaw", + + // Дайджест: тег в compose остаётся для читаемости, разворачивается всегда + // один и тот же образ. + "pinDigests": true, + + "minimumReleaseAge": "3 days", + "minimumReleaseAgeBehaviour": "timestamp-required", + "internalChecksFilter": "strict", + + "labels": ["renovate"], + "rebaseWhen": "behind-base-branch", + "platformAutomerge": true, + "automergeStrategy": "squash", + + // Потолки — как в infra/komodo и по той же арифметике: PR с меткой wait-3d + // живёт трое суток, значит открытых копится «создано за день × 3». + // Осторожно: сюда же попадают PR с зависимостями кода, а их никто не + // мёржит автоматически — они занимают место в prConcurrentLimit и могут + // вытеснить docker-обновления. Именно поэтому зависимости кода + // сгруппированы в ОДИН PR, а их мажоры не создают PR вовсе. + "prHourlyLimit": 8, + "prConcurrentLimit": 25, + + "packageRules": [ + { + "description": "Docker: патчи, миноры и дайджесты — молча в деплой-ветку.", + "matchDatasources": ["docker"], + "matchUpdateTypes": ["patch", "minor", "digest", "pinDigest"], + "automerge": true + }, + { + "description": "Docker: мажор руками. Аппрув в дашборде, PR не создаётся.", + "matchDatasources": ["docker"], + "matchUpdateTypes": ["major"], + "automerge": false, + "dependencyDashboardApproval": true + }, + { + "description": + "Базы: МАЖОР руками, отдельным предохранителем. postgres 17 -> 18 не стартует на старом data dir без pg_upgrade, и у этих стеков pre_deploy делает `docker compose up -d postgres && make migrate` — то есть автомёрдж мажора мигрировал бы уже пересозданную пустую базу. mongo и mariadb здесь по той же причине, timescaledb — расширение поверх postgres, у него ещё и своя процедура апгрейда.", + "matchPackageNames": [ + "postgres", "docker.io/library/postgres", + "postgis/postgis", + "redis", "docker.io/library/redis", + "mongo", "docker.io/library/mongo", + "mariadb", "docker.io/library/mariadb", + "timescale/timescaledb" + ], + "matchUpdateTypes": ["major"], + "automerge": false, + "dependencyDashboardApproval": true + }, + { + "description": + "Реестры без даты релиза: minimumReleaseAge на них неисполним (реестр не отдаёт timestamp). PR создаётся сразу, выдержка живёт на мёрдже — метка wait-3d и merge-aged-prs.py. См. docs/image-updates.md §2.2.", + "matchDatasources": ["docker"], + "matchPackageNames": ["ghcr.io/**", "lscr.io/**", "quay.io/**", "public.ecr.aws/**", "docker.elastic.co/**"], + "minimumReleaseAgeBehaviour": "timestamp-optional", + "automerge": false, + "addLabels": ["wait-3d"] + }, + { + "description": "Теги без версии (latest, stable, s6, ...) — то же самое: возраста у них нет даже на Docker Hub.", + "matchDatasources": ["docker"], + "matchCurrentValue": "/^(latest|stable|main|edge|main-stable|latest-full|s6|dind)$/", + "minimumReleaseAgeBehaviour": "timestamp-optional", + "automerge": false, + "addLabels": ["wait-3d"] + }, + { + "description": + "ЗАВИСИМОСТИ КОДА (npm, pip, go.mod, экшены и прочее не-docker): PR собираем, автомёрдж НЕ включаем — решение Бобра от 10.09.2026, первый заход без него, чтобы сначала посмотреть на объём. Сгруппированы в один PR намеренно: иначе они по одному займут весь prConcurrentLimit и вытеснят docker-обновления, а те как раз едут сами.", + "matchDatasources": ["!docker"], + "matchUpdateTypes": ["patch", "minor", "digest", "pinDigest"], + "groupName": "зависимости кода", + "automerge": false, + "addLabels": ["deps-code"] + }, + { + "description": + "Зависимости кода, МАЖОР: PR не создаём, показываем списком в дашборде. Иначе первый же прогон на большой репе выкатит десяток PR с ломающими изменениями, которые никто не смёржит. Захотим PR — убрать эту строчку с dependencyDashboardApproval.", + "matchDatasources": ["!docker"], + "matchUpdateTypes": ["major"], + "automerge": false, + "dependencyDashboardApproval": true + } + ] +}