Compare: 3.9.0...3.10.1
Elsa 3.10.1 — Release Notes
3.10.0 was an internal candidate and was not published. This is the first public 3.10 release, and it includes everything since 3.9.0.
Minor release. Core, Studio and Extensions packages are published together as 3.10.1 from this repository. Upgrade the Elsa.* packages you use to 3.10.1 together, except the packages listed below that stay at 3.9.0.
The headline is more reliable workflow dispatch and cancellation, tenant-scoped roles, and a combined Community image that serves Studio again. If you run JavaScript in workflows, host Elsa outside Development/Demo, or use a custom EF Core schema, read the upgrade notes before rolling out.
🌟 Highlights
- The combined Community image serves Studio again.
elsaworkflows/elsa-server-and-studio-v3hosts Studio (login and designer) and the Elsa Server API in one process. (#9201) - The dispatch outbox delivers reliably. Outbox items are deleted only after delivery, a message for a channel the host cannot route no longer stalls every newer dispatch, and MassTransit honours
SkipIfInstanceExistsso a retry cannot start a duplicate child. (#8810, #8817, #8167, #8816, #8820, #8811) - Cancelling a waiting dispatch cancels its children. Cancelling a
DispatchWorkfloworBulkDispatchWorkflowsthat is still waiting withdraws the outbox item, cancels the child workflows, and retries a failed cancel page read instead of skipping children. When a dispatched child is cancelled, the parent can resume. (#8823, #8836, #8837, #8871, #8819, #8822, #8961, #8963) - Roles are tenant-scoped. Role names are unique per tenant, and role ids are no longer derived from the role name, so two tenants that share a store can each have an admin role with the same name. (#8616, #8619, #8615)
- JavaScript is safer by default. The engine is Jint 4.17, the stack-overflow guard is on, and CLR access is opt-in. Deeply recursive scripts now fail with an error instead of crashing the host. (#9013, #8990, #8966)
🐛 Fixes
Runtime and dispatch
- Cancelling a waiting
DispatchWorkfloworBulkDispatchWorkflowsnow cancels the child workflows, withdraws the outbox item, and retries a failed cancel page instead of leaving children running. (#8819, #8822, #8823, #8836, #8837, #8871) - Unroutable outbox items are retried and then abandoned, and they no longer block later dispatches. (#8816, #8817)
- MassTransit dispatch honours
SkipIfInstanceExists, so an outbox retry cannot create a duplicate child. (#8811, #8820) ProtoActorWorkflowClient.InstanceExistsAsyncis implemented. (#8873, #8874)- Background activities can persist and reload their bookmarks, and a background resume no longer writes duplicate bookmark ids. (#8804, #8808, #8809, #8996, #8879)
- A single transient exception no longer stops the workflow heartbeat for good, so recovery will not restart a healthy long-running activity. (#8753, #8788)
- Publishing a workflow no longer leaves a stale "not found" cache entry, or evicts the cache before the database write, which could cause 404s or faulted parents for up to a minute. (#8752, #8790, #8789)
- Stored trigger and bookmark payloads that come back as
ExpandoObjectorJsonElementdeserialize again. (#8792, #8793, #8794, #8795) Switchresumes correctly from JSON-serialized state. (#7443, #8863)- In token-based flowcharts, a
WaitAnyFlowJoinno longer completes the flowchart before the join runs. (#8464, #8513) - A workflow run now reports which stored trigger started it. (#8919)
- A null cron expression is returned as a validation error instead of throwing. (#8827, #8826, #8828)
Persistence and migrations
- SQLite Label installs migrate cleanly on a fresh database and when upgrading from 3.9. MySQL Labels and Secrets migrations no longer require the database to be named
Elsa. (#9108, #9110) - SQL Server Labels and Secrets uniqueness migrations no longer fail with
Incorrect syntax near 'CONCAT'. (#8764, #8358) - Most EF Core modules honour a custom database schema. Secrets still hard-code the
Elsaschema; see Known issues. (#8803) - MySQL utf8mb4 installs no longer fail the runtime migration with "Specified key was too long". (#7441, #8865)
- Oracle: the default tenant id
""no longer fails startup (ORA-01400);Triggers.ActivityIdandSerializedMetadatasnapshots match the database; bulk upserts accept mixed null/value batches; runtime snapshots include the V3_7 Scheduling* indexes and NCLOB types; and StoredTrigger unique-index snapshots match the V3_6 migrations for PostgreSQL, SQLite and Oracle. (#8994, #9015, #8876, #9020, #8875, #9008, #8881, #8997, #8870, #8872, #8866, #8868) - MongoDB definition updates are applied atomically. (#8654)
- The default tenant can see legacy Dapper roles stored with a null or empty tenant id. (#8618, #9012)
- A failed tenant-activation migration is no longer swallowed: remaining startup tasks are not skipped, and the server no longer reports healthy with an incomplete activity registry. (#8754, #8781)
- The Labels API returns a proper error for a duplicate label name or a name longer than 255 characters, instead of HTTP 500. (#8756, #8782, #8829)
Identity, tenancy and secrets
- Role names are scoped to the tenant and role ids are generated, so tenants that share a store can use the same role name. (#8615, #8616, #8619)
[SingleNodeTask]now runs once per tenant rather than once overall. (#8637)- Resolved secret values are no longer persisted in activity state (the workflow instance and the execution journal). (#8758, #8775)
- The configuration secret store only resolves configured secrets, not arbitrary application configuration keys. (#8757, #8774)
User tasks
- User tasks no longer treat bookmarks from other activities (Cron, Delay, Event) as user tasks, which used to fail the workflow commit. (#8760, #8784)
GET /elsa/api/user-tasks/{id}no longer returns HTTP 500 for the claiming user. (#8761, #8785)- The
UserTaskactivity is registered, so it appears in the activity registry. (#8918) - Server-side support for user-task actions in JSON workflows shipped (#8787, part of #8763). The Studio designer side is still open; see Known issues.
BPMN and Studio
- A BPMN terminate in the same step that starts new work no longer leaves the workflow suspended forever. (#8818, #8832)
- A faulted BPMN call-activity child is routed to the error path. (#8920)
- Studio keeps list paging when you select a workflow instance and navigate back. (#7447, #8864)
- The Agents menu is hidden when the Agents feature is disabled on the server. (#8801, #8830)
Agents
- The Agents kernel no longer adds its own Trace-level console logger, so prompts and chat history are not written to stdout. (#8799, #8992, #9019)
- Agent kernel services keep
ILogger<T>resolvable. (#9026, #9030)
Dependency updates
- This release includes dependency updates. MySQL packages support .NET 8 and 9 only. (#9193)
Microsoft.AspNetCore.WebUtilitiesis updated. (#9243)
📦 New packages
First published at 3.10.1 (no earlier versions on nuget.org):
Elsa.Connections,Elsa.Connections.Credentials.Persistence.EFCore,Elsa.Connections.Credentials.Persistence.EFCore.PostgreSql,Elsa.Connections.Credentials.WorkflowsElsa.Workflows.Admission,Elsa.Workflows.Admission.Persistence.EFCore,Elsa.Workflows.Admission.Persistence.EFCore.PostgreSql
Studio and Extensions packages that were previously published from their own repositories are produced from this repository at 3.10.1.
⚠️ Upgrade notes and breaking changes
Upgrade the Elsa. packages you use to 3.10.1 together*, except the packages that stay at 3.9.0 (below).
Upgrade steps
- Token signing key is now required outside Development/Demo. The sample apps and container images no longer start with a built-in signing key in other environments: set
Identity__Tokens__SigningKey(configIdentity:Tokens:SigningKey). Tokens issued before the key is set or changed stop working once it changes, so users and clients need to sign in again or get new tokens. This applies to theelsa-server-and-studio-v3image too: it starts without the key, but every request, including login, then fails with an empty HTTP 500, so always setIdentity__Tokens__SigningKeywhen running these images outside Development. A clearer startup error is coming (#9106). - CLR access in JavaScript is now opt-in. Workflows whose JavaScript uses CLR types need
JavaScript__AllowClrAccess=true(configJavaScript:AllowClrAccess). - Rotate default credentials if you ran older container tags. If you deployed one of the earlier container images, change the default admin user's password and the default API key.
- Remove duplicate default-tenant labels (SQLite and MySQL) before upgrading. If an existing database has the same label name under both a NULL and an empty (
'') tenant id, the 3.10 migration does not merge the duplicates, and the first start fails (SQLite: unique-constraint error; MySQL: error 1295). Remove or rename the duplicate labels first; the next start then completes normally.
Behaviour changes
[SingleNodeTask]now runs once per tenant instead of once overall (#8637). Review third-partySingleNodeTaskimplementations for per-tenant execution.- The workflow dispatch outbox now deletes items only after delivery and fires
Dispatching/Dispatchedonce, at delivery (#8810). On hosts whose dispatcher can't route channels (no MassTransit), channels are still ignored as before. On hosts that can route channels, items for a channel the host cannot route are retried, then abandoned atMaxOutboxDeliveryAttempts(default 10) with a warning naming the channel (#8817); fix the channel config. The old processor constructor is[Obsolete]and uses the old non-durable delivery; switch to the new constructor. - Elsa 3.10 updates the JavaScript engine to Jint 4.17 and turns its stack-overflow guard on by default (#8990, #9013, #8966). Check scripts that depend on these behaviours:
JSON.parsenow accepts trailing commas.JSON.stringifyoutput no longer depends on the server's locale.parseInthandles some edge cases differently.- Deeply recursive scripts now stop with an error instead of crashing the process. If you need the old behaviour, set
JintOptions.EnableStackOverflowGuard = false.
Packages not republished in 3.10
- The legacy
Elsa.Secrets.Api,Elsa.Secrets.Core,Elsa.Secrets.Management,Elsa.Secrets.ModelsandElsa.Secrets.Scriptingpackages aren't republished in 3.10 and stay at 3.9.0. Elsa.Templatesstays at 3.9.0 for this release.
MySQL
MySQL packages support .NET 8 and 9 only (#9193).
Custom EF Core schema
Since #8803, every EF Core module can use a custom database schema except Secrets. The Secrets module still hard-codes the schema Elsa, so its migrations fail when you set a custom schema. Keep Secrets on the default Elsa schema for now. See Known issues (#8807).
🚧 Known issues
- A user task can still remain in Completing after the workflow has finished, until the reconciler runs, or go straight to Completed without a
TaskId. This is still open in 3.10.1. (#8762) - Timer and cron triggers still only fire for the default tenant. The Quartz tenant-scope fix is not in this release. (#9120)
- Updating, revoking or deleting a
*(wildcard) secret from a tenant still returns HTTP 500. (#8759) - Secrets EF Core migrations still hard-code the
Elsaschema, so they fail when you configure a custom schema. (#8807) - User-task actions still cannot be defined in JSON / Studio-designed workflows (the action label is
Input<string>). The server side shipped in #8787; the Studio side is still open. (#8763) - Drain force-cancel still does not reach running activities through their cancellation token. An interrupted instance can end up Finished or Cancelled instead of resumable. (#8489)
- #8541 is only partly addressed. This release includes the per-tenant
SingleNodeTaskchange (#8637); the rest of the tenant startup-performance work is still open. - #8777 and #8778 are still open.
🐳 Docker images
3.10.1 publishes elsaworkflows/elsa-server-v3 and elsaworkflows/elsa-server-and-studio-v3, tagged 3.10.1, 3.10 and latest. The combined image serves Studio again (#9201). Set Identity__Tokens__SigningKey when running these images outside Development (see upgrade step 1).