Сборка пакета .portaltimer
Сборка пакета .portaltimer
Timer Jobs пишутся на C# и упаковываются в ZIP-архив .portaltimer (manifest + DLL).
Быстрый старт
cd backenddotnet new install ./templates/portal-timerjobdotnet new portal-timerjob -n heartbeat -o ../../packages/my-heartbeatcd ../../packages/my-heartbeatСборка и упаковка (пример с Docker, как в репозитории):
chmod +x build.sh./build.sh# → dist/heartbeat.portaltimerbuild.sh (пример)
#!/usr/bin/env bashset -euo pipefailROOT="$(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/publishcp dist/publish/Contoso.Heartbeat.dll dist/Contoso.Heartbeat.dllcd dist/stage && zip -r ../heartbeat.portaltimer manifest.json dist/Contoso.Heartbeat.dllУстановка
- Админка → Timer Jobs → выберите файл
.portaltimer - Или 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Обновление пакета
- Увеличьте
versionвmanifest.json - Выполните
./build.sh - Загрузите новый
.portaltimerс тем жеid
Платформа заменяет пакет в хранилище, обновляет определение в каталоге и сигнализирует Worker о перезагрузке DLL. Экземпляры timer_jobs сохраняются.
Проверка
# E2E-тест из репозитория./scripts/e2e-timer-jobs-test.shИли вручную:
- Админка → Задания — job со статусом
completed 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/.