Skip to content

foxzi/schedulot

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

16 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

schedulot

Это простое приложение для управления задачами, написанное на Go. Оно позволяет определять задачи в YAML файлах, запускать их по расписанию или в зависимости от результатов выполнения других задач. Поддерживается выполнение команд оболочки, HTTP запросов, а также отправка уведомлений о завершении задач.

Возможности

  • Определение задач в YAML файлах.
  • Запуск задач по расписанию (cron-подобный синтаксис).
  • Запуск задач на основе успешного или неуспешного выполнения других задач.
  • Выполнение команд оболочки.
  • Выполнение HTTP запросов.
  • Конфигурационный файл:
    • Настройка путей логирования, папки с задачами.
    • Конфигурация плагинов уведомлений через YAML-файл.
  • Уведомления о завершении задач:
    • Отправка уведомлений при успешном и/или неуспешном завершении задачи.
    • Настраиваемые условия отправки уведомлений с помощью параметров on_success и on_failure.
    • Поддержка различных типов уведомлений: запись в файл, отправка по email (в разработке), Slack (в разработке), Telegram (в разработке).
    • Реализация каждого типа уведомлений в виде плагина.
    • Использование шаблонов сообщений с переменными ({{.TaskID}}, {{.Date}}, {{.Data}}, {{.Status}}) для вставки динамических данных из контекста выполнения задачи.
  • Параллельное выполнение задач.
  • Логирование результатов выполнения задач:
    • Запись логов в файл.
    • Вывод логов в стандартный вывод (stdout).
    • Настройка режима логирования через параметры командной строки.
  • Настройка максимального количества повторных попыток и таймаутов для задач.
  • Динамическая перезагрузка задач: Автоматическое обнаружение изменений (создание, обновление, удаление) в файлах задач в указанной директории и соответствующая перезагрузка/обновление задач в планировщике без перезапуска приложения.
  • Валидация конфигурации задач: Возможность запуска приложения с флагом для проверки синтаксиса и корректности файлов конфигурации задач.

Структура проекта

schedulot/
├── cmd/                    # Основное приложение
│   └── main.go
├── pkg/                    # Основные пакеты
│   ├── config/             # Загрузка конфигурации задач
│   ├── executor/           # Выполнение задач
│   ├── logger/             # Логирование
│   ├── notification/       # Логика уведомлений (интерфейсы, обработка шаблонов)
│   ├── plugins/            # Плагины
│   │   └── notification/   # Плагины уведомлений (file, email, slack, telegram)
│   ├── scheduler/          # Планировщик задач
│   └── task/               # Определения структур задач
├── tasks/                  # Директория для YAML файлов с задачами
├── go.mod
├── go.sum
└── README.md
└── app.log                 # Файл логов (создается при первом запуске)

Предварительные требования

  • Go (версия 1.18 или выше)

Установка и запуск

  1. Клонируйте репозиторий или убедитесь, что у вас есть все файлы проекта.

  2. Перейдите в директорию проекта:

    cd schedulot
  3. Загрузите зависимости:

    go mod tidy
  4. Соберите проект:

    go build -o schedulot cmd/main.go
  5. Запустите приложение:

    • Через собранный бинарный файл:
      ./schedulot [флаги]
    • Или напрямую:
      go run cmd/main.go [флаги]

    Приложение поддерживает следующие флаги командной строки:

    • -logoutput <путь>: Путь к файлу логов (если -logmode установлен в file, по умолчанию: app.log) или stdout (если -logmode установлен в stdout).
    • -logmode <режим>: Режим логирования: file или stdout (по умолчанию: file).
    • -tasksdir <путь>: Директория, содержащая YAML файлы задач (по умолчанию: ./tasks).
    • -validate: Если указан, приложение проверит конфигурацию задач в tasksdir и завершит работу.

    Примеры запуска:

    • Обычный запуск:
      ./schedulot
    • Запуск с указанием директории задач и файла логов:
      ./schedulot -tasksdir /etc/myapp/tasks -logoutput /var/log/myapp.log
    • Запуск в режиме валидации задач:
      ./schedulot -validate
      Или с указанием конкретной директории для валидации:
      ./schedulot -validate -tasksdir ./my_specific_tasks
    • Запуск с логированием в stdout:
      ./schedulot -logmode stdout

    По умолчанию приложение будет искать задачи в директории ./tasks/, логировать в app.log и отслеживать изменения в директории задач для автоматической перезагрузки.

Конфигурация задач

Задачи определяются в YAML файлах (с расширением .yml или .yaml) в директории tasks/. Каждая задача должна иметь уникальный id.

Пример YAML файла задачи:

id: "example-task"
description: "Пример задачи, запускаемой по расписанию."
triggers:
  - type: "schedule"
    schedule: "*/10 * * * * *" # Каждые 10 секунд
action:
  type: "command"
  command:
    path: "echo"
    args: ["Привет от schedulot!"]

Для более сложных сценариев и дополнительных параметров смотрите документацию или другие примеры в директории tasks/.

Логирование

Все действия, запуск задач, результаты выполнения и ошибки логируются. По умолчанию логи записываются в файл app.log в корневой директории проекта. Можно настроить вывод логов в стандартный вывод (консоль) с помощью флага -logmode stdout.

Примеры настройки логирования:

  • Логирование в файл (по умолчанию):
    ./schedulot
    # или явно
    ./schedulot -logmode file -logoutput app.log
  • Логирование в stdout:
    ./schedulot -logmode stdout
  • Логирование в другой файл:
    ./schedulot -logmode file -logoutput /var/log/schedulot.log

Использование

Запуск приложения

Приложение можно запустить с несколькими аргументами командной строки:

# Запуск с настройками по умолчанию
./schedulot

# Запуск с указанием пути к файлу логов
./schedulot -logoutput /var/log/schedulot.log

# Запуск с выводом логов в stdout
./schedulot -logmode stdout

# Запуск с указанием директории задач
./schedulot -tasksdir /path/to/tasks

# Проверка задач без запуска
./schedulot -validate

# Запуск с конфигурационным файлом
./schedulot -config /path/to/config.yaml

Конфигурационный файл

Вместо указания параметров через аргументы командной строки, можно использовать конфигурационный файл в формате YAML:

# Настройки логирования
log_settings:
  log_file_path: "./app.log"  # Путь к файлу логов (если log_mode = "file")
  log_mode: "file"            # Режим логирования: "file" или "stdout"

# Настройки задач
tasks_settings:
  tasks_folder_path: "./tasks"  # Путь к папке с задачами

# Настройки плагинов уведомлений
notification_plugins:
  file:
    type: "file"
    params:
      default_file_path: "/tmp/notifications.log"

Приоритет имеют параметры, указанные в конфигурационном файле. Если файл конфигурации не найден или в нем отсутствуют какие-то параметры, используются значения из командной строки или значения по умолчанию.

Сборка проекта для запуска

go build -o schedulot cmd/main.go

Новые возможности (v2025-05)

Использование переменных родительской задачи в дочерней

Теперь дочерняя задача может использовать значения из родительской задачи в аргументах команды. Для этого доступны переменные:

  • {{.ParentTaskID}} — идентификатор родительской задачи
  • {{.ParentDate}} — время завершения родительской задачи
  • {{.ParentData}} — данные, возвращённые родительской задачей (stdout)

Пример дочерней задачи:

id: "example-child"
depends_on:
  - task_id: "example-parent"
    status: "success"
action:
  type: "command"
  command:
    path: "echo"
    args: ["Родитель: {{.ParentTaskID}}", "Дата: {{.ParentDate}}", "Данные: {{.ParentData}}"]

Эти переменные работают только в дочерних задачах, зависящих от других задач, и только в аргументах команд. В уведомлениях (notify) используются стандартные переменные ({{.TaskID}}, {{.Date}}, {{.Data}}).

Пример: дочерняя задача с HTTP POST-запросом и переменными родителя

id: "example-child-http"
description: "Дочерняя задача, отправляющая POST-запрос с данными родителя."
depends_on:
  - task_id: "example-parent"
    status: "success"
action:
  type: "http"
  http_request:
    url: "https://webhook.site/ff1fae06-a602-4af2-abcd-fa9814169850"
    method: "POST"
    headers:
      Content-Type: "application/json"
      X-Parent-Task: "{{.ParentTaskID}}"
    body: |
      {
        "parent_id": "{{.ParentTaskID}}",
        "parent_date": "{{.ParentDate}}",
        "parent_data": "{{.ParentData}}"
      }
notify:
  - type: "file"
    file_notification:
      file_path: "/tmp/example_child_http_notify.log"
      message: "HTTP child task {{.TaskID}} completed after parent. Time: {{.Date}}"
      append: true

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages