У GitHub внутри компании больше 14 000 репозиториев. На начало 2025 года около 11 000 из них не были заархивированы — и у большинства не было владельца. С сервисными репозиториями проблем не было: они привязаны к Service Catalog. А вот документация, внутренние инструменты, личные эксперименты и репозитории команд висели в воздухе. Это сломалось, когда понадобилось массово чистить утёкшие секреты: техподдержка могла отозвать токен, но без понятия, кого дёргать, это было рискованно.
Решили проблему радикально. Ввели два custom properties для каждого репозитория: ownership-type (три варианта: «Service Catalog», «Hubber Handle» или «Team») и ownership-name (текстовое поле с проверками через GitHub API). Service Catalog заполнили автоматом для 1500 сервисных репозиториев. Всё остальное пришлось чистить вручную.
Запустили GitHub App на Kubernetes CronJob. Первый прогон назначили на субботу, надеясь, что никто не заметит. Ошиблись — в глобальной компании кто-то онлайн всегда. На репозитории посыпались issues с предупреждением об архивации через 30 дней. После льготного периода заархивировали всё, где не поставили владельца. Архивация обратима — репозиторий становится read-only, GitHub Actions не работают, но данные не удаляются. После зачистки таймер сократили до часа.
Было два инцидента. Первый: заархивированный репозиторий сломал Datadog-мониторинг, который создавал в нём issues — пейджер получила соседняя команда. Пофиксили: теперь на ownership issues @-упоминаются администраторы и все с правом записи. Второй: если Service Catalog отдаёт устаревшие или битые данные, можно массово архивировать живые репозитории. Поставили защиту — low water mark. Если за один прогон CronJob собирается архивировать больше порога, он отменяет всё и включает Datadog-монитор.
Итог: осталось около 3000 активных репозиториев, заархивировано 11 000 (изначально было 3000). Всё заняло 45 дней. В архиве — забытые прототипы аж с 2008 года. Теперь ownership обязателен при создании репозитория, а потеря владельца фиксируется за час. Тип владения определяет устойчивость: личные аккаунты уходят с увольнением сотрудника, команды проверяются на минимальный состав, сервисы живут по жизненному циклу.
Главный совет от GitHub: не запускайте первый прогон в субботу. И стройте защиту от косых данных сразу — не наступайте на те же грабли.