Судьба в пайплайне: пишем детерминированный Quality Gate на Go с механикой Таро

RewithSolo 24 минуты назад Судьба в пайплайне: пишем детерминированный Quality Gate на Go с механикой Таро Средний 16 мин 812 Go * DevOps * Информационная безопасность * Open source * Кейс Из песочницы Вывод в консоль...
<5 — 2026'da uzaya kaç SpaceX Starship fırlatması ulaşacak?
Значимый прорыв формирует отрасль ИИ: RewithSolo 24 минуты назад Судьба в пайплайне: пишем детерминированный Quality Gate на Go с механикой Таро Средний 16 мин 812 Go * DevOps * Информационная безопасность * Open source * Кейс Из песочницы Вывод в консоль картыИнструменты в пайплайнах уже стали рутиной, линтеры, проверки зависимостей, конфигов, образов — в пайплайн кладется все, что помогает контролировать релиз и делать его безопаснее. И вот улучшая свой devsecops пайплайн, я задумался, над тем насколько реально написать свой инструмент для CI/CD и внедрить его в рамках GitHub Actions. Оказалось не так уж и сложно, ведь для того чтобы выложить свою утилиту в GitHub Marketplace, который бы импортировался одной строчкой, нужно просто аккуратно оформить конфиги и зарелизить собранный инструмент с тегом и манифестом — модерация в маркетплейсе автоматическая.
Сама идея некоторой случайности внутри, так‑то довольно важного механизма, пайплайна, кажется немного странной, но одновременно ироничной, ведь инструмент буквально гадает на картах Таро, будет релиз удачным или нет. Поэтому я определил главные задачи: сделать легкую и собираемую утилиту, которая была бы обернута в проверки безопасности внутри GitHub Actions внутри своего репозитория и сама бы стала частью пайплайна, такая рекурсия получается. Почему чистый рандом убивает CI/CD?
Технические детали
Основной язык на котором написана Arcana Gate (так называется проект) — Golang, потому что мне была важна скорость и сборка бинарника под разные платформы, а у Go есть специальный инструмент go‑releaser, инструкции которого описываются в yaml‑манифесте прям в репозитории. (плюс мне нравится Go)Суть в том, что на нужном этапе (я бы поставил его перед самим деплоем в релиз либо самым первым) утилита бы вытаскивала случайную карту из заданной колоды и по ее характеристикам определяла «будущее» релиза, будет он удачным или нет. А вот как раз полная случайность не очень воодушевляет, так как пайплайн должен быть идемпотентным.
При перезапуске пайплайна для одного и того‑же коммита результат не должен быть разным, и решение брать math/rand с сидом от текущего времени (time. UnixNano()) для определения карты поломает логику пайплайна. Поэтому решением является получать seed из хэша коммита (GITHUB_SHA).
Но как получить числовой seed из SHA для генератора псевдослучайных чисел? func (e Engine) createRNG(seed string) rand Здесь логика простая, берем хэш коммита, прогоняем через SHA-256, чтобы получить равномерное распределение байт, и отрезаем первые 8 байт, преобразуя их в int64. Этот seedInt мы отдаем в rand.
Событие, по словам экспертов, усилит конкуренцию в сфере ИИ.




