Поддержка кода Pipeline
Это руководство предназначено для обычных пользователей для создания и поддержки определений pipeline в их Git-репозиториях.
В этом руководстве объясняется, как поддерживать определения pipeline в вашем репозитории исходного кода с помощью PAC.
Содержание
Расположение файлов PipelineРасположение по умолчаниюНесколько файлов PipelineСтруктура определения PipelineБазовая структураИспользование существующего PipelineАннотации событийСопоставление события Pull Request с PipelineRunСопоставление события Push с PipelineRunУказание ветокФильтрация по веткам и путямФильтрация по веткамФильтрация по путямИсключение изменений по путямКомбинирование Path Change и IgnoreРасширенное сопоставление событийФормат CEL-выраженияДоступные поля и функции CELОсновные поляПоля изменений файловРасширенные поляФункцииПримеры CEL-выраженийСопоставление Pull Request из конкретной веткиФильтрация по пути с.pathChanged()Сопоставление по нескольким паттернам путейСопоставление по заголовку событияИсключение веткиСложный пример CEL-выраженияСопоставление PipelineRun по ветке с регулярным выражениемСопоставление PipelineRun по изменениям файлов с помощью свойства FilesФильтрация PipelineRun для исключения изменений, не связанных с кодомСопоставление PipelineRun по заголовку событияСопоставление PipelineRun по телу payloadСопоставление PipelineRun по заголовкам запросаОтмена выполняющихся PipelineНастройка отменыПримеры использованияПараметризация коммитов и URLДоступные переменныеПримеры использования переменныхИнформация о Git-репозиторииИнформация о событииИнформация о Pull RequestИспользование секрета для аутентификации GitРазрешение задач (Task Resolution)Использование аннотаций PAC (рекомендуется)Аннотации для удалённых задачИспользование синтаксиса ResolverЛокальные задачиЗадачи из Tekton HubЗадачи по удалённому URLПримеры PipelineПростой pipeline сборкиТестовый pipeline для PRМногоступенчатый pipelineУсловный pipelineЛучшие практики1. Контроль версий2. Организация3. Безопасность4. Переиспользуемость5. ТестированиеУстранение неполадокPipeline не запускаетсяПеременные не подставляютсяЗадачи не найденыСледующие шагиРасположение файлов Pipeline
PAC ищет определения pipeline в определённых местах внутри вашего репозитория:
Расположение по умолчанию
Расположение по умолчанию — .tekton/pipelinerun.yaml в корне вашего репозитория.
Несколько файлов Pipeline
Вы можете организовать pipelines в нескольких файлах:
PAC обработает все файлы с расширениями .yaml и .yml в директории .tekton/.
Если у вас несколько определений PipelineRun в разных файлах:
- Каждый PipelineRun оценивается независимо
- Несколько PipelineRun могут соответствовать одному событию (они будут выполняться параллельно)
- Каждый PipelineRun должен иметь уникальные аннотации для управления триггером
- Используйте описательные имена файлов для организации разных типов pipeline (например,
test-pipeline.yaml,deploy-pipeline.yaml)
Пример: Если у вас есть и test-pipeline.yaml, и deploy-pipeline.yaml, которые соответствуют событию push в ветку main, оба pipeline запустятся параллельно.
Структура определения Pipeline
Pipeline PAC — это стандартный ресурс Tekton PipelineRun с аннотациями, специфичными для PAC.
- PipelineRun: ресурс Tekton, который выполняет pipeline. В PAC вы определяете ресурсы PipelineRun в вашем Git-репозитории, и PAC автоматически создаёт и управляет ими на основе событий Git.
- Pipeline: ресурс Tekton, определяющий переиспользуемый набор задач. Вы можете ссылаться на существующий ресурс Pipeline в вашем PipelineRun через
pipelineRefили определить задачи напрямую с помощьюpipelineSpec.
Базовая структура
Использование существующего Pipeline
Вы можете ссылаться на существующий ресурс Pipeline, уже определённый в вашем Kubernetes кластере:
Ресурсы Pipeline могут быть определены:
- В том же namespace, что и ваш Repository CR
- Как ресурсы с областью действия кластера (ClusterTasks)
- В вашем Git-репозитории с использованием синтаксиса resolver (см. раздел Task Resolution)
Аннотации событий
PAC использует аннотации для определения момента запуска pipeline. Эти аннотации добавляются в метаданные PipelineRun. Вы можете сопоставлять разные события Git-провайдера с каждым pipeline, используя специальные аннотации. Если несколько pipeline соответствуют событию, Pipelines as Code запускает их параллельно и публикует результаты в Git-провайдер сразу после завершения каждого pipeline.
Сопоставление события Pull Request с PipelineRun
Вы можете использовать следующий пример для сопоставления pipeline с событием pull_request, нацеленным на ветку main:
Сопоставление события Push с PipelineRun
Вы можете использовать следующий пример для сопоставления pipeline с событием push, нацеленным на ветку refs/heads/main:
Указание веток
Вы можете указать несколько веток, добавляя записи через запятую. Например, "[main, release-nightly]". Кроме того, можно указать:
- Полные ссылки на ветки, например
"refs/heads/main" - Глобальные шаблоны с паттернами, например
"refs/heads/*" - Теги, например
"refs/tags/1.*"
Примеры:
Несколько веток:
Все ветки с использованием глоба:
Паттерн ветки:
Теги:
Примечание: Аннотации on-target-branch и on-event соответствуют стандартному формату, указанному в официальной документации. Для триггеров на основе комментариев используйте аннотацию pipelinesascode.tekton.dev/on-comment.
Фильтрация по веткам и путям
Фильтрация по веткам
Фильтруйте по целевой ветке с помощью аннотации on-target-branch. Можно использовать глобальные шаблоны для сопоставления нескольких веток:
Фильтрация по нескольким конкретным веткам:
Фильтрация по путям
Сопоставление PipelineRun с изменениями по конкретным путям через аннотацию — это функция Technology Preview. Такие функции пока не поддерживаются и могут быть неполными. Мы не рекомендуем использовать их в продакшене.
Чтобы запускать PipelineRun на основе изменений в определённых путях в событии, используйте аннотацию pipelinesascode.tekton.dev/on-path-change.
Можно указать несколько путей, разделённых запятыми. Первый глоб, совпадающий с изменёнными файлами в PR, вызовет запуск PipelineRun. Если нужно сопоставить файл или путь, содержащий запятую, её можно экранировать HTML-сущностью ,.
При этом необходимо указывать тип события и целевую ветку с помощью аннотаций on-target-branch и on-event.
:::important Ограничение аннотации Path Change
Если вы используете выражение CEL (on-cel-expression), аннотации on-path-change и on-path-change-ignore будут игнорироваться. Для фильтрации по путям при использовании CEL применяйте свойства files.* или функцию .pathChanged().
:::
Пример:
Эта конфигурация сопоставит и запустит PipelineRun, когда событие pull_request нацелено на ветку main и включает изменения файлов с суффиксом .md в директории docs (и её поддиректориях) или файлов с суффиксом .rst в директории manual.
Паттерны путей:
- Используйте glob-шаблоны, а не регулярные выражения
src/**— соответствует всем файлам в директорииsrcи её поддиректориях*.go— соответствует всем Go-файлам в корне репозитория- Для нескольких паттернов используйте значения через запятую:
"[src/**,*.go,config/**]"
Тестирование glob-паттернов: CLI tkn pac предоставляет удобную команду для проверки glob-паттернов:
Исключение изменений по путям
Вы можете использовать обратную аннотацию pipelinesascode.tekton.dev/on-path-change-ignore, чтобы запускать PipelineRun, когда указанные пути не изменились.
При этом необходимо указывать тип события и целевую ветку. Если используется выражение CEL, аннотация on-path-change-ignore будет игнорироваться.
Этот PipelineRun запустится, если изменения произошли вне папки docs:
Комбинирование Path Change и Ignore
Вы можете комбинировать аннотации on-path-change и on-path-change-ignore:
Эта конфигурация запускает PipelineRun, если есть изменения в директории docs, но нет изменений в docs/generated.
Важно: Аннотация on-path-change-ignore всегда имеет приоритет над on-path-change. Если файл совпадает с обоими паттернами, PipelineRun не будет запущен.
Расширенное сопоставление событий
Pipelines as Code поддерживает фильтрацию на основе Common Expression Language (CEL) для сложного сопоставления событий.
:::important CEL vs Аннотации
- Если используется
on-cel-expression: PAC применяет CEL-выражение и игнорирует аннотацииon-target-branchиon-event - Если
on-cel-expressionне используется: PAC применяет аннотацииon-target-branchиon-eventдля сопоставления
Нельзя использовать одновременно CEL-выражения и простые аннотации. Выберите подход в зависимости от ваших задач:
- Используйте простые аннотации (
on-target-branch,on-event) для базового сопоставления - Используйте CEL-выражения для сложной фильтрации, отрицаний и продвинутых условий
:::
В отличие от простого сопоставления по аннотации on-target-branch, CEL-выражения позволяют задавать сложные фильтры и отрицания.
Формат CEL-выражения
Используйте аннотацию pipelinesascode.tekton.dev/on-cel-expression с CEL-выражением:
Доступные поля и функции CEL
Основные поля
event: событие push илиpull_requesttarget_branch: целевая веткаsource_branch: ветка-источник событияpull_request. Для push-событий совпадает сtarget_branchevent_title: заголовок события, например, заголовок коммита для push или заголовок pull/merge request дляpull_request. В настоящее время поддерживаются GitHub, GitLab и Bitbucket Cloudlast_commit_title: заголовок последнего коммита в событии (расширение платформы — недоступно в upstream Tekton)
Поля изменений файлов
Позволяют фильтровать по конкретным изменениям файлов в событии:
files.all: все изменённые файлы (добавленные, изменённые, удалённые, переименованные)files.added: добавленные файлыfiles.deleted: удалённые файлыfiles.modified: изменённые файлыfiles.renamed: переименованные файлы
Примечание: Для pull request в список входят все файлы, относящиеся к PR. Эти свойства доступны для событий push и pull_request.
Расширенные поля
body: полный payload от Git-провайдера (Technology Preview)headers: HTTP-заголовки от Git-провайдера (в виде map, заголовки всегда в нижнем регистре)
Функции
.matches(pattern): сопоставление строки с регулярным выражением.pathChanged(): суффиксная функция для строки. Строка может быть glob-шаблоном для проверки изменений пути. В настоящее время поддерживаются только GitHub и GitLab. Внимание:.pathChanged()поддерживает glob, но не различает типы изменений (добавлено, изменено, удалено). Для более точной фильтрации используйте свойстваfiles.*.startsWith(prefix): проверка, начинается ли строка с префикса.contains(substring): проверка, содержит ли строка подстроку.exists(iterator, condition): проверка, существует ли элемент в коллекции, удовлетворяющий условию (используется сfiles.*)
Примеры CEL-выражений
Сопоставление Pull Request из конкретной ветки
Сопоставить событие pull_request, нацеленное на ветку main и исходящее из ветки wip:
Фильтрация по пути с .pathChanged()
Pipelines-as-Code поддерживает два способа сопоставления изменённых файлов в событии:
- Суффиксная функция
.pathChanged()(в CEL-выражениях) — поддерживает glob, но не различает типы изменений (добавлено, изменено, удалено) - Свойство
files.*(в CEL-выражениях) — позволяет фильтровать по типам изменений и использовать CEL-выражения - Аннотация
on-path-change— более простой аннотационный подход (Technology Preview)
Чтобы запускать pipeline только при изменении пути, используйте .pathChanged() с glob-шаблоном:
Это сопоставит любые markdown-файлы в директории docs.
Сопоставление по нескольким паттернам путей
Примечание: .pathChanged() поддерживает glob, но не различает типы изменений. Для более точной фильтрации используйте свойства files.*.
Сопоставление по заголовку события
Сопоставить все pull request, начинающиеся с заголовка [DOWNSTREAM]:
Исключение ветки
Запускать pipeline на событии pull_request, но пропускать ветку experimental:
Сложный пример CEL-выражения
Комплексный пример с несколькими условиями:
Это выражение:
- Сопоставляет события push или pull_request
- Запускается только на ветках main, master или release-* (или тегах)
- Исключает коммиты с "Auto-commit" в заголовке (если не на защищённых ветках)
Сопоставление PipelineRun по ветке с регулярным выражением
Сопоставить имя ветки с помощью regex. Например, запускать PipelineRun для pull_request, где имя исходной ветки содержит подстроку feat/:
Сопоставление PipelineRun по изменениям файлов с помощью свойства Files
Можно использовать свойство files для сопоставления конкретных типов изменений файлов. Это мощнее, чем .pathChanged(), так как позволяет фильтровать по типам изменений (добавлено, изменено, удалено, переименовано).
Сопоставить любые изменённые файлы в директории tmp:
Сопоставить любые добавленные файлы в директориях src или pkg:
Сопоставить изменённые файлы с именем test.go:
Доступные свойства файлов:
files.all: все изменённые файлы (добавленные, изменённые, удалённые, переименованные)files.added: добавленные файлыfiles.deleted: удалённые файлыfiles.modified: изменённые файлыfiles.renamed: переименованные файлы
Фильтрация PipelineRun для исключения изменений, не связанных с кодом
Исключить PipelineRun, если изменены только документация или конфигурационные файлы. Этот пример фильтрует события pull_request, исключая изменения, затрагивающие только документацию, конфигурацию или другие не кодовые файлы:
Это выражение:
- Сопоставляет только события pull_request, нацеленные на ветку main
- Исключает PipelineRun, если все изменённые файлы соответствуют одному из следующих паттернов:
- Файлы в директории
docs/(^docs/) - Markdown-файлы (
\\.md$) - Общие метаданные репозитория (
.gitignore,OWNERS,PROJECT,LICENSE)
- Файлы в директории
Примечание: При использовании regex в CEL-выражениях не забудьте корректно экранировать специальные символы. Обратный слэш (\) нужно удваивать (\\) для правильного экранирования в строковом контексте CEL.
Сопоставление PipelineRun по заголовку события
Сопоставить pull request или коммиты по заголовку. event_title — это заголовок pull request для событий pull_request и заголовок коммита для событий push:
Сопоставить коммиты, в заголовке которых нет "Auto-commit":
Сопоставление PipelineRun по телу payload
Сопоставление PipelineRun по телу payload — это функция Technology Preview. Такие функции пока не поддерживаются и могут быть неполными. Мы не рекомендуем использовать их в продакшене.
Тело payload, переданное Git-провайдером, доступно в CEL-переменной body. Вы можете фильтровать по любым данным, которые отправляет Git-провайдер.
Например, на GitHub сопоставить только если pull request нацелен на main, автор — superuser, и действие — synchronize (обновление pull request):
Важные замечания:
- При сопоставлении по телу payload в Pull Request, GitOps-команды типа
/retestне работают корректно, так как тело payload становится телом комментария, а не исходного pull request - Чтобы повторно запустить Pull Request при использовании CEL по телу payload, сделайте фиктивное обновление, изменив коммит и форсированно запушив:
git commit --amend --no-edit && git push --force-with-lease
Сопоставление PipelineRun по заголовкам запроса
Фильтрация по заголовкам, отправленным Git-провайдером. Заголовки доступны в виде списка и всегда в нижнем регистре.
Сопоставить только GitHub pull_request события по заголовку:
Сопоставить только GitLab merge request события:
Отмена выполняющихся Pipeline
Аннотация pipelinesascode.tekton.dev/cancel-in-progress позволяет автоматически отменять запущенный pipeline, если запускается новый pipeline того же типа.
Настройка отмены
Установите аннотацию в "true", чтобы включить автоматическую отмену:
Поведение:
- При запуске нового pipeline (например, нового push в ту же ветку) все текущие выполняющиеся pipeline с такой аннотацией автоматически отменяются
- Это полезно для предотвращения одновременного выполнения нескольких pipeline на одной ветке
- Отменённые pipeline будут отображаться со статусом "Cancelled" в Git-провайдере
Примеры использования
Предотвращение дублирующих запусков на ветке main:
Это гарантирует, что при быстром последовательном пуше в ветку main будет запущен только последний pipeline, что экономит ресурсы.
Использование с Pull Requests:
При обновлении PR новым коммитом текущий pipeline для этого PR будет отменён, и запустится новый.
Параметризация коммитов и URL
Вы можете задавать параметры коммита и URL, используя динамические переменные в формате {{<var>}}. Эти переменные можно использовать в:
PAC поддерживает два типа переменных:
- Динамические переменные PAC (
{{ variable_name }}): специфичные для PAC переменные (например,{{ revision }},{{ repo_url }}), которые PAC подставляет перед созданием PipelineRun - Параметры Tekton (
$(params.param-name)): параметры Tekton Pipeline, которые можно определить вspec.paramsRepository CR (см. Расширенная конфигурация репозитория)
В этом разделе рассматриваются динамические переменные PAC. Для параметров Repository CR смотрите Расширенную конфигурацию репозитория.
- Значения параметров PipelineRun
- Параметры задач
- Скрипты и команды шагов
- Любые строковые значения в определении pipeline
Доступные переменные
В настоящее время доступны следующие переменные:
Примеры использования переменных
Информация о Git-репозитории
Информация о событии
Информация о Pull Request
Примечание: Переменная {{ pull_request_number }} доступна только для событий типа pull_request. Для push-событий эта переменная не заполняется.
Использование секрета для аутентификации Git
Для приватных репозиториев PAC автоматически создаёт секрет для аутентификации git. Вы можете ссылаться на этот секрет в задачах pipeline:
Примечание: Переменная {{ git_auth_secret }} доступна только для приватных репозиториев. PAC автоматически создаёт этот секрет при настройке аутентификации для приватного репозитория (см. Настройка аутентификации для приватных репозиториев). Формат имени секрета: pac-gitauth-<repository-name>-<hash>.
Разрешение задач (Task Resolution)
PAC может автоматически разрешать задачи из нескольких источников. Вы можете использовать либо аннотации PAC (рекомендуется), либо синтаксис resolver Tekton.
Использование аннотаций PAC (рекомендуется)
PAC предоставляет аннотации для автоматического получения и встраивания удалённых задач из Tekton Hub. Это проще, чем использовать синтаксис resolver.
Аннотации для удалённых задач
Ссылайтесь на задачи из Tekton Hub с помощью аннотаций:
Как это работает:
- Аннотация
pipelinesascode.tekton.dev/task: "git-clone"указывает PAC получить задачу из Tekton Hub - Используйте нумерованные аннотации (
task-1,task-2и т.д.) для дополнительных задач - PAC автоматически встраивает все указанные определения задач в ваш PipelineRun
- Затем вы можете ссылаться на них через
taskRef.nameс именем задачи из Tekton Hub
Нумерация аннотаций:
pipelinesascode.tekton.dev/task: первая задача (эквивалентtask-0)pipelinesascode.tekton.dev/task-1: вторая задачаpipelinesascode.tekton.dev/task-2: третья задача- И так далее...
Подробнее см. в PAC Resolver.
Использование синтаксиса Resolver
Вы также можете использовать синтаксис resolver Tekton для ссылок на задачи.
Локальные задачи
Ссылайтесь на задачи, определённые в том же репозитории:
Задачи из Tekton Hub
Ссылайтесь на задачи из Tekton Hub:
Задачи по удалённому URL
Ссылайтесь на задачи по удалённым URL с помощью аннотаций PAC (рекомендуется):
Примеры Pipeline
Простой pipeline сборки
Тестовый pipeline для PR
Многоступенчатый pipeline
Этот пример демонстрирует полный CI pipeline с этапами clone, test и build на реальном репозитории:
Условный pipeline
Используйте разные pipeline в зависимости от ветки:
Лучшие практики
1. Контроль версий
- Храните все определения pipeline в Git
- Проверяйте изменения pipeline через Merge Requests
- Используйте теги версий pipeline для воспроизводимости
2. Организация
- Используйте описательные имена pipeline
- Группируйте связанные задачи вместе
- Используйте отдельные файлы для разных типов pipeline
3. Безопасность
- Не храните секреты в файлах pipeline
- Используйте Kubernetes Secrets для чувствительных данных
- Ограничивайте права pipeline с помощью RBAC
4. Переиспользуемость
- Создавайте переиспользуемые определения задач
- Используйте задачи из Tekton Hub, когда возможно
- Делитесь общими задачами между репозиториями
5. Тестирование
- Тестируйте изменения pipeline в feature-ветках
- Используйте pipeline для Merge Request для проверки изменений
- Держите pipeline простыми и поддерживаемыми
Устранение неполадок
Pipeline не запускается
-
Проверьте правильность аннотаций:
-
Убедитесь, что имена веток совпадают:
-
Проверьте логи контроллера PAC:
Переменные не подставляются
- Проверьте синтаксис переменных: используйте формат
{{ variable_name }}, например{{ revision }}или{{ repo_url }} - Проверьте правильность написания имён переменных: имена должны совпадать точно (например,
{{ repo_owner }},{{ source_branch }}) - Убедитесь в доступности переменных: некоторые, например
{{ pull_request_number }}, доступны только для событийpull_request - Просмотрите логи контроллера PAC на предмет ошибок разрешения переменных
Задачи не найдены
- Проверьте правильность ссылок на задачи
- Убедитесь, что файлы задач существуют в репозитории
- Проверьте имена задач в Tekton Hub
- Проверьте сетевое соединение для удалённых задач
Следующие шаги
- PAC Resolver — изучите аннотации для удалённых задач и pipeline
- Trigger Pipelines — изучите различные методы триггера
- Configure Repository — руководство по настройке репозитория
- Common Issues — руководство по устранению неполадок