Казалось бы, майская история с Docker hub должна была научить всех нас уделять больше времени на обеспечение целостности артефактов проекта, но на то мы и люди, чтобы учиться на своих (и чужих) ошибках не с первого раза. В этой статье я поведаю про настоящую историю, которая в этот раз не связана с образами, но связана с библиотеками.
Обыкновенный вторник второй половины октября, через час запланирован релиз в продакшн, ничего не предвещало, а ожидаемые заказчиком фичи уже протестированы вдоль и поперёк, ожидая своего часа.
В какой-то момент от коллег поступает информация о том, что официальная библиотека elasticsearch-php в момент сборки через composer install
перестала устанавливаться.
Ринувшись разбираться в вопросе, выясняем, что Github репозиторий удален и теперь там красивая ошибка 404.
Как же так? Что произошло? Вот так просто удалить без какого-либо анонса? Что-то здесь неладное...
Работать нужно, но работать не дают, начинаем гуглить и искать интересующую нас информацию по сообщениям в чатах Telegram. Находим ссылку в дискуссиях на официальном ресурсе компании, где представитель команды сообщил, что часть публичных репозиториев временно недоступны, там же прикреплена ссылка на страницу с логами по инциденту.
Фрагмент логов, проясняющих ситуацию:
As part of an internal change task, some of our public git repositories hosted under Elastic's GitHub organisation were marked as private. As a result, when attempting to access these repositories an error may be seen. Our teams are working to restore these with urgency.
Перевод: В рамках внутренней задачи по изменению некоторые из наших публичных репозиториев git, размещенных в организации Elastic GitHub, были помечены как приватные. В результате при попытке доступа к этим репозиториям может возникнуть ошибка. Наши команды работают над их срочным восстановлением.
Первое о чем я подумал, вспоминая свой предыдущий опыт смены видимости репозитория с Public на Private: "кажется, сейчас elastic потерял заработанные годами звёзды" (механизм смены видимости репозитория в Github работает по методу удаления и создания заново со сбросом числовых значений в шапке).
Релиз на носу, а с поиском что-то нужно делать, любой ценой катим фичи.. Учитывая, что поиск на проекте это не основной функционал, а вспомогательный, принимается решение удалить зависимость с бэкенда и визуально скрыть форму поиска для пользователей - composer remove
в помощь. Управились быстро, релиз спасён, основные фичи поехали в продакшн без задержек по времени.
Уже вечером, после работы, с чашечкой чая, мне стало интересно, а что еще из популярного у Elastic было затронуто, начинаю изучать их репозитории. Подведя итоги, сравнив количество звёзд в Яндекс кэше, получаю следующий результат (актуально на момент написания статьи 30.10.24):
Репозиторий |
Звёзды до сбоя (кэш Яндекс) |
Звёзды после сбоя |
70k |
266 |
|
14.2k |
39 |
|
5.3k |
13 |
|
5.2k |
18 |
|
2.6k |
40 |
|
3.6k |
6 |
|
2k |
3 |
|
415 |
5 |
|
4.2k |
17 |
|
1.9k |
8 |
Пример на репозитории elasticsearch: факт и кэш Яндекс
Вам очень повезло, если процесс сборки на вашем проекте настроен по всем канонам безопасности, вы - молодцы! Возможно, вы просто не заметили данное событие, но это тоже хорошо.
На момент написания данного текста все известные мне (официальные) репозитории Elastic были восстановлены.
Под конец статьи хочу сказать следующее: берегите то дело, ради которого мы тратим столько сил и энергии, берегите ваши проекты и ваших заказчиков. Относитесь серьезно к процессу сборки и созданию резервных копий.
Это моя первая статья на данной площадке, в будущем постараюсь снабжать вас интересным контентом и новостями из мира IT.
Спасибо за внимание, Хабр!
Комментарии (12)
jingvar
30.10.2024 23:58Продакшен, релиз без фиксации версии, сборка прям с внешних гитов - серьезно?
flancer
30.10.2024 23:58А что тут такого? Не все в космической отрасли работают, у некоторых клиентами магазинчики и фитнес-клубы являются. Но у них тоже и продакшн, и релизы присутствуют. Собралось успешно - переключился, нет - ищи проблему. Обычно успешно собирается, инфраструктура айтишная довольно надёжная.
Но так-то зависимости должны были остаться в кэше у какого-нибудь девелопера, их можно было достать, оформить локальный репозиторий в проекте (
composer.json
):{ "repositories": { "local": { "type": "artifact", "url": "../repo/" } } }
и выложить в
../repo/
нужные зависимости в виде zip-файлов:и можно выкатываться.
Да прямо из развёрнутого дев-проекта можно делать - закатать в zip любой фолдер из
./vendor/{name}/
, главное, чтобыcomposer.json
внутри был с нужным названием и всем остальным.play_to
30.10.2024 23:58а как версию пакета указать, которую подсовываешь? У меня не вышло, но я не оч много времени старался))
CitizenOfDreams
30.10.2024 23:58Скоро без внешних зависимостей нельзя будет даже написать Hello World или помигать светодиодом. Или уже?
Politura
30.10.2024 23:58Elasticsearch это, по сути, база данных, вполне логично для доступа к базе данных использовать клиентскую библиотеку предоставленную ее разработчиками.
yurrig
Не лучше ли форкать все зависимости, чтоб не зависеть от такого рода случайностей?
Pest85
Лучше настроить Nexus Proxy.
Даже если оригинальная репа недоступна - на нексусе будет закачан артифакт, в крайнем случае не последней версии.
yurrig
Я предпочитаю не последнюю, а проверенную и оттестированную с моим продуктом версию. Возможно, подправленную. Поэтому всегда форкаю, завожу свою ветку для возможных правок, и форк апдейчу (если есть в этом потребность) в начале релизного цикла, чтобы до конца цикла неожиданностей не иметь.
kain64b
Nexus/artifactory просто кешируют версии . Вы запрашиваете версию у нексуса, он скачивает себе, и отдает вам. Гибзаб может тоже упасть или мавен централ, да и вообще не безопасно на машине где сборка идёт ,открывать доступ к интернету, а не только к локальным ресурсам компании. Там же можете и удалять не используемые у себя вообщем хорошая штука , попробуйте.
yurrig
Локальное кэширование - отличная идея, особенно для веб- или скриптовой разработки, или когда дерево зависимостей большое. У меня немного другая ситуация - зависимостей не очень много (первые десятки), и они все C++-ные, поэтому они все локально построены и в NuGet-овские пакеты завернуты, так что дополнительное кэширование не требуется. Нередко приходится в них что-то подправлять, так что без форка трудно обойтись. Но да, это несколько другая история, прямого отношения к статье не имеющая.