Это простое приложение для управления задачами, написанное на 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 или выше)
-
Клонируйте репозиторий или убедитесь, что у вас есть все файлы проекта.
-
Перейдите в директорию проекта:
cd schedulot -
Загрузите зависимости:
go mod tidy
-
Соберите проект:
go build -o schedulot cmd/main.go
-
Запустите приложение:
- Через собранный бинарный файл:
./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.
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
Теперь дочерняя задача может использовать значения из родительской задачи в аргументах команды. Для этого доступны переменные:
{{.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}}).
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