Поддержка кода Pipeline
Это руководство предназначено для обычных пользователей, которые создают и поддерживают определения pipeline в своих Git-репозиториях.
В этом руководстве объясняется, как поддерживать определения pipeline в репозитории исходного кода с помощью PAC.
Содержание
Расположение файла 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 по payload bodyСопоставление PipelineRun по заголовку запросаОтмена выполняющегося PipelineНастройка отменыПримеры использованияПараметризация коммитов и 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 не запускаетсяПеременные не разрешаютсяЗадачи не найденыСледующие шагиРасположение файла 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или определить задачи inline с помощьюpipelineSpec.
Базовая структура
Использование существующего Pipeline
Вы можете сослаться на существующий ресурс Pipeline, который уже определен в вашем кластере Kubernetes:
Ресурсы Pipeline можно определить:
- В том же namespace, что и ваш Repository CR
- Как ресурсы с областью действия кластера (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" - Glob-шаблоны с сопоставлением по шаблону, например
"refs/heads/*" - Теги, например
"refs/tags/1.*"
Примеры:
Несколько веток:
Все ветки с использованием glob:
Шаблон ветки:
Теги:
Примечание: аннотации on-target-branch и on-event — это стандартный формат, как указано в официальной документации. Для триггеров на основе комментариев используйте аннотацию pipelinesascode.tekton.dev/on-comment.
Фильтрация по ветке и пути
Фильтрация по ветке
Фильтрация по целевой ветке выполняется с помощью аннотации on-target-branch. Вы можете использовать glob-шаблоны для сопоставления нескольких веток:
Фильтрация по нескольким конкретным веткам:
Фильтрация по пути
Сопоставление PipelineRun с изменениями конкретных путей через аннотации — это функция только уровня Technology Preview. Функции Technology Preview в настоящее время не поддерживаются и могут быть функционально не завершены. Мы не рекомендуем использовать их в production.
Чтобы запускать PipelineRun на основе изменений конкретных путей в событии, используйте аннотацию pipelinesascode.tekton.dev/on-path-change.
Можно указать несколько путей, разделенных запятыми. Первый glob, который совпадет с файлами, измененными в PR, запустит PipelineRun. Если нужно сопоставить файл или путь, содержащий запятую, можно экранировать ее в HTML с помощью 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-шаблоны, а не regex
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:
Сочетание изменения пути и игнорирования
Вы можете комбинировать аннотации 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 против сопоставления по аннотациям
- Если вы используете
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 будет перечислен каждый файл, относящийся к pull request. Эти свойства доступны как для событий push, так и для событий pull_request.
Расширенные поля
body: полное тело payload от Git-провайдера (Technology Preview)headers: HTTP-заголовки от Git-провайдера (доступны как map, заголовки всегда в нижнем регистре)
Функции
.matches(pattern): сопоставляет строку с шаблоном regular expression.pathChanged(): суффиксная функция для строки. Строка может быть glob-шаблоном для проверки того, изменился ли путь. В настоящее время поддерживаются только GitHub и GitLab. Примечание:.pathChanged()поддерживает glob-шаблоны, но не поддерживает разные типы изменений (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-шаблоны, но не поддерживает разные типы "изменений" (added, modified, deleted) - Свойство
files.*(в выражениях CEL) — может нацеливаться на конкретные типы измененных файлов и поддерживает использование выражений CEL - Аннотация
on-path-change— более простой подход на основе аннотаций (Technology Preview)
Чтобы запускать pipeline только если путь изменился, можно использовать суффиксную функцию .pathChanged() с glob-шаблоном:
Это соответствует каждому markdown-файлу в каталоге docs.
Сопоставление нескольких шаблонов пути
Примечание: .pathChanged() поддерживает glob-шаблоны, но не различает типы изменений файлов (added, modified, deleted, renamed). Для более точной фильтрации используйте свойства files.*, описанные ниже.
Сопоставление по заголовку события
Чтобы сопоставить все pull requests, начинающиеся с заголовка [DOWNSTREAM]:
Исключение ветки
Чтобы запускать pipeline при событии pull_request, но пропускать experimental-ветку:
Пример сложного выражения CEL
Полный пример, объединяющий несколько условий:
Это выражение:
- Соответствует событиям push или pull_request
- Запускается только для веток main, master или release-* (или тегов)
- Исключает коммиты с "Auto-commit" в заголовке (если только они не находятся в защищенных ветках)
Сопоставление PipelineRun по ветке с помощью regex
Сопоставление имени ветки с помощью regular expressions. Например, запуск PipelineRun для событий pull_request, где имя исходной ветки содержит подстроку feat/:
Сопоставление PipelineRun по изменениям файлов с помощью свойства Files
Вы можете использовать свойство files для сопоставления с конкретными типами изменений файлов. Это мощнее, чем .pathChanged(), поскольку позволяет нацеливаться на конкретные типы изменений (added, modified, deleted, renamed).
Сопоставление любого измененного файла в каталоге 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 не забывайте правильно экранировать специальные символы. Backslash (\) нужно удваивать (\\), чтобы корректно экранировать его в контексте строки CEL.
Сопоставление PipelineRun по заголовку события
Сопоставляйте pull requests или коммиты по их заголовку. event_title будет заголовком pull request для событий pull_request и заголовком коммита для событий push:
Сопоставление коммитов, в заголовке которых нет "Auto-commit":
Сопоставление PipelineRun по payload body
Сопоставление 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, выполните фиктивное обновление через amend и force-push:
git commit --amend --no-edit && git push --force-with-lease
Сопоставление PipelineRun по заголовку запроса
Фильтрация на основе заголовков, отправленных Git-провайдером. Заголовки доступны как list и всегда представлены в нижнем регистре.
Сопоставление только событий GitHub pull_request путем проверки заголовка:
Сопоставление только событий GitLab merge request:
Отмена выполняющегося Pipeline
Аннотация pipelinesascode.tekton.dev/cancel-in-progress позволяет автоматически отменять выполняющийся pipeline, когда запускается новый pipeline того же типа.
Настройка отмены
Установите значение аннотации в "true", чтобы включить автоматическую отмену:
Поведение:
- Когда запускается новый pipeline (например, новый push в ту же ветку), любой выполняющийся в данный момент pipeline с такой же аннотацией будет автоматически отменен
- Это полезно, чтобы не допускать одновременного выполнения нескольких pipeline run в одной и той же ветке
- Отмененные pipeline будут отображаться в Git-провайдере со статусом "Cancelled"
Примеры использования
Предотвращение дублирующихся запусков в ветке main:
Это гарантирует, что если в ветку main быстро поступит несколько push, выполнится только самый последний pipeline, что предотвращает лишние расходы ресурсов.
Использование с Pull Request:
Когда PR обновляется новым коммитом, любой выполняющийся pipeline для этого PR будет отменен, и запустится новый.
Параметризация коммитов и URL
Вы можете задавать параметры коммита и URL, используя динамические расширяемые переменные в формате {{<var>}}. Эти переменные можно использовать в:
PAC поддерживает два типа переменных:
- PAC dynamic variables (
{{ variable_name }}): специфичные для PAC переменные, например{{ revision }},{{ repo_url }}, которые заменяются PAC перед созданием PipelineRun - Tekton parameters (
$(params.param-name)): параметры Tekton Pipeline, которые могут быть определены в Repository CRspec.params(подробности см. в Расширенная конфигурация Repository)
В этом разделе рассматриваются PAC dynamic variables. Для параметров 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 при настройке аутентификации для private repository (см. Настройка аутентификации для private repositories). Формат имени secret: pac-gitauth-<repository-name>-<hash>.
Разрешение Task
PAC может автоматически разрешать задачи из нескольких источников. Вы можете использовать либо аннотации PAC (рекомендуется), либо синтаксис Tekton resolver.
Использование аннотаций PAC (рекомендуется)
PAC предоставляет аннотации для автоматического получения и встраивания удаленных задач из Tekton Hub. Это проще, чем использовать синтаксис resolver.
Аннотации удаленных Task
Ссылки на задачи из 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 для ссылки на задачи.
Локальные Task
Ссылка на задачи, определенные в том же репозитории:
Task из Tekton Hub
Ссылка на задачи из Tekton Hub:
Task по удаленному 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. Безопасность
- Не встраивайте secrets напрямую в файлы pipeline
- Используйте Kubernetes Secrets для конфиденциальных данных
- Ограничивайте права pipeline с помощью RBAC
4. Повторное использование
- Создавайте повторно используемые определения задач
- По возможности используйте задачи Tekton Hub
- Делитесь общими задачами между репозиториями
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 на наличие ошибок разрешения переменных
Задачи не найдены
- Проверьте, что ссылки на задачи указаны правильно
- Убедитесь, что файлы задач существуют в репозитории
- Проверьте имена задач Tekton Hub
- Проверьте сетевую доступность для удаленных задач
Следующие шаги
- PAC Resolver — Узнайте больше об аннотациях для удаленных задач и pipeline
- Trigger Pipelines — Узнайте о различных способах запуска
- Configure Repository — Руководство по настройке репозитория
- Common Issues — Руководство по устранению неполадок