Interceptor
Interceptor — это мощный компонент в Tekton Triggers, который обрабатывает и фильтрует данные событий до того, как они попадут в TriggerBindings и TriggerTemplates. Он выступает в роли «привратника» и трансформатора входящих webhook-событий, позволяя проверять, фильтровать и изменять данные событий, чтобы только релевантные события запускали ваши пайплайны.
Содержание
Объяснение терминологииЗачем нужны InterceptorsПроблемы обработки событийКак Interceptors решают эти задачиПреимуществаПрименимые сценарииОграничения и недостаткиПринципыАрхитектура InterceptorТипы InterceptorsСтруктура InterceptorПримеры конфигурацииПример Interceptor для GitHubПример Interceptor для GitLab с CELПример кастомного InterceptorВажные пояснения по параметрам InterceptorsВыражения CELПрименимые сценарииОграничения и недостаткиПринципы/Пояснение параметровПримеры конфигурацииКонфигурация HTTPSПрименимые сценарииОграничения и недостаткиПринципы/Пояснение параметровПримеры конфигурацииСправочные материалыОбъяснение терминологии
Зачем нужны Interceptors
Проблемы обработки событий
В CI/CD системах, реагирующих на внешние события, возникают несколько задач:
- Валидация событий: Внешние webhook-и необходимо проверять, чтобы убедиться, что они поступают из доверенных источников.
- Фильтрация событий: Не все события должны запускать пайплайны; требуется фильтрация по типам событий или содержимому.
- Трансформация данных: Исходные payload-ы webhook часто содержат больше данных, чем нужно, или требуют переструктурирования.
- Вопросы безопасности: Без надлежащей проверки webhook-эндпоинты могут быть уязвимы для злоупотреблений.
Без Interceptors решение этих задач потребовало бы:
- Написания кастомного кода валидации для каждого источника webhook
- Сложной логики, встроенной в определения пайплайнов
- Ручной фильтрации и трансформации в скриптах
- Отдельных механизмов безопасности для каждой интеграции
Как Interceptors решают эти задачи
Interceptors предоставляют стандартизированный декларативный способ:
- Проверять события: Проверять подписи webhook и токены для подтверждения подлинности.
- Фильтровать события: Обрабатывать только релевантные события по типу, содержимому или другим критериям.
- Трансформировать данные: Извлекать, изменять или добавлять данные, делая их более подходящими для использования в пайплайнах.
- Повышать безопасность: Внедрять единообразные практики безопасности для всех интеграций webhook.
- Модульность логики: Разделять обработку событий и выполнение пайплайнов.
Такой подход обеспечивает чёткое разделение между приёмом событий, их обработкой и запуском пайплайнов, делая вашу CI/CD систему более удобной для сопровождения и безопасной.
Преимущества
- Повышенная безопасность: Проверка подлинности webhook перед обработкой
- Снижение сложности пайплайнов: Вынесение логики фильтрации и трансформации из пайплайнов
- Стандартизированная обработка: Единообразная работа с событиями из разных источников
- Гибкость: Возможность объединять несколько interceptors для сложной обработки
- Расширяемость: Создание кастомных interceptors для специализированных задач
- Повторное использование: Определение interceptor один раз и использование в нескольких триггерах
- Декларативная конфигурация: Настройка обработки событий с помощью ресурсов Kubernetes
Применимые сценарии
Interceptors необходимы в следующих случаях:
-
Безопасная обработка webhook: Когда нужно удостовериться, что события webhook поступают из доверенных источников.
-
Условный запуск пайплайнов: Когда требуется запускать пайплайны только для определённых типов событий или содержимого (например, только при push в основную ветку).
-
Обогащение данных: Когда нужно добавить вычисляемые значения или извлечь конкретные данные из сложных payload-ов событий.
-
Интеграция с несколькими источниками: При работе с несколькими провайдерами webhook (GitHub, GitLab, Bitbucket) с единообразной обработкой.
-
Кастомная обработка событий: При реализации специализированной логики обработки событий, выходящей за рамки стандартных interceptors.
Ограничения и недостатки
- Interceptors добавляют накладные расходы на обработку событий
- Сложные выражения CEL могут быть трудны для отладки
- Кастомные interceptors требуют дополнительного развертывания и управления
- Рекомендуется использовать HTTPS для безопасности; поддержка HTTP будет удалена в будущих версиях
- Interceptors должны быть надёжно защищены для предотвращения несанкционированного доступа
Принципы
Архитектура Interceptor
Interceptors располагаются между EventListener и пайплайном обработки Trigger:
- EventListener получает webhook-событие
- Interceptors обрабатывают и фильтруют событие
- TriggerBindings извлекают данные из обработанного события
- TriggerTemplates создают ресурсы с использованием извлечённых данных
Interceptors могут быть объединены в цепочку, где каждый следующий получает результат предыдущего. Это позволяет строить сложные конвейеры обработки, где каждый interceptor выполняет свою функцию.
Типы Interceptors
Tekton Triggers поддерживает два варианта реализации interceptors:
-
Отдельные Interceptors: реализованы как отдельные сервисы Kubernetes
- Interceptor: ресурс с областью действия в пространстве имён
- ClusterInterceptor: ресурс с областью действия на уровне кластера
- Более гибкие и расширяемые
- Могут быть реализованы на любом языке, способном обслуживать HTTP-запросы
-
Встроенные Interceptors: включены в pod EventListener
- GitHub, GitLab, Bitbucket, CEL и др.
- Сохраняются для обратной совместимости
- Проще в использовании, но менее расширяемы
Структура Interceptor
Базовый ресурс Interceptor имеет следующую структуру:
При ссылке в Trigger:
Примеры конфигурации
Пример Interceptor для GitHub
Пример Interceptor для GitLab с CEL
Пример кастомного Interceptor
-
Создайте Deployment для вашего кастомного interceptor:
-
Создайте Service для вашего кастомного interceptor:
-
Зарегистрируйте ваш кастомный interceptor:
Важные пояснения по параметрам Interceptors
Выражения CEL
CEL (Common Expression Language) — мощный инструмент, используемый в interceptor CEL для фильтрации и трансформации данных событий.
Применимые сценарии
- Фильтрация событий по сложным условиям
- Извлечение конкретных данных из payload-ов событий
- Создание новых полей на основе существующих данных
- Реализация условной логики
Ограничения и недостатки
- Сложные выражения могут быть трудны для отладки
- Ограничены функциональностью CEL
- Возможное влияние на производительность при очень сложных выражениях
Принципы/Пояснение параметров
Распространённые шаблоны CEL:
- Доступ к полям body:
body.repository.full_name - Доступ к заголовкам:
header.X-GitHub-Event - Операции со строками:
body.ref.split('/')[2] - Условные выражения:
body.action in ['opened', 'reopened', 'synchronize'] - Булева логика:
body.pull_request.base.ref == 'main' && body.action == 'opened'
Примеры конфигурации
Конфигурация HTTPS
Рекомендуется запускать interceptors по HTTPS для безопасности, и это будет обязательным в будущих версиях.
Применимые сценарии
- Производственные среды
- Обработка чувствительных данных
- Соответствие требованиям безопасности
Ограничения и недостатки
- Требуется правильное управление сертификатами
- Дополнительная конфигурация по сравнению с HTTP
Принципы/Пояснение параметров
Для настройки interceptor на HTTPS:
- Добавьте метку
server/type: httpsк вашему interceptor - Предоставьте CA bundle для проверки сертификатов
- Убедитесь, что сервис interceptor настроен на работу по HTTPS