• Русский
  • ScheduledTrigger не срабатывает по расписанию

    Описание проблемы

    После создания ScheduledTrigger не появляется ни один PipelineRun (или другие ресурсы внутри TriggerTemplate) в ожидаемое время.

    Анализ причин

    Распространённые причины включают:

    1. Неверное cron-выражение или необязательное поле timeZone, либо следующий запуск ещё не наступил в ожидаемом часовом поясе.
    2. Ссылка на TriggerTemplate (или встроенное содержимое шаблона) не может быть разрешена, часто из-за неправильного имени/пространства имён или отсутствия прав.
    3. Рендеринг проходит успешно, но создание ресурсов Tekton не удаётся из-за проблем с RBAC или ошибок валидации шаблона.

    Подробное описание каждого поля спецификации ScheduledTrigger смотрите в ScheduledTrigger API и Важные пояснения параметров.

    Исследование проблемы

    Всегда начинайте с:

    # Замените на имя и namespace вашего ScheduledTrigger
    kubectl describe scheduledtrigger <name> -n <namespace>
    # Events:
    #   Type     Reason                  Age               From               Message
    #   ----     ------                  ----              ----               -------
    #   Warning  UnknownTriggerTemplate  2s (x11 over 7s)  scheduled-trigger  failed to resolve TriggerTemplate: error getting TriggerTemplate missing-trigger-template: TriggerTemplate.triggers.tekton.dev "missing-trigger-template" not found

    В разделе Events могут быть предупреждения, такие как UnknownTimeZone, UnparseableSchedule, InvalidSchedule, UnknownTriggerTemplate или FailedCreate. Используйте эти типы событий, чтобы выбрать правильное решение из разделов ниже.

    Выполните следующие проверки, чтобы сузить круг проблемы:

    Проверка расписания и часового пояса

    1. Проверьте расписание командой kubectl get scheduledtrigger <name> -n <namespace> -o jsonpath='{.spec.schedule}' и убедитесь, что оно соответствует нужному cron-выражению (минуты часы день-месяца месяц день-недели).
    2. Если задано spec.timeZone, убедитесь, что это корректный часовой пояс (например, Asia/Shanghai). Опечатки вызывают предупреждения UnknownTimeZone и пропуск запусков. При ошибках синтаксиса cron контроллер создаёт события UnparseableSchedule или InvalidSchedule; исправьте выражение и примените заново.
    3. Сравните kubectl get scheduledtrigger <name> -n <namespace> -o jsonpath='{.status.lastScheduleTime}' с текущим временем, чтобы проверить, не просрочен ли последний запуск. Помните, что cron-выражения оцениваются в выбранном часовом поясе, а не по локальному времени пользователя.

    Проверка ссылки на TriggerTemplate

    1. При использовании spec.triggerTemplate.ref убедитесь, что указанный TriggerTemplate существует в том же namespace: kubectl get triggertemplate <ref> -n <namespace>.
    2. Для встроенных шаблонов выполните kubectl describe scheduledtrigger <name> и проверьте ошибки валидации, указывающие на отсутствующие поля внутри triggerTemplate.
    3. Убедитесь, что такие плейсхолдеры, как $(context.datetime), используются только в spec.params. В отрендеренном шаблоне они должны ссылаться через $(tt.params.<name>); использование контекстных плейсхолдеров в других местах приводит к ошибкам рендеринга и предупреждениям UnknownTriggerTemplate.

    Проверка событий на ошибки применения или прав доступа

    1. Выполните kubectl describe scheduledtrigger <name> -n <namespace> и изучите раздел Events. Сообщения типа FailedCreate, ResourceApplyFailed или ошибки RBAC с forbidden означают, что контроллер пытался сработать, но был заблокирован.
    2. Предупреждения FailedCreate обычно означают, что Tekton отклонил отрендеренный ресурс. Изучите сообщение, исправьте шаблон и примените ScheduledTrigger заново.
    3. Для изоляции проблем с шаблоном попробуйте создать PipelineRun или TaskRun напрямую из содержимого TriggerTemplate. Вручную замените все плейсхолдеры $(tt.params.<name>) на конкретные значения, примените ресурс и проверьте, создаётся ли он успешно.

    Дополнительные советы

    • При отладке временно измените spec.schedule на запуск каждую минуту (например, */1 * * * *), чтобы проверить, начнут ли выполняться запуски после изменений.

    • Держите ScheduledTrigger и TriggerTemplate в одном namespace, чтобы избежать путаницы с кросс-namespace ссылками.

    • Используйте метку tekton.alaudadevops.io/scheduled-trigger-name для вывода всех ресурсов, созданных ScheduledTrigger. Например:

      # Замените на имя и namespace вашего ScheduledTrigger
      kubectl get pipelinerun -n <namespace> -l tekton.alaudadevops.io/scheduled-trigger-name=<scheduled-trigger-name>
      # NAME          SUCCEEDED   REASON      STARTTIME   COMPLETIONTIME
      # demo-pr-225j6    True        Succeeded   19h         19h
      # demo-pr-22j8w    True        Succeeded   151m        151m
      # demo-pr-22jxp    True        Succeeded   4h39m       4h39m
      
      # Замените на имя и namespace вашего ScheduledTrigger
      kubectl get taskrun -n <namespace> -l tekton.alaudadevops.io/scheduled-trigger-name=<scheduled-trigger-name>
      # NAME          SUCCEEDED   REASON      STARTTIME   COMPLETIONTIME
      # demo-tr-hbbk8    True        Succeeded   40d         40d
      # demo-tr-jddi2    True        Succeeded   14d         14d
      # demo-tr-kdq5w    True        Succeeded   14d         14d

      Замените <scheduled-trigger-name> на имя вашего ресурса, чтобы увидеть все PipelineRun или TaskRun, созданные этим ScheduledTrigger.