MiddleDevOps Engineer > Контейнеры и доставка > CI/CD и управление релизами
Короткий ответ Нужно определить граф зависимостей между пакетами (через инструменты вроде Nx, Turborepo, Bazel или по структуре директорий) и на каждый PR вычислять список изменённых файлов, запуская сборку/тесты только для затронутых пакетов и тех, что от них зависят, а не для всего монорепозитория целиком. Как это работает подробнее инструменты для монорепозиториев строят граф зависимостей на основе импортов/package.json-ссылок между внутренними пакетами и умеют вычислять «affected»-множество на основе diff между текущей и базовой веткой (`nx affected`, `turbo run test --filter=...[origin/main]`). Это позволяет запускать только релевантные джобы, а не весь набор. Пример кода Пример кода Что использовать на практике На практике. такой подход особенно выгоден, когда сервисы в монорепо не имеют сильной связности — изменение одного микросервиса не должно требовать пересборки и тестирования остальных девяти. Нужно быть аккуратным с транзитивными зависимостями — если изменена общая shared-библиотека, affected-наб
artifactscicd-and-release-management
SeniorPerformance Marketer > Google Ads > Контроль качества измерений
Короткий ответ В моменте нет безопасного способа «восстановить» всю потерянную атрибуцию конверсий за эти 10 часов полностью — нужно оценить масштаб потерь через сверку с CRM/платёжной системой, по возможности догрузить офлайн-конверсии туда, где это поддерживается площадками, и явно сообщить всем зависимым командам (закупка трафика, финансы) о масштабе и причине искажения данных за этот период, чтобы они не приняли автоматических решений на основе искажённых цифр. Как это работает подробнее Пока событие Purchase не передавалось, алгоритмы автоматического назначения ставок на нескольких платформах продолжали получать нулевой/заниженный сигнал о конверсиях, что могли привести их к ошибочным решениям (снижение ставок, сужение таргетинга, остановка части объявлений как «неэффективных») даже после восстановления трекинга, так как модели обучаются на истории с лагом. Что использовать на практике Практика. Правильная немедленная реакция: 1) зафиксировать точное время начала и окончания сбоя по логам; 2) сверить реа
analyticsconversion-monitoring
MiddlePython Developer > Основы Python > Функции и области видимости
Короткий ответ Замыкание захватывает не только нужные ему переменные, но неявно удерживает ссылки на весь объект объемлющей области видимости, если он на него ссылается хоть одним атрибутом; если большой объект конфигурации доступен в той же функции, где создаётся callback, он может держаться в памяти через ячейку замыкания даже тогда, когда реально callback'у нужен только один маленький параметр из него — решение: явно скопировать нужное значение в отдельную переменную перед созданием замыкания, не ссылаясь на весь большой объект. Как это работает подробнее Замыкание хранит ссылки на переменные объемлющей функции, к которым оно обращается по имени в своём теле — если тело callback обращается, например, к config.retry_limit, то замыкание держит ссылку на весь объект config, а не только на число retry_limit, потому что Python разрешает имя config динамически при каждом вызове, а не копирует значение атрибута заранее. Пока существует хотя бы один живой callback, созданный в этой функции, весь объект config (и в
closuresfunctions-scope
SeniorDevOps Engineer > Контейнеры и доставка > Infrastructure as Code и управление конфигурацией
Короткий ответ Нужно разделить модули на уровни обязательности: небольшой набор "golden" модулей с жёстко зафиксированными небезопасными-по-умолчанию настройками (например, S3-бакет с обязательным шифрованием и блокировкой публичного доступа) — обязателен и проходит через централизованный review и SLA на обновления; остальная логика остаётся в свободном использовании командами, с возможностью прислать свой модуль в общий каталог через стандартизированный, но лёгковесный процесс (CI-проверки + review от платформенной команды, а не ручное одобрение каждой мелочи); единственно верного баланса между контролем и автономией нет, и выбор нужно явно обсуждать с учётом размера организации, зрелости команд и регуляторных требований. Как это работает подробнее governance здесь означает комбинацию технического контроля (policy as code, проверяющая, что критичные ресурсы созданы только через одобренные модули/с одобренными настройками) и процесса (кто может публиковать и обновлять модуль, как версионируется breaking chang
configuration-managementiac
SeniorDevOps Engineer > Контейнеры и доставка > Скриптинг и автоматизация
Короткий ответ Миграцию стоит проводить поэтапно и по приоритету риска: сначала инвентаризация всех скриптов автоматизации и их критичности, затем немедленное устранение явных угроз безопасности (секреты в коде/истории Git, запуск от root без необходимости), и только потом постепенное приведение к единому стандарту обработки ошибок и логирования по мере изменения каждого скрипта; единого "правильного" темпа и набора стандартов нет — их нужно соразмерить с реальным риском простоя и доступными ресурсами команды. Как это работает подробнее большой парк разнородных скриптов, накопленных за годы, обычно невозможно и нежелательно переписывать "большим взрывом" — это высокий риск регрессий в критичной автоматизации при ограниченной пользе немедленно. Более устойчивый подход — ранжировать скрипты по критичности (влияет ли сбой на продакшен, деньги, безопасность) и по риску (секреты в коде, запуск с широкими правами, отсутствие логирования инцидентов) и обрабатывать в этом порядке. быстрая принудительная миграция всех
automationbash
MiddleDevOps Engineer > Контейнеры и доставка > Безопасность и DevSecOps
Короткий ответ Нужно внедрить admission-контроллер политик (OPA Gatekeeper или Kyverno), который проверяет каждый создаваемый/изменяемый объект на соответствие заданным правилам и блокирует или помечает нарушающие ресурсы прямо в момент применения, а не ждать периодического аудита постфактум. Как это работает подробнее admission-контроллер подключается к API-серверу как webhook и получает запрос на создание/изменение ресурса до его сохранения в etcd; политика (написанная на Rego для OPA Gatekeeper или YAML-декларативно для Kyverno) проверяет объект по заданным правилам и возвращает allow/deny. Это превращает требования безопасности из документации в технически применяемый контроль. Пример кода Что использовать на практике Практика. политики сначала вводят в режиме «audit»/dry-run (только логируют нарушения без блокировки), собирают статистику, чтобы не сломать существующие легитимные случаи, обсуждают с командами исключения, и только затем переводят в режим «enforce» (блокировка). Нужные исключения оформляют
admission-controlkubernetes
MiddlePerformance Marketer > Google Ads > Диагностика и измерение
Короткий ответ Сначала нужно сверить число конверсий, зафиксированных в каждом рекламном кабинете, с числом конверсий в GA4 и с числом фактических сделок/лидов в CRM за один и тот же период и источник, чтобы понять, где именно теряются или задваиваются данные, прежде чем принимать решение по бюджетам. Как это работает подробнее Расхождение между кабинетом, GA4 и CRM может быть вызвано разными моделями атрибуции (last-click в CRM против данных платформы по собственной модели), задвоением/недоучётом событий конверсии, потерей данных из-за блокировщиков рекламы и cookie consent, или просто разным окном атрибуции по умолчанию. Что использовать на практике На практике. Практический чек-лист: (1) сравнить абсолютное число конверсий за одинаковый период в трёх системах; (2) проверить окна атрибуции и модели в каждой системе; (3) проверить долю трафика, где браузерный пиксель мог быть заблокирован (ITP, расширения, отказ от cookie); (4) проверить UTM-разметку на соответствие кампаниям в CRM. Пример. Google Ads показы
ad-platformscampaign-diagnostics
MiddleDevOps Engineer > Контейнеры и доставка > CI/CD и управление релизами
Короткий ответ Нужно настроить сканер так, чтобы он блокировал пайплайн только по уязвимостям с доступным исправлением (fixed version) выше согласованного порога серьёзности, вести файл допустимых исключений (ignore-list) с обоснованием и сроком пересмотра для ложных срабатываний/неприменимых CVE, и регулярно пересматривать политику, а не блокировать по любому найденному CVE без разбора. Как это работает подробнее сканеры образов (Trivy, Grype) анализируют установленные пакеты и ОС-слои образа против баз CVE и могут возвращать находки без доступного патча (их исправить сборкой нельзя) или неприменимые к реальному пути выполнения кода находки. Жёсткая блокировка по любому Critical CVE без фильтрации быстро приводит к ситуации, когда релизы блокируются уязвимостями, которые невозможно исправить прямо сейчас, и команда начинает искать способы обойти проверку целиком. Пример кода Пример кода Что использовать на практике На практике. разумная политика — блокировать только там, где есть fixed version (`trivy image
cicd-and-release-managementci-cd-pipelines
MiddleData Analyst > SQL и данные > Качество данных
Короткий ответ Нужен механизм переобработки (reprocessing) за скользящее окно последних N дней при каждом запуске, либо отдельный механизм докладки опоздавших событий с пересчётом уже посчитанных агрегатов за затронутый период. Как это работает подробнее Вместо того чтобы агрегировать только «вчера» и считать период закрытым, пайплайн при каждом запуске пересчитывает, например, последние 3–7 дней — опоздавшие события, попавшие в raw-слой, учитываются при следующем пересчёте, а агрегат за прошлые дни обновляется. Пример кода Что использовать на практике На практике. Размер окна пересмотра выбирают по эмпирическому распределению задержки событий (например, 95% событий долетают в течение 24 часов, но на окно всё равно берут с запасом 3–7 дней); также полезно иметь метрику «доля событий, пришедших с опозданием более N часов» для мониторинга. Проверка. сравнить значение dau за одну и ту же дату в двух последовательных запусках пайплайна (например, через день) — рост значения указывает на то, что докладка и пересчё
data-qualityetl
JuniorDevOps Engineer > Контейнеры и доставка > CI/CD и управление релизами
Короткий ответ Значение `API_URL` нужно задавать как переменную окружения (или параметр конфигурации — ConfigMap/values-файл), специфичную для каждого окружения, и считывать её в коде приложения во время запуска, а не записывать напрямую в исходный код. Как это работает подробнее один и тот же собранный артефакт (образ, бинарник) деплоится в разные окружения с разным набором переменных окружения или примонтированной конфигурацией — приложение при старте читает `API_URL` из окружения и использует её, не зная заранее, в каком окружении оно работает. Пример кода Пример кода Что использовать на практике На практике. такой подход — часть принципа «twelve-factor app» (хранить конфигурацию в окружении) и необходимое условие для build once, deploy many: если зашить URL в код, пришлось бы пересобирать артефакт отдельно для каждого окружения, теряя гарантию, что в прод попало именно протестированное на staging. Пример. Ожидаемое поведение: один и тот же Docker-образ приложения в поде staging обращается к `api-staging.e
cicd-and-release-managementci-cd-pipelines