Manual Approval Gate для Tekton Pipelines
Содержание
Обзор функцииСценарии использованияПредварительные требованияШаги1. Объявите шаг одобрения в pipeline2. Контролируйте статус одобрения3. Одобрите или отклонитеОдобрение пользователемОдобрение группой4. Увеличьте timeoutsPipelineRun для длительных одобренийРезультаты выполненияУстранение неполадокИдентификаторы пользователей и группПодробнееОбзор функции
Manual Approval Gate позволяет авторам pipeline приостанавливать PipelineRun, пока назначенные approvers не проверят и не одобрят операцию. На уровне реализации контроллер, предоставляемый Operator, создает ресурс ApprovalTask для каждого шага одобрения, отслеживает ответы approvers и записывает результат обратно в исходный CustomRun.
Сценарии использования
- Обязательное прохождение контрольных точек с участием человека перед развертыванием в production или выполнением разрушительных операций по обслуживанию.
- Реализация политик многопользовательского одобрения путем объединения отдельных пользователей и групп с помощью
numberOfApprovalsRequired. - Аудит того, кто одобрил или отклонил изменение, с помощью запросов к полям статуса
ApprovalTaskили вывода CLI.
Предварительные требования
- Администратор кластера развернул
Manual Approval Gate. Если нет, см. руководство по развертыванию. - Вы можете создавать или редактировать объекты
Pipeline/PipelineRunв целевом namespace. - Approvers могут выполнять patch для ресурсов
approvaltasks.openshift-pipelines.org(обычно черезkubectl) в целевом namespace. Платформы, такие какAlauda Container Platform, предоставляют эту возможность по умолчанию; настраивайте RBAC только в том случае, если вы явно удалили встроенные permissions.
Шаги
1. Объявите шаг одобрения в pipeline
Когда pipeline достигает wait-for-approval, Tekton создает CustomRun. Контроллер одобрения создает ApprovalTask с вашими параметрами и оставляет PipelineRun в состоянии ожидания, пока не будет достигнут quorum или не произойдет отклонение.
2. Контролируйте статус одобрения
Важные поля статуса:
status.state: общее состояние gate, напримерpending,approvedилиrejected.status.approvalsRequired/status.approvalsReceived: отслеживание quorum (счетчикreceivedпоявляется только после ответа хотя бы одного approver).status.approversResponse: результат по каждому пользователю/группе и сообщения, полезные для аудита.
3. Одобрите или отклоните
Одобрение пользователем
Сначала проверьте список approvers, чтобы определить правильный индекс:
Чтобы одобрить как пользователь:
Чтобы отклонить как пользователь:
Одобрение группой
Если группа настроена как approver, отдельные участники этой группы могут отправлять свое одобрение, добавляя ответ в массив users внутри записи группы. Несколько участников группы могут одобрять независимо друг от друга, и каждое одобрение засчитывается в общий итог approvalsReceived.
Изначально у записи approver для группы нет поля users:
Первый участник группы создает массив users и устанавливает input группы в approve:
Последующие участники группы добавляются в существующий массив users и обновляют input группы:
Чтобы отклонить как участник группы:
После этих patch-операций проверьте запись группы и статус, чтобы увидеть ответы всех участников:
В этом примере и bob, и carol из группы release-managers одобрили запрос. Каждое одобрение от участника группы увеличивает approvalsReceived отдельно, поэтому два одобрения от участников группы считаются как два одобрения в требуемом общем количестве. Поле status.approversResponse показывает подробные сведения об одобрении, включая ответы отдельных участников группы.
Ключевые моменты для одобрения группой:
- Каждый участник группы должен выполнить две обязательные операции: добавить свою запись в массив
usersИ установитьinputгруппы (либоapprove, либоreject). При необходимости он также может задатьmessageгруппы. - Первый участник группы создает массив
users, используя path/spec/approvers/<index>/usersсо значением массива. - Последующие участники добавляются в массив с помощью path
/spec/approvers/<index>/users/-, где-добавляет элемент в конец массива. - Каждая запись пользователя в массиве
usersсодержит только поляnameиinput(в записи пользователя нет поляmessage). - Поле
messageна уровне группы является необязательным и общим; оно будет перезаписано последующими ответами, если они зададут новое сообщение. - Каждое одобрение участника группы отдельно увеличивает
approvalsReceived. - Несколько участников одной и той же группы могут одобрять, и каждый такой ответ засчитывается в требуемый общий итог.
- Поле
status.approversResponseотслеживает подробную информацию об одобрении, включая отдельных участников группы. - Используйте
--as <username> --as-group <groupname>, чтобы идентифицировать себя как участника группы при patch-операциях.
Контроллер устанавливает соответствующий CustomRun и PipelineRun в состояние Succeeded или Failed соответственно: одобрения накапливаются, пока не будет выполнено numberOfApprovalsRequired, тогда как любое отклонение немедленно завершает этот участок pipeline с ошибкой.
Совет: Используйте
--as <username>(обязательно) и--as-group <group>, когда нужно одобрить от имени конкретной идентичности. Validation webhook позволяет изменять только ту запись, которая соответствует impersonated user и группе. RBAC должен предоставлять вам права impersonation. Например,kubectl patch ... --as bob --as-group release-managersидентифицирует вас как пользователяbob, действующего в группеrelease-managers.
4. Увеличьте timeouts PipelineRun для длительных одобрений
Если одобрение может занять часы или дни, настройте PipelineRun.spec.timeouts.pipeline и PipelineRun.spec.timeouts.tasks так, чтобы они превышали окно одобрения, и тогда run не завершится до ответа approvers. Простой PipelineRun для проверки gate одобрения выглядит так:
Убедитесь, что параметр timeout для approval task меньше, чем timeout pipeline. Иначе PipelineRun может истечь раньше, оставив одобрение незавершенным.
Результаты выполнения
kubectl get approvaltasks -o yamlпоказывает каждый gate одобрения с полемstateи полями, связанными с quorum (столбецapprovalsReceivedпоявляется после ответа кого-либо).- Статус
PipelineRunотражает результат одобрения: при одобрении downstream tasks возобновляют выполнение; при отклонении run завершается с ошибкой, а причина передается изApprovalTask. - Логи dispatch или вывод
kubectl get approvaltask -o yamlпредоставляют историю одобрения для аудита.
Устранение неполадок
- Approval task не появляется: убедитесь, что администраторский
ManualApprovalGateCR находится в состоянииREADY. Без контроллера объектыCustomRunостанутся в ожидании. - У approvers недостаточно permissions: предоставьте им доступ
get,list,updateиpatchкapprovaltasks.openshift-pipelines.orgв соответствующем namespace. - Pipeline завершился до окончания одобрения: задайте
PipelineRun.spec.timeouts.pipelineиPipelineRun.spec.timeouts.tasksтак, чтобы они покрывали ожидаемое окно одобрения, и убедитесь, что timeout одобрения реалистичен. Иначе run может завершиться по timeout, даже если approvers еще не ответили. - Застрял в pending даже после одобрений: проверьте
status.approversResponseна наличие пользователей, которые изменили свой голос или отклонили запрос. Возможно, потребуется обновить список approvers и повторно запустить pipeline.
Идентификаторы пользователей и групп
Manual Approval Gate использует identity provider вашей платформы для сопоставления имен approvers. Всегда используйте канонические идентификаторы, предоставляемые provider, а не отображаемые имена из UI. Например, в Alauda Container Platform:
Используйте столбец USERNAME (например, admin) при добавлении user approvers.
Используйте столбец NAME (например, g-v9mfs) при указании group approvers (например, group:g-v9mfs). На других платформах доступны аналогичные ресурсы — обратитесь к документации identity service, чтобы уточнить точные имена полей.