Определение PipelineRun в Git
Это руководство предназначено для обычных пользователей, которые определяют манифесты PAC PipelineRun в своих Git-репозиториях.
В этом руководстве объясняется, откуда PAC читает файлы pipeline, как структурировать манифесты PipelineRun и как использовать аннотации для сопоставления с Git-событиями.
Содержание
Расположение файла PipelineРасположение по умолчаниюНесколько файлов PipelineСтруктура определения PipelineБазовая структураИспользование существующего PipelineАннотации событийСопоставление события Pull Request с Pipeline RunСопоставление события Push с Pipeline RunУказание ветокФильтрация по веткам и путямФильтрация по веткеФильтрация по путиИсключение изменений путейКомбинирование изменения и игнорирования путейРасширенное сопоставление событийФормат выражения CELДоступные поля и функции CELБазовые поляПоля изменения файловРасширенные поляФункцииПримеры выражений CELСопоставление Pull Request из конкретной веткиФильтрация по путям с использованием.pathChanged()Сопоставление нескольких шаблонов путейСопоставление по заголовку событияИсключение веткиПример сложного выражения CELСопоставление PipelineRun по ветке с использованием regexСопоставление PipelineRun по изменениям файлов с использованием свойства FilesФильтрация PipelineRun для исключения изменений, не относящихся к кодуСопоставление PipelineRun с заголовком событияСопоставление PipelineRun по body payloadСопоставление PipelineRun с заголовком запросаОтмена выполняющихся pipelineНастройка отменыПримеры использованияПараметризация commit и URLДоступные переменныеПримеры использования переменныхИнформация о Git-репозиторииИнформация о событииИнформация о Pull RequestИспользование secret аутентификации GitРазрешение TaskИспользование аннотаций PAC (рекомендуется)Аннотации удаленных TaskИспользование синтаксиса ResolverЛокальные TaskTask из Tekton HubTask по удаленному URLПримеры PipelineПростой pipeline сборкиPipeline тестирования для PRМногоэтапный pipelineУсловный pipelineРекомендуемые практики1. Управление версиями2. Организация3. Безопасность4. Повторное использование5. ТестированиеУстранение неполадокPipeline не запускаетсяПеременные не разрешаютсяTask не найденыСледующие шагиРасположение файла 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
PAC pipeline — это стандартный ресурс Tekton PipelineRun с аннотациями, специфичными для PAC.
- PipelineRun: Ресурс Tekton, который выполняет pipeline. В PAC вы определяете ресурсы
PipelineRunв своем Git-репозитории, а PAC автоматически создает и управляет ими на основе Git-событий. - Pipeline: Ресурс Tekton, который определяет повторно используемый набор tasks. Вы можете сослаться на существующий ресурс
Pipelineв вашемPipelineRunс помощьюpipelineRefили определить tasks непосредственно вpipelineSpec.
Базовая структура
Использование существующего Pipeline
Вы можете сослаться на существующий ресурс Pipeline, который уже определен в вашем кластере Kubernetes:
Ресурсы Pipeline могут быть определены:
- В том же namespace, что и ваш Repository CR
- Как ресурсы cluster-scoped (ClusterTasks)
- В вашем Git-репозитории и указаны с использованием синтаксиса resolver (см. раздел Разрешение Task)
Аннотации событий
PAC использует аннотации, чтобы определять, когда запускать pipeline. Эти аннотации добавляются в metadata PipelineRun. Вы можете сопоставлять разные события Git-провайдера с каждым pipeline, используя специальные аннотации в pipeline run. Если для одного события подходит несколько pipeline run, Pipelines as Code запускает их параллельно и публикует результаты в Git-провайдер сразу после завершения pipeline run.
Сопоставление события Pull Request с Pipeline Run
Вы можете использовать следующий пример, чтобы сопоставить pipeline с событием pull_request, которое нацелено на ветку main:
Сопоставление события Push с Pipeline Run
Вы можете использовать следующий пример, чтобы сопоставить pipeline с событием push, нацеленным на ветку refs/heads/main:
Указание веток
Вы можете указать несколько веток, добавив элементы, разделенные запятыми. Например, "[main, release-nightly]". Кроме того, можно указать следующее:
- Полные ссылки на ветки, например
"refs/heads/main" - Globs с сопоставлением по шаблону, например
"refs/heads/*" - Теги, например
"refs/tags/1.*"
Примеры:
Несколько веток:
Все ветки с использованием glob:
Шаблон ветки:
Теги:
Примечание: Аннотации on-target-branch и on-event являются стандартным форматом, как указано в официальной документации. Для триггеров на основе комментариев используйте аннотацию pipelinesascode.tekton.dev/on-comment.
Фильтрация по веткам и путям
Фильтрация по ветке
Фильтруйте по целевой ветке с помощью аннотации on-target-branch. Для сопоставления нескольких веток можно использовать glob patterns:
Фильтрация по нескольким конкретным веткам:
Фильтрация по пути
Сопоставление PipelineRun с изменениями определенных путей через аннотации — это функция только в статусе Technology Preview. Функции Technology Preview в настоящее время не поддерживаются и могут быть функционально незавершенными. Мы не рекомендуем использовать их в production.
Чтобы запускать PipelineRun на основе изменений в определенных путях события, используйте аннотацию pipelinesascode.tekton.dev/on-path-change.
Можно указать несколько путей, разделенных запятыми. Первый glob, который совпадет с файлами, измененными в PR, запустит PipelineRun. Если вам нужно сопоставить файл или путь, содержащий запятую, можно экранировать ее в HTML с помощью сущности ,.
Также необходимо указать тип события и целевую ветку с помощью аннотаций on-target-branch и on-event.
:::important Ограничение аннотации изменения пути
Если вы используете выражение CEL (on-cel-expression), аннотации on-path-change и on-path-change-ignore будут игнорироваться. При использовании CEL для фильтрации по путям используйте выражения CEL со свойствами files.* или функцию .pathChanged().
:::
Пример:
Эта конфигурация будет соответствовать и запускать PipelineRun, когда событие pull_request нацелено на ветку main и содержит изменения файлов с суффиксом .md в каталоге docs (и его подкаталогах) или файлов с суффиксом .rst в каталоге manual.
Шаблоны путей:
- Используйте glob patterns, а не regex
src/**- соответствует всем файлам в каталогеsrcи его подкаталогах*.go- соответствует всем файлам Go в корне репозитория- Для нескольких шаблонов используйте значения, разделенные запятыми:
"[src/**,*.go,config/**]"
Проверка glob patterns:
CLI tkn pac предоставляет удобную команду globbing для проверки сопоставления glob pattern:
Исключение изменений путей
Вы можете использовать обратную аннотацию pipelinesascode.tekton.dev/on-path-change-ignore, чтобы запускать PipelineRun, когда указанные пути не изменились.
По-прежнему необходимо указать тип события и целевую ветку. Если вы используете выражение CEL, аннотация on-path-change-ignore будет игнорироваться.
Этот PipelineRun будет выполняться, когда есть изменения вне каталога docs:
Комбинирование изменения и игнорирования путей
Вы можете комбинировать аннотации 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: сопоставляет заголовок события, например заголовок commit для события push и заголовок pull или merge request для событияpull_request. Эта документация охватывает GitHub и GitLab.last_commit_title: заголовок последнего commit в событии (улучшение Platform — недоступно в upstream Tekton)
Поля изменения файлов
Эти поля позволяют фильтровать по конкретным изменениям файлов в событии:
files.all: все измененные файлы (added, modified, deleted, renamed)files.added: добавленные файлыfiles.deleted: удаленные файлыfiles.modified: измененные файлыfiles.renamed: переименованные файлы
Примечание: Для pull request будет указан каждый файл, относящийся к pull request. Эти свойства доступны и для событий push, и для событий pull_request.
Расширенные поля
body: полное тело payload от Git-провайдера (Technology Preview)headers: HTTP-заголовки от Git-провайдера (доступны как map, заголовки всегда в нижнем регистре)
Функции
.matches(pattern): сопоставляет строку с шаблоном регулярного выражения.pathChanged(): суффиксная функция для строки. Строка может быть glob pattern для проверки, изменился ли путь. В настоящее время в качестве провайдеров поддерживаются только GitHub и GitLab. Примечание:.pathChanged()поддерживает glob patterns, но не поддерживает разные типы изменений (added, modified, deleted). Для более точной фильтрации используйте свойстваfiles.*.startsWith(prefix): проверяет, начинается ли строка с указанного префикса.contains(substring): проверяет, содержит ли строка указанную подстроку.exists(iterator, condition): проверяет, соответствует ли какой-либо элемент в коллекции условию (используется со свойствамиfiles.*)
Примеры выражений CEL
Сопоставление Pull Request из конкретной ветки
Чтобы сопоставить событие pull_request, нацеленное на ветку main и исходящее из ветки wip:
Фильтрация по путям с использованием .pathChanged()
Pipelines-as-Code поддерживает два способа сопоставления файлов, измененных в конкретном событии:
- Суффиксную функцию
.pathChanged()(в выражениях CEL) — поддерживает glob patterns, но не поддерживает разные типы "изменений" (added, modified, deleted) - Свойство
files.*(в выражениях CEL) — может нацеливаться на конкретные типы измененных файлов и поддерживает использование выражений CEL - Аннотацию
on-path-change— более простой подход на основе аннотаций (Technology Preview)
Чтобы запускать pipeline только если путь изменился, можно использовать суффиксную функцию .pathChanged() с glob pattern:
Это соответствует каждому markdown-файлу в каталоге docs.
Сопоставление нескольких шаблонов путей
Примечание: .pathChanged() поддерживает glob patterns, но не различает типы изменений файлов (added, modified, deleted, renamed). Для более точной фильтрации используйте свойства files.*, описанные ниже.
Сопоставление по заголовку события
Чтобы сопоставить все pull request, начинающиеся с заголовка [DOWNSTREAM]:
Исключение ветки
Чтобы запускать pipeline по событию pull_request, но пропускать экспериментальную ветку:
Пример сложного выражения CEL
Полный пример, объединяющий несколько условий:
Это выражение:
- Сопоставляет события push или pull_request
- Запускается только для веток main, master или release-* (или тегов)
- Исключает commit с "Auto-commit" в заголовке (если только они не находятся в защищенных ветках)
Сопоставление PipelineRun по ветке с использованием regex
Сопоставьте имя ветки с помощью регулярных выражений. Например, запускайте PipelineRun для событий pull_request, где имя исходной ветки содержит подстроку feat/:
Сопоставление PipelineRun по изменениям файлов с использованием свойства Files
Вы можете использовать свойство files для сопоставления конкретных типов изменений файлов. Это более мощно, чем .pathChanged(), поскольку позволяет нацеливаться на конкретные типы изменений (added, modified, deleted, renamed).
Сопоставление любого измененного файла в каталоге tmp:
Сопоставление любого добавленного файла в каталоге src или pkg:
Сопоставление измененных файлов с именем test.go:
Доступные свойства файлов:
files.all: все измененные файлы (added, modified, deleted, renamed)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 patterns в выражениях CEL не забывайте правильно экранировать специальные символы. Обратную косую черту (\) нужно удваивать (\\), чтобы корректно экранировать ее в контексте строки CEL.
Сопоставление PipelineRun с заголовком события
Сопоставляйте pull request или commit по их заголовку. event_title будет заголовком pull request для событий pull_request и заголовком commit для событий push:
Сопоставление commit, которые не содержат "Auto-commit" в заголовке:
Сопоставление PipelineRun по body payload
Сопоставление PipelineRun по body payload — это функция только в статусе Technology Preview. Функции Technology Preview в настоящее время не поддерживаются и могут быть функционально незавершенными. Мы не рекомендуем использовать их в production.
Тело payload, переданное Git-провайдером, доступно в переменной CEL как body. Вы можете использовать ее для фильтрации по любым данным, которые отправляет Git-провайдер.
Например, на GitHub сопоставляйте только те события, где pull request нацелен на main, автор — superuser, а действие — synchronize (то есть произошло обновление pull request):
Важные примечания:
- При сопоставлении body payload в Pull Request комментарии GitOps, такие как
/retest, не будут работать ожидаемым образом, потому что body payload становится payload комментария, а не исходного pull request - Чтобы повторно протестировать Pull Request при использовании CEL по body payload, сделайте фиктивное обновление, внеся и отправив force-push:
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 будут отображаться в Git-провайдере со статусом "Cancelled"
Примеры использования
Предотвращение дублирующихся запусков в ветке main:
Это гарантирует, что если в ветку main быстро поступает несколько push, будет запущен только последний pipeline, что предотвращает расход ресурсов.
Использование с Pull Request:
Когда PR обновляется новым commit, любой выполняющийся pipeline для этого PR будет отменен, и запустится новый.
Параметризация commit и URL
Вы можете задавать параметры вашего commit и URL, используя динамические расширяемые переменные в формате {{<var>}}. Эти переменные можно использовать в:
PAC поддерживает два типа переменных:
- Динамические переменные PAC (
{{ variable_name }}): переменные, специфичные для PAC (например,{{ revision }},{{ repo_url }}), которые заменяются PAC перед созданиемPipelineRun - Параметры Tekton (
$(params.param-name)): параметры Tekton Pipeline, которые можно определить в Repository CRspec.params(подробности см. в Расширенная конфигурация Repository)
Этот раздел охватывает динамические переменные PAC. О параметрах Repository CR см. в Расширенная конфигурация Repository.
- Значения
paramsвPipelineRun - Параметры Task
- Скрипты и команды step
- Любое строковое значение в определении pipeline
Доступные переменные
В настоящее время можно использовать следующие переменные:
Примеры использования переменных
Информация о Git-репозитории
Информация о событии
Информация о Pull Request
Примечание: Переменная {{ pull_request_number }} доступна только для типов событий pull_request. Для событий push эта переменная не заполняется.
Использование secret аутентификации Git
Для private repositories PAC автоматически генерирует secret для аутентификации Git. Вы можете ссылаться на этот secret в задачах pipeline:
Примечание: Переменная {{ git_auth_secret }} доступна только для private repositories. PAC автоматически создает этот secret, когда Repository ссылается на Git access token; см. Создание Git Secret для PAC. Формат имени secret: pac-gitauth-<repository-name>-<hash>.
Разрешение Task
PAC может автоматически разрешать tasks из нескольких источников. Вы можете использовать либо аннотации PAC (рекомендуется), либо синтаксис Tekton resolver.
Использование аннотаций PAC (рекомендуется)
PAC предоставляет аннотации для автоматического получения и встраивания удаленных tasks из Tekton Hub. Это проще, чем использование синтаксиса resolver.
Аннотации удаленных Task
Ссылайтесь на tasks из Tekton Hub с помощью аннотаций:
Как это работает:
- Аннотация
pipelinesascode.tekton.dev/task: "git-clone"указывает PAC получить task из Tekton Hub - Используйте нумерованные аннотации (
task-1,task-2и т. д.), чтобы ссылаться на дополнительные tasks - PAC автоматически встраивает все определенные ссылки на tasks в ваш
PipelineRun - После этого вы можете ссылаться на них с помощью
taskRef.name, используя имя task из Tekton Hub
Нумерация аннотаций:
pipelinesascode.tekton.dev/task: первая task (эквивалентtask-0)pipelinesascode.tekton.dev/task-1: вторая taskpipelinesascode.tekton.dev/task-2: третья task- И так далее...
Подробнее см. в PAC Resolver.
Использование синтаксиса Resolver
Вы также можете использовать синтаксис resolver Tekton для ссылки на tasks.
Локальные Task
Ссылайтесь на tasks, определенные в том же репозитории:
Task из Tekton Hub
Ссылайтесь на tasks из Tekton Hub:
Task по удаленному URL
Ссылайтесь на tasks по удаленным URL с помощью аннотаций PAC (рекомендуется):
Примеры Pipeline
Простой pipeline сборки
Pipeline тестирования для PR
Многоэтапный pipeline
Этот пример демонстрирует полный CI pipeline с этапами clone, test и build с использованием реального репозитория:
Условный pipeline
Используйте разные pipeline в зависимости от ветки:
Рекомендуемые практики
1. Управление версиями
- Храните все определения pipeline в Git
- Проверяйте изменения pipeline через Merge Request
- Помечайте версии pipeline тегами для воспроизводимости
2. Организация
- Используйте информативные имена pipeline
- Группируйте связанные tasks вместе
- Используйте отдельные файлы для разных типов pipeline
3. Безопасность
- Не встраивайте secret напрямую в файлы pipeline
- Используйте Kubernetes Secrets для чувствительных данных
- Ограничивайте права pipeline с помощью RBAC
4. Повторное использование
- Создавайте повторно используемые определения task
- Используйте tasks из Tekton Hub, когда это возможно
- Делитесь общими tasks между репозиториями
5. Тестирование
- Тестируйте изменения pipeline в feature branches
- Используйте pipeline Merge Request для проверки изменений
- Делайте pipeline простыми и поддерживаемыми
Устранение неполадок
Pipeline не запускается
-
Проверьте, что аннотации указаны корректно:
-
Убедитесь, что имена веток совпадают:
-
Проверьте логи контроллера PAC:
Переменные не разрешаются
- Проверьте синтаксис переменных: используйте формат
{{ variable_name }}, например{{ revision }}или{{ repo_url }} - Проверьте правильность написания имен переменных: убедитесь, что имена переменных совпадают точно (например,
{{ repo_owner }},{{ source_branch }}) - Проверьте доступность переменных: некоторые переменные, например
{{ pull_request_number }}, доступны только для событийpull_request - Просмотрите логи контроллера PAC на наличие ошибок разрешения переменных
Task не найдены
- Проверьте, что ссылки на tasks указаны корректно
- Убедитесь, что файлы task существуют в репозитории
- Проверьте имена tasks в Tekton Hub
- Проверьте сетевое подключение для удаленных tasks
Следующие шаги
- PAC Resolver - Узнайте об аннотациях удаленных task и pipeline
- Запуск Pipeline - Узнайте о различных способах запуска
- Руководства - Пошаговые инструкции по настройке репозитория
- Распространенные проблемы - Руководство по устранению неполадок