Dear GitHub: no YAML anchors, please
GitHub Actions добавили поддержку YAML-якорей, что автор считает серьёзной ошибкой. Якоря избыточны: ту же функциональность можно реализовать через встроенные механизмы вроде workflow-level env, которые прозрачнее и логичнее в архитектуре. Они вводят ненужную сложность, нарушая локальность — теперь элементы могут зависеть от частей конфигурации в совершенно другом месте файла, что усложняет чтение и анализ.
Кроме того, якоря усугубляют проблемы безопасности: инструментам сложнее анализировать workflows, так как нарушается соответствие между исходным YAML и объектной моделью. Это мешает точно отслеживать уязвимости, например утечки секретов. GitHub не реализовал ключи слияния (merge keys), единственный сценарий, где якоря могли бы быть оправданы, что делает их поддержку бессмысленной и вредной.
Комментарии (121)
- Внедрение YAML-якорей в GitHub Actions оценивается положительно для устранения дублирования в конфигурациях, но критикуется за использование нестандартного синтаксиса, усложняющего анализ.
- Высказываются предложения заменить YAML на полноценный язык программирования для определения пайплайнов, чтобы улучшить тестируемость, локальную разработку и избежать сложностей шаблонизации.
- Поднимаются проблемы безопасности из-за неявного распространения переменных окружения (включая секреты) при использовании якорей и слияния объектов, что противоречит принципу минимальных привилегий.
- Отмечается, что текущие ограничения GitHub Actions (например, отсутствие фильтрации путей для
workflow_call) вынуждают пользователей создавать костыльные решения или полагаться на сторонние инструменты. - Обсуждаются компромиссы между декларативным и императивным подходами: одни предпочитают чистый YAML для читаемости, другие генерируют его из кода для удобства поддержки сложных логик.
Keeping secrets out of logs (2024)
Коротко:
Секреты в логах — это не «одним фиксом» решить нельзя. Ни 80/20, ни чудо-инструмента нет. Есть 10 «свинцовых пуль» — несовершенных, но при правильной раскладке работают.
Почему течёт
| Причина | Пример |
|---|---|
| Прямой логинг | log.info(user) вместо log.info(user.id) |
| «Мусорные» дампы | logger.debug(req.headers) |
| Конфиги | debug=true выводит весь env |
| Зашитые секреты | JSON-поле password внутри структуры |
| Телеметрия | APM-сборщик хватает всё подряд |
| Пользователь | Вводит пароль в поле «имя» |
10 «пуль»
-
Архитектура данных
Разделяем «чувствительное» и «остальное» на уровне схемы; в логи идёт только последнее. -
Трансформации
Сериализуем черезsanitize()илиtoLog()— явно выбрасываем секретные поля. -
Domain-primitives
- Компиляция:
SecretStringне реализуетDisplay. - Рантайм:
Redactableинтерфейс,toString() → "***".
- Компиляция:
-
Read-once
Пароль читается 1 раз, дальше объект пустой — логировать нечего. -
Taint-tracking
Помечаем вход как «грязный»; если доходит до логгера — exception. Дорого, но точно. -
Форматтеры логов
Пишем свойLayout/Encoder, который режет заранее заданные ключи рекурсивно. -
Unit-тесты
ПроверяемassertThat(log).doesNotContain(secret); запускаем на каждый PR. -
Сканеры
Regex-правила + entropy-фильтры в CI и в production-потоке. Сэмплируем, чтобы не умереть от CPU. -
Pre-processors
Vector / Logstash / Cribl вырезают поля ещё до попадания в Elasticsearch. -
Люди
Code-review чек-лист: «есть ли тут .toString / JSON.stringify / printf без фильтров?».
Стратегия
- Фундамент: классификация данных, единый словарь «что считать секретом».
- Карта потока: от источника до хранилища логов.
- Контрольные точки: валидация, sanitize, redact.
- Защита в глубину: 2-3 слоя из списка выше.
- План на инцидент: ротация, оповещение, forensics.
Итог:
Нет волшебства — только дисциплина и много мелких фиксов. Начните с 2-3 «пуль», которые дешёвле всего у вас, и двигайтесь дальше.
Комментарии (42)
- Отличный пост: чёткий разбор проблемы «секреты в логах» и конкретные техники борьбы.
- Основные идеи: taint-tracking, in-band метки, GuardedString/SecureString, доменные примитивы
new Secret(...). - Сложности: стектрейсы, JSON, core-dumps, динамически создаваемые секреты, человеческий фактор.
- Защита в глубину: маскировать, ограничивать доступ к логам, не писать всё подряд, валидировать маски (Kingfisher).
Delete tests
Удаляйте тесты
Тесты нужны для уверенности: «не сломал ли я старое?». Но если тесты сами подрывают эту уверенность — их надо выбрасывать.
- Флаки (падают случайно) учат игнорировать красный CI и скрывать реальные баги. Удаляйте.
- Слишком хрупкие (150 правок ради одной строки) замедляют разработку. Оставьте пару ключевых, остальные — в мусор.
- Долгие (не успевают прогнаться между мержами) превращаются в «всегда зелёные», но не запускаются. Это ложная уверенность — удаляйте.
- Устаревшие (проверяют поведение, которое больше не нужно) мешают внедрять новые требования. Удаляйте и пишите новые.
Если тест не приносит уверенности прямо сейчас, он вредит. Удаляйте без страха: при настоящем баге напишете лучший.
Комментарии (88)
- Участники спорят, стоит ли удалять «шаткие» (flaky) или медленные тесты, или их нужно чинить.
- Большинство считает, что лучше чинить: хрупкие тесты часто указывают на проблемы в архитектуре или race condition.
- Некоторые предлагают компромисс: временно игнорировать или выносить в отдельный набор, но не удалять окончательно.
- Автор статьи призывает удалять тесты, если они не приносят ценности, но критики считают это «кликбейтом» и предлагают просто улучшать тесты.
- Общий вывод: тесты — это код, который тоже может стать техническим долгом; решать нужно не «удалять vs оставлять», а «как сделать полезные тесты быстрыми и стабильными».
Developer's block
Разработчики тоже сталкиваются с «блоком» — аналогом писательского, но часто более тяжёлым. Причины и способы выбраться.
Почему зависаем
Новый проект
Хочется сделать «лучше всех»: покрыть тестами, написать документацию, придерживаться стиля, CI, кросс-компиляция, обработка ошибок, конкурентность… Практики полезны, но вместе превращаются в стену.
Старый проект
• Новый код — перегруз: спешишь понять, язык незнаком.
• Старый код — упал мотивация или переутомление.
Как разблокироваться
-
Учись постепенно
Запусти как пользователь, почитай тесты, спрашивай коллег. Не знаешь язык — выдели время на основы. -
Отдыхай
После большой фичи бери «мелкие дела» или техдолг. -
Двигайся мелкими шагами
Минимально реализуй задачу, потом улучшай тесты и доки. -
Прототипируй
«Спайк» — быстрый черновик по happy path. Оставь в ветке, потом перепиши аккуратно. -
Документируй черновиком
Не полируй раньше времени: простой формат, потом доведёшь.
Комментарии (90)
- Сон, прогулки, спорт и медитация — лучший способ «разблокировать» мозг и получить новые идеи.
- Ранние «грязные» MVP и повторное использование boilerplate снижают страх перед чистым листом.
- LLM помогают быстро набросать черновик, преодолеть ступор и даже подсказать имена.
- Когда совсем застрял, начни писать любой код или даже инфраструктуру для отладки — движение разгоняет.
- Главное — не игнорировать сигналы тела: делай паузы, иначе выгоришь.