Перейти к содержимому

Сборка пакета .portaltimer

Сборка пакета .portaltimer

Timer Jobs пишутся на C# и упаковываются в ZIP-архив .portaltimer (manifest + DLL).

Быстрый старт

Окно терминала
cd backend
dotnet new install ./templates/portal-timerjob
dotnet new portal-timerjob -n heartbeat -o ../../packages/my-heartbeat
cd ../../packages/my-heartbeat

Сборка и упаковка (пример с Docker, как в репозитории):

Окно терминала
chmod +x build.sh
./build.sh
# → dist/heartbeat.portaltimer

build.sh (пример)

#!/usr/bin/env bash
set -euo pipefail
ROOT="$(cd "$(dirname "$0")" && pwd)"
DIST="$ROOT/dist"
STAGE="$DIST/stage"
rm -rf "$STAGE"
mkdir -p "$STAGE/dist/publish"
docker run --rm \
-v "$ROOT/../../../backend:/backend" \
-v "$ROOT:/project" \
-w /project \
mcr.microsoft.com/dotnet/sdk:10.0 \
dotnet publish Contoso.Heartbeat.csproj -c Release -o /project/dist/stage/dist/publish
cp "$STAGE/dist/publish/Contoso.Heartbeat.dll" "$STAGE/dist/Contoso.Heartbeat.dll"
cp "$ROOT/manifest.json" "$STAGE/manifest.json"
cd "$STAGE"
zip -r "$DIST/heartbeat.portaltimer" manifest.json dist/Contoso.Heartbeat.dll

Без Docker:

Окно терминала
dotnet publish -c Release -o dist/publish
cp dist/publish/Contoso.Heartbeat.dll dist/Contoso.Heartbeat.dll
cd dist/stage && zip -r ../heartbeat.portaltimer manifest.json dist/Contoso.Heartbeat.dll

Установка

  1. Админка → Timer Jobs → выберите файл .portaltimer
  2. Или API:
Окно терминала
curl -b cookies.txt -F "package=@dist/heartbeat.portaltimer" \
http://localhost:8080/api/v1/timer-jobs/packages

Требуется роль администратора портала.

Создание экземпляра задания

Окно терминала
curl -b cookies.txt -X POST http://localhost:8080/api/v1/timer-jobs \
-H 'Content-Type: application/json' \
-d '{
"title": "Heartbeat каждую минуту",
"definitionId": "uuid-из-каталога",
"scheduleType": "everyMinute",
"scheduleConfig": {},
"config": { "message": "hello" },
"isEnabled": true
}'

Ручной запуск:

Окно терминала
curl -b cookies.txt -X POST http://localhost:8080/api/v1/timer-jobs/{id}/run

Обновление пакета

  1. Увеличьте version в manifest.json
  2. Выполните ./build.sh
  3. Загрузите новый .portaltimer с тем же id

Платформа заменяет пакет в хранилище, обновляет определение в каталоге и сигнализирует Worker о перезагрузке DLL. Экземпляры timer_jobs сохраняются.

Проверка

Окно терминала
# E2E-тест из репозитория
./scripts/e2e-timer-jobs-test.sh

Или вручную:

  1. Админка → Задания — job со статусом completed
  2. docker compose logs worker | grep timer-job

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

my-timerjob/
├── manifest.json
├── MyTimerJob.cs
├── Contoso.Heartbeat.csproj # ссылка на Portal.TimerJob.Sdk
├── build.sh
└── dist/
└── heartbeat.portaltimer

См. также backend/templates/portal-timerjob/ и packages/timer-job-examples/.