Поддержка кода 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 по ветке с RegexСопоставление 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
Вы можете организовать pipeline в нескольких файлах:
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. Эти аннотации добавляются в metadata 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. Функции 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)
- Файлы в директории
Примечание: При использовании регулярных выражений в 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 становится телом комментария, а не исходным payload pull request - Чтобы повторно запустить Pull Request при использовании CEL на теле payload, сделайте фиктивное обновление, изменив коммит и сделав форсированный push:
git commit --amend --no-edit && git push --force-with-lease
Сопоставление PipelineRun по заголовкам запроса
Фильтрация по заголовкам, отправленным Git-провайдером. Заголовки доступны в виде списка и всегда в нижнем регистре.
Сопоставить только события pull_request GitHub, проверяя заголовок:
Сопоставить только события merge request GitLab:
Отмена выполняющихся 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 (см. Advanced Repository Configuration)
В этом разделе рассматриваются динамические переменные PAC. Для параметров Repository CR смотрите Advanced Repository Configuration.
- Значения параметров PipelineRun
- Параметры задач
- Скрипты и команды шагов
- Любые строковые значения в определении pipeline
Доступные переменные
В настоящее время доступны следующие переменные:
Примеры использования переменных
Информация о Git-репозитории
Информация о событии
Информация о Pull Request
Примечание: Переменная {{ pull_request_number }} доступна только для событий типа pull_request. Для push-событий эта переменная не заполняется.
Использование секрета для аутентификации Git
Для приватных репозиториев PAC автоматически создаёт секрет для аутентификации git. Вы можете ссылаться на этот секрет в задачах pipeline:
Примечание: Переменная {{ git_auth_secret }} доступна только для приватных репозиториев. PAC автоматически создаёт этот секрет при настройке аутентификации для приватного репозитория (см. Configure Authentication for Private Repositories). Формат имени секрета: pac-gitauth-<repository-name>-<hash>.
Разрешение задач (Task Resolution)
PAC может автоматически разрешать задачи из нескольких источников. Вы можете использовать либо аннотации PAC (рекомендуется), либо синтаксис Tekton resolver.
Использование аннотаций 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 — Руководство по устранению неполадок