From 5c3770d3893d3dfc590e995080a7111eaa041235 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9mie=20DEVILLARD?= Date: Thu, 31 Oct 2024 11:01:19 +0100 Subject: [PATCH 1/8] Add TenantId Property to Span --- .../OpenTelemetryTracingActivityExecutionMiddleware.cs | 3 ++- .../OpenTelemetryTracingWorkflowExecutionMiddleware.cs | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/modules/Elsa.OpenTelemetry/Middleware/OpenTelemetryTracingActivityExecutionMiddleware.cs b/src/modules/Elsa.OpenTelemetry/Middleware/OpenTelemetryTracingActivityExecutionMiddleware.cs index 61c650527f..f2a40636ca 100644 --- a/src/modules/Elsa.OpenTelemetry/Middleware/OpenTelemetryTracingActivityExecutionMiddleware.cs +++ b/src/modules/Elsa.OpenTelemetry/Middleware/OpenTelemetryTracingActivityExecutionMiddleware.cs @@ -29,7 +29,8 @@ public async ValueTask InvokeAsync(ActivityExecutionContext context) span.SetTag("activity.type", activity.Type); span.SetTag("activity.name", activity.Name); span.SetTag("activityInstance.id", context.Id); - span.SetTag("activityExecution.startTimeUtc", span.StartTimeUtc); + span.SetTag("activityExecution.startTimeUtc", span.StartTimeUtc); + span.SetTag("tenantId", context.WorkflowExecutionContext.Workflow.Identity.TenantId); span.AddEvent(new ActivityEvent("Executing", tags: CreateStatusTags(context))); diff --git a/src/modules/Elsa.OpenTelemetry/Middleware/OpenTelemetryTracingWorkflowExecutionMiddleware.cs b/src/modules/Elsa.OpenTelemetry/Middleware/OpenTelemetryTracingWorkflowExecutionMiddleware.cs index af85f96eba..773eca835b 100644 --- a/src/modules/Elsa.OpenTelemetry/Middleware/OpenTelemetryTracingWorkflowExecutionMiddleware.cs +++ b/src/modules/Elsa.OpenTelemetry/Middleware/OpenTelemetryTracingWorkflowExecutionMiddleware.cs @@ -38,7 +38,8 @@ public override async ValueTask InvokeAsync(WorkflowExecutionContext context) span.SetTag("workflowDefinition.definitionId", workflow.Identity.DefinitionId); span.SetTag("workflowDefinition.version", workflow.Identity.Version); span.SetTag("workflowDefinition.name", workflow.WorkflowMetadata.Name); - span.SetTag("workflowExecution.startTimeUtc", span.StartTimeUtc); + span.SetTag("workflowExecution.startTimeUtc", span.StartTimeUtc); + span.SetTag("tenantId", workflow.Identity.TenantId); if(context.TriggerActivityId != null) { From c4a6ce2796ff2b2695dfb36ba2afdcf903cf8508 Mon Sep 17 00:00:00 2001 From: Robin Sue Date: Thu, 28 Nov 2024 02:48:11 +0100 Subject: [PATCH 2/8] Fix Primitive Collection serialization This was broken by both #5871 and #5682: 1. When a List was serialized, it was recognized as a primitive collection and thus plainly written to the JSON without any type information: ["d4d8404c-4357-47ff-a343-649a116539f5"] 2. When this JSON was deserialized, due to lack of type info, it was deserialized as List, containing strings. This is already not good. 3. When this List gets serialized again (e.g. due to multiple workflow suspends causing WorkflowState serialization), this time it fails the primitive collection recognition, because object is not a primitive type. It now gets serialized as {"_items": ["d4d8404c-4357-47ff-a343-649a116539f5"], "_type": "Object[]"} 4. When that JSON gets deserialized, it tries to ReadType() but ReadType() fails to parse Object[] since it lacks the logic from TypeJsonConverter to throw away the [] before looking up Object in the WellKnownTypeRegistry, so it returns null as a type. Without a type but being faced with a json object { ... } it now deserializes into an ExpandoObject 5. Any further serialization / deserializations will now cause the expando object to get nested deeper and deeper every time. --- .../Converters/PolymorphicObjectConverter.cs | 55 +++++++++---------- .../Serialization/JsonSerialization/Tests.cs | 17 ++++++ 2 files changed, 44 insertions(+), 28 deletions(-) diff --git a/src/modules/Elsa.Workflows.Core/Serialization/Converters/PolymorphicObjectConverter.cs b/src/modules/Elsa.Workflows.Core/Serialization/Converters/PolymorphicObjectConverter.cs index 1f3ccc9cb2..fe91112958 100644 --- a/src/modules/Elsa.Workflows.Core/Serialization/Converters/PolymorphicObjectConverter.cs +++ b/src/modules/Elsa.Workflows.Core/Serialization/Converters/PolymorphicObjectConverter.cs @@ -31,7 +31,7 @@ public override object Read(ref Utf8JsonReader reader, Type typeToConvert, JsonS if (reader.TokenType != JsonTokenType.StartObject && reader.TokenType != JsonTokenType.StartArray) return ReadPrimitive(ref reader, newOptions); - var targetType = ReadType(reader); + var targetType = ReadType(reader, options); if (targetType == null) return ReadObject(ref reader, newOptions); @@ -183,15 +183,7 @@ bool IsPrimitive(Type valueType) || valueType.IsEnum; } - bool IsListOfPrimitives(Type valueType) - { - var isEnumerable = typeof(IEnumerable).IsAssignableFrom(valueType) && valueType.IsGenericType && valueType.GetGenericArguments().Length == 1; - if (!isEnumerable) return false; - var elementType = valueType.GetGenericArguments()[0]; - return IsPrimitive(elementType); - } - - if (IsPrimitive(type) || IsListOfPrimitives(type)) + if (IsPrimitive(type)) { // Remove the converter so that we don't end up in an infinite loop. newOptions.Converters.RemoveWhere(x => x is PolymorphicObjectConverterFactory); @@ -207,8 +199,8 @@ bool IsListOfPrimitives(Type valueType) if (type == typeof(JObject) || type == typeof(JArray) || type == typeof(JsonObject) || type == typeof(JsonArray)) { writer.WriteStartObject(); - writer.WriteString(IslandPropertyName, value.ToString()); writer.WriteString(TypePropertyName, type.GetSimpleAssemblyQualifiedName()); + writer.WriteString(IslandPropertyName, value.ToString()); writer.WriteEndObject(); return; } @@ -253,20 +245,6 @@ bool IsListOfPrimitives(Type valueType) writer.WriteStartObject(); - if (jsonElement.ValueKind == JsonValueKind.Array) - { - writer.WritePropertyName(ItemsPropertyName); - jsonElement.WriteTo(writer); - } - else - { - foreach (var property in jsonElement.EnumerateObject().Where(property => !property.NameEquals(TypePropertyName))) - { - writer.WritePropertyName(property.Name); - property.Value.WriteTo(writer); - } - } - if (type != typeof(ExpandoObject)) { if (shouldWriteTypeField) @@ -283,10 +261,24 @@ bool IsListOfPrimitives(Type valueType) } } + if (jsonElement.ValueKind == JsonValueKind.Array) + { + writer.WritePropertyName(ItemsPropertyName); + jsonElement.WriteTo(writer); + } + else + { + foreach (var property in jsonElement.EnumerateObject().Where(property => !property.NameEquals(TypePropertyName))) + { + writer.WritePropertyName(property.Name); + property.Value.WriteTo(writer); + } + } + writer.WriteEndObject(); } - private Type? ReadType(Utf8JsonReader reader) + private Type? ReadType(Utf8JsonReader reader, JsonSerializerOptions options) { if (reader.TokenType != JsonTokenType.StartObject) return null; @@ -301,7 +293,14 @@ bool IsListOfPrimitives(Type valueType) if (reader.TokenType == JsonTokenType.PropertyName && reader.ValueTextEquals(TypePropertyName)) { reader.Read(); // Move to the value of the _type property - typeName = reader.GetString(); + if (options.Converters.OfType().FirstOrDefault() is { } typeJsonConverter) + { + return typeJsonConverter.Read(ref reader, typeof(Type), options); + } + else + { + typeName = reader.GetString(); + } break; } @@ -331,7 +330,7 @@ bool IsListOfPrimitives(Type valueType) } // If we found the _type property, attempt to resolve the type. - var targetType = typeName != null ? wellKnownTypeRegistry.TryGetType(typeName, out var type) ? type : Type.GetType(typeName) : default; + var targetType = typeName != null ? Type.GetType(typeName) : default; return targetType; } diff --git a/test/integration/Elsa.Workflows.IntegrationTests/Serialization/JsonSerialization/Tests.cs b/test/integration/Elsa.Workflows.IntegrationTests/Serialization/JsonSerialization/Tests.cs index 95329ed2cb..1a6ff38d5d 100644 --- a/test/integration/Elsa.Workflows.IntegrationTests/Serialization/JsonSerialization/Tests.cs +++ b/test/integration/Elsa.Workflows.IntegrationTests/Serialization/JsonSerialization/Tests.cs @@ -89,6 +89,23 @@ public void RoundtripComplexEnumerableObject() Assert.Equal(typeof(List), result.GetType()); } + [Fact] + public void RoundtripPrimitiveCollections() + { + var dict = new Dictionary + { + { "Content", new List + { + Guid.NewGuid() + } + } + }; + var jsonSerialized = SerializeUsingPayloadSerializer(dict); + var transformationModel = DeSerializeDictionaryUsingPayloadSerializer(jsonSerialized); + var result = transformationModel["Content"]; + Assert.Equal(typeof(List), result.GetType()); + } + private string SerializeUsingPayloadSerializer(object obj) { var payloadSerializer = _services.GetRequiredService(); From 3bc1cc3ae683eec1df58aec9b0657deaf772dde7 Mon Sep 17 00:00:00 2001 From: Robin Sue Date: Fri, 29 Nov 2024 13:31:15 +0100 Subject: [PATCH 3/8] Undo putting _type first for now --- .../Converters/PolymorphicObjectConverter.cs | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/modules/Elsa.Workflows.Core/Serialization/Converters/PolymorphicObjectConverter.cs b/src/modules/Elsa.Workflows.Core/Serialization/Converters/PolymorphicObjectConverter.cs index fe91112958..00c49da529 100644 --- a/src/modules/Elsa.Workflows.Core/Serialization/Converters/PolymorphicObjectConverter.cs +++ b/src/modules/Elsa.Workflows.Core/Serialization/Converters/PolymorphicObjectConverter.cs @@ -199,8 +199,8 @@ bool IsPrimitive(Type valueType) if (type == typeof(JObject) || type == typeof(JArray) || type == typeof(JsonObject) || type == typeof(JsonArray)) { writer.WriteStartObject(); - writer.WriteString(TypePropertyName, type.GetSimpleAssemblyQualifiedName()); writer.WriteString(IslandPropertyName, value.ToString()); + writer.WriteString(TypePropertyName, type.GetSimpleAssemblyQualifiedName()); writer.WriteEndObject(); return; } @@ -245,6 +245,20 @@ bool IsPrimitive(Type valueType) writer.WriteStartObject(); + if (jsonElement.ValueKind == JsonValueKind.Array) + { + writer.WritePropertyName(ItemsPropertyName); + jsonElement.WriteTo(writer); + } + else + { + foreach (var property in jsonElement.EnumerateObject().Where(property => !property.NameEquals(TypePropertyName))) + { + writer.WritePropertyName(property.Name); + property.Value.WriteTo(writer); + } + } + if (type != typeof(ExpandoObject)) { if (shouldWriteTypeField) @@ -261,20 +275,6 @@ bool IsPrimitive(Type valueType) } } - if (jsonElement.ValueKind == JsonValueKind.Array) - { - writer.WritePropertyName(ItemsPropertyName); - jsonElement.WriteTo(writer); - } - else - { - foreach (var property in jsonElement.EnumerateObject().Where(property => !property.NameEquals(TypePropertyName))) - { - writer.WritePropertyName(property.Name); - property.Value.WriteTo(writer); - } - } - writer.WriteEndObject(); } From 7f5355a9ed8a7d3057050315a69144e6d378ebf6 Mon Sep 17 00:00:00 2001 From: Robin Sue Date: Sun, 8 Dec 2024 23:24:46 +0100 Subject: [PATCH 4/8] Fix C# Script race conditino Compilation of the Script wasn't entirely thread safe, specifically, if the same script was being evaluated twice at the same time on an empty cache: Thread 1: Puts Script into cache, then starts compiling it Thread 2: Finds not yet compiled Script in cache, starts compiling it as well Thread 1: Done compiling, Assembly.Load it for running Thread 2: Done compiling, Assembly.Load it <--- Exception: Assembly with name XYZ already loaded The Solution is to use CreateDelegate which compiles the script the moment it is being put into the cache and the cache then only serves precompiled delegates that are immediately runnable. --- src/modules/Elsa.CSharp/Services/CSharpEvaluator.cs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/modules/Elsa.CSharp/Services/CSharpEvaluator.cs b/src/modules/Elsa.CSharp/Services/CSharpEvaluator.cs index 8a7e79cb3c..4e2942b075 100644 --- a/src/modules/Elsa.CSharp/Services/CSharpEvaluator.cs +++ b/src/modules/Elsa.CSharp/Services/CSharpEvaluator.cs @@ -49,12 +49,11 @@ public class CSharpEvaluator(INotificationSender notificationSender, IOptions GetPreCompiledScript(Script script) + private ScriptRunner GetCompiledScript(Script script) { var cacheKey = "csharp:script:" + Hash(script); @@ -63,7 +62,7 @@ private Script GetPreCompiledScript(Script script) if (_csharpOptions.ScriptCacheTimeout.HasValue) entry.SetSlidingExpiration(_csharpOptions.ScriptCacheTimeout.Value); - return script; + return script.CreateDelegate(); })!; } From 4d6b7a17fb2b25523f2eb275e532e5274548ecc9 Mon Sep 17 00:00:00 2001 From: Robin Sue Date: Fri, 6 Dec 2024 21:58:12 +0100 Subject: [PATCH 5/8] Add .NET 9.0 target --- Directory.Build.props | 3 +- Directory.Packages.props | 123 ++++++++++++------ build/_build.csproj | 2 +- docker/ElsaServer-Datadog.Dockerfile | 6 +- docker/ElsaServer.Dockerfile | 6 +- docker/ElsaServerAndStudio.Dockerfile | 6 +- docker/ElsaStudio.Dockerfile | 6 +- src/Directory.Build.props | 2 +- src/apps/Directory.Build.props | 2 +- .../Elsa.Server.LoadBalancer.csproj | 2 +- .../Elsa.Server.Web/Elsa.Server.Web.csproj | 6 +- src/apps/Elsa.Server.Web/Program.cs | 14 +- .../Elsa.ServerAndStudio.Web.csproj | 8 +- src/apps/Elsa.ServerAndStudio.Web/Program.cs | 30 +++-- .../Elsa.Studio.Web/Elsa.Studio.Web.csproj | 2 +- .../ElsaStudioWebAssembly.csproj | 2 +- ...rsistence.EntityFrameworkCore.MySql.csproj | 1 + .../Elsa.EntityFrameworkCore.MySql.csproj | 1 + .../Elsa.EntityFrameworkCore.Oracle.csproj | 1 + ...sa.Quartz.EntityFrameworkCore.MySql.csproj | 1 + src/modules/Elsa.Quartz/Elsa.Quartz.csproj | 2 +- test/Directory.Build.props | 2 +- ...Elsa.AzureServiceBus.ComponentTests.csproj | 2 +- .../Elsa.Workflows.ComponentTests.csproj | 2 +- .../Elsa.Activities.IntegrationTests.csproj | 2 +- .../Elsa.JavaScript.IntegrationTests.csproj | 2 +- .../Elsa.Workflows.PerformanceTests.csproj | 2 +- .../Elsa.MongoDb.UnitTests.csproj | 2 +- .../Elsa.Workflows.Core.UnitTests.csproj | 2 +- .../Elsa.Workflows.Runtime.UnitTests.csproj | 2 +- 30 files changed, 152 insertions(+), 92 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 1249834ea1..5911ae4e2e 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,7 +1,7 @@ Elsa Workflows Community - 2023 + 2024 https://github.com/elsa-workflows/elsa-core https://github.com/elsa-workflows/elsa-core @@ -38,6 +38,5 @@ 3.3.0-preview.666 - 8.0.5 \ No newline at end of file diff --git a/Directory.Packages.props b/Directory.Packages.props index 668cd731bd..f4a634379a 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -5,6 +5,11 @@ + + + + + @@ -26,80 +31,77 @@ + - - - - + + + - - + + - - - - + + + + - - + + - - - - - - + + + - - + + + - - - + + + - + + - - - + + - - + + - @@ -107,12 +109,6 @@ - - - - - - @@ -130,8 +126,8 @@ - + @@ -150,6 +146,8 @@ + + @@ -158,6 +156,7 @@ + @@ -167,12 +166,12 @@ - + - + @@ -181,13 +180,55 @@ - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/build/_build.csproj b/build/_build.csproj index 9cb5686945..3325957d71 100644 --- a/build/_build.csproj +++ b/build/_build.csproj @@ -2,7 +2,7 @@ Exe - net8.0 + net9.0 CS0649;CS0169;CA1050;CA1822;CA2211;IDE1006 .. diff --git a/docker/ElsaServer-Datadog.Dockerfile b/docker/ElsaServer-Datadog.Dockerfile index 6491995e53..a74069cf23 100644 --- a/docker/ElsaServer-Datadog.Dockerfile +++ b/docker/ElsaServer-Datadog.Dockerfile @@ -1,7 +1,7 @@ # Version: 1 # Description: Dockerfile for building and running Elsa Server -FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:8.0-bookworm-slim AS build +FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:9.0-bookworm-slim AS build WORKDIR /source # Copy sources. @@ -15,10 +15,10 @@ RUN dotnet restore "./src/bundles/Elsa.Server.Web/Elsa.Server.Web.csproj" # Build and publish (UseAppHost=false creates platform independent binaries). WORKDIR /source/src/bundles/Elsa.Server.Web RUN dotnet build "Elsa.Server.Web.csproj" -c Release -o /app/build -RUN dotnet publish "Elsa.Server.Web.csproj" -c Release -o /app/publish /p:UseAppHost=false --no-restore -f net8.0 +RUN dotnet publish "Elsa.Server.Web.csproj" -c Release -o /app/publish /p:UseAppHost=false --no-restore -f net9.0 # Move binaries into smaller base image. -FROM mcr.microsoft.com/dotnet/aspnet:8.0-bookworm-slim AS base +FROM mcr.microsoft.com/dotnet/aspnet:9.0-bookworm-slim AS base WORKDIR /app COPY --from=build /app/publish ./ diff --git a/docker/ElsaServer.Dockerfile b/docker/ElsaServer.Dockerfile index 903224fe19..b31307eb90 100644 --- a/docker/ElsaServer.Dockerfile +++ b/docker/ElsaServer.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:8.0-bookworm-slim AS build +FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:9.0-bookworm-slim AS build WORKDIR /source # copy sources. @@ -12,10 +12,10 @@ RUN dotnet restore "./src/apps/Elsa.Server.Web/Elsa.Server.Web.csproj" # build and publish (UseAppHost=false creates platform independent binaries). WORKDIR /source/src/apps/Elsa.Server.Web RUN dotnet build "Elsa.Server.Web.csproj" -c Release -o /app/build -RUN dotnet publish "Elsa.Server.Web.csproj" -c Release -o /app/publish /p:UseAppHost=false --no-restore -f net8.0 +RUN dotnet publish "Elsa.Server.Web.csproj" -c Release -o /app/publish /p:UseAppHost=false --no-restore -f net9.0 # move binaries into smaller base image. -FROM mcr.microsoft.com/dotnet/aspnet:8.0-bookworm-slim AS base +FROM mcr.microsoft.com/dotnet/aspnet:9.0-bookworm-slim AS base WORKDIR /app COPY --from=build /app/publish ./ diff --git a/docker/ElsaServerAndStudio.Dockerfile b/docker/ElsaServerAndStudio.Dockerfile index a7133fb324..27b33e992b 100644 --- a/docker/ElsaServerAndStudio.Dockerfile +++ b/docker/ElsaServerAndStudio.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:8.0-bookworm-slim AS build +FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:9.0-bookworm-slim AS build WORKDIR /source # copy sources. @@ -13,10 +13,10 @@ RUN dotnet restore "./src/apps/Elsa.ServerAndStudio.Web/Elsa.ServerAndStudio.Web # build and publish (UseAppHost=false creates platform independent binaries). WORKDIR /source/src/apps/Elsa.ServerAndStudio.Web RUN dotnet build "Elsa.ServerAndStudio.Web.csproj" -c Release -o /app/build -RUN dotnet publish "Elsa.ServerAndStudio.Web.csproj" -c Release -o /app/publish /p:UseAppHost=false --no-restore -f net8.0 +RUN dotnet publish "Elsa.ServerAndStudio.Web.csproj" -c Release -o /app/publish /p:UseAppHost=false --no-restore -f net9.0 # move binaries into smaller base image. -FROM mcr.microsoft.com/dotnet/aspnet:8.0-bookworm-slim AS base +FROM mcr.microsoft.com/dotnet/aspnet:9.0-bookworm-slim AS base WORKDIR /app COPY --from=build /app/publish ./ diff --git a/docker/ElsaStudio.Dockerfile b/docker/ElsaStudio.Dockerfile index b0dc8339da..7f2eba83c8 100644 --- a/docker/ElsaStudio.Dockerfile +++ b/docker/ElsaStudio.Dockerfile @@ -1,4 +1,4 @@ -FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:8.0-bookworm-slim AS build +FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:9.0-bookworm-slim AS build WORKDIR /source # copy sources. @@ -13,10 +13,10 @@ RUN dotnet restore "./src/apps/Elsa.Studio.Web/Elsa.Studio.Web.csproj" # build and publish (UseAppHost=false creates platform independent binaries). WORKDIR /source/src/apps/Elsa.Studio.Web RUN dotnet build "Elsa.Studio.Web.csproj" -c Release -o /app/build -RUN dotnet publish "Elsa.Studio.Web.csproj" -c Release -o /app/publish /p:UseAppHost=false --no-restore -f net8.0 +RUN dotnet publish "Elsa.Studio.Web.csproj" -c Release -o /app/publish /p:UseAppHost=false --no-restore -f net9.0 # move binaries into smaller base image. -FROM mcr.microsoft.com/dotnet/aspnet:8.0-bookworm-slim AS base +FROM mcr.microsoft.com/dotnet/aspnet:9.0-bookworm-slim AS base WORKDIR /app COPY --from=build /app/publish ./ diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 607b673989..cb5db9709a 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -3,7 +3,7 @@ - net6.0;net8.0 + net6.0;net8.0;net9.0 diff --git a/src/apps/Directory.Build.props b/src/apps/Directory.Build.props index 1ead413446..2e6c5f63d7 100644 --- a/src/apps/Directory.Build.props +++ b/src/apps/Directory.Build.props @@ -1,6 +1,6 @@ - net8.0 + net9.0 latest enable enable diff --git a/src/apps/Elsa.Server.LoadBalancer/Elsa.Server.LoadBalancer.csproj b/src/apps/Elsa.Server.LoadBalancer/Elsa.Server.LoadBalancer.csproj index 90dec8fea1..1b2b2b6889 100644 --- a/src/apps/Elsa.Server.LoadBalancer/Elsa.Server.LoadBalancer.csproj +++ b/src/apps/Elsa.Server.LoadBalancer/Elsa.Server.LoadBalancer.csproj @@ -1,7 +1,7 @@ - net8.0 + net9.0 Linux false latest diff --git a/src/apps/Elsa.Server.Web/Elsa.Server.Web.csproj b/src/apps/Elsa.Server.Web/Elsa.Server.Web.csproj index 67c92b74c9..bf4d531715 100644 --- a/src/apps/Elsa.Server.Web/Elsa.Server.Web.csproj +++ b/src/apps/Elsa.Server.Web/Elsa.Server.Web.csproj @@ -3,17 +3,17 @@ - + - + - + diff --git a/src/apps/Elsa.Server.Web/Program.cs b/src/apps/Elsa.Server.Web/Program.cs index 075d93e1a9..290e36ccfb 100644 --- a/src/apps/Elsa.Server.Web/Program.cs +++ b/src/apps/Elsa.Server.Web/Program.cs @@ -149,8 +149,10 @@ ef.UseSqlServer(sqlServerConnectionString!); else if (sqlDatabaseProvider == SqlDatabaseProvider.PostgreSql) ef.UsePostgreSql(postgresConnectionString!); +#if !NET9_0 else if (sqlDatabaseProvider == SqlDatabaseProvider.MySql) ef.UseMySql(mySqlConnectionString); +#endif else if (sqlDatabaseProvider == SqlDatabaseProvider.CockroachDb) ef.UsePostgreSql(cockroachDbConnectionString!); else @@ -183,8 +185,10 @@ ef.UseSqlServer(sqlServerConnectionString!); else if (sqlDatabaseProvider == SqlDatabaseProvider.PostgreSql) ef.UsePostgreSql(postgresConnectionString!); +#if !NET9_0 else if (sqlDatabaseProvider == SqlDatabaseProvider.MySql) ef.UseMySql(mySqlConnectionString); +#endif else if (sqlDatabaseProvider == SqlDatabaseProvider.CockroachDb) ef.UsePostgreSql(cockroachDbConnectionString!); else @@ -254,8 +258,10 @@ } else if (sqlDatabaseProvider == SqlDatabaseProvider.PostgreSql) ef.UsePostgreSql(postgresConnectionString!); +#if !NET9_0 else if (sqlDatabaseProvider == SqlDatabaseProvider.MySql) ef.UseMySql(mySqlConnectionString); +#endif else if (sqlDatabaseProvider == SqlDatabaseProvider.CockroachDb) ef.UsePostgreSql(cockroachDbConnectionString!); else @@ -380,8 +386,10 @@ ef.UseSqlServer(sqlServerConnectionString); else if (sqlDatabaseProvider == SqlDatabaseProvider.PostgreSql) ef.UsePostgreSql(postgresConnectionString); +#if !NET9_0 else if (sqlDatabaseProvider == SqlDatabaseProvider.MySql) ef.UseMySql(mySqlConnectionString); +#endif else if (sqlDatabaseProvider == SqlDatabaseProvider.CockroachDb) ef.UsePostgreSql(cockroachDbConnectionString!); else @@ -522,7 +530,7 @@ else { tenants.UseStoreBasedTenantsProvider(); - + tenants.UseTenantManagement(management => { if (persistenceProvider == PersistenceProvider.MongoDb) @@ -536,12 +544,14 @@ if (sqlDatabaseProvider == SqlDatabaseProvider.Sqlite) ef.UseSqlite(sqliteConnectionString); if (sqlDatabaseProvider == SqlDatabaseProvider.SqlServer) ef.UseSqlServer(sqlServerConnectionString); if (sqlDatabaseProvider == SqlDatabaseProvider.PostgreSql) ef.UsePostgreSql(postgresConnectionString); +#if !NET9_0 if (sqlDatabaseProvider == SqlDatabaseProvider.MySql) ef.UseMySql(mySqlConnectionString); +#endif if (sqlDatabaseProvider == SqlDatabaseProvider.CockroachDb) ef.UsePostgreSql(cockroachDbConnectionString); }); } }); - + tenants.UseTenantManagementEndpoints(); } }); diff --git a/src/apps/Elsa.ServerAndStudio.Web/Elsa.ServerAndStudio.Web.csproj b/src/apps/Elsa.ServerAndStudio.Web/Elsa.ServerAndStudio.Web.csproj index 1c73d2f231..7cfa13de34 100644 --- a/src/apps/Elsa.ServerAndStudio.Web/Elsa.ServerAndStudio.Web.csproj +++ b/src/apps/Elsa.ServerAndStudio.Web/Elsa.ServerAndStudio.Web.csproj @@ -1,7 +1,7 @@ - + - net8.0 + net9.0 Linux false @@ -9,7 +9,7 @@ - + @@ -24,7 +24,7 @@ - + diff --git a/src/apps/Elsa.ServerAndStudio.Web/Program.cs b/src/apps/Elsa.ServerAndStudio.Web/Program.cs index 62157e33e0..581f25ec55 100644 --- a/src/apps/Elsa.ServerAndStudio.Web/Program.cs +++ b/src/apps/Elsa.ServerAndStudio.Web/Program.cs @@ -65,25 +65,29 @@ if (useCaching) management.UseCache(); - if (sqlDatabaseProvider == SqlDatabaseProvider.MySql) - management.UseEntityFrameworkCore(ef => ef.UseMySql(mySqlConnectionString)); - else if (sqlDatabaseProvider == SqlDatabaseProvider.SqlServer) + if (sqlDatabaseProvider == SqlDatabaseProvider.SqlServer) management.UseEntityFrameworkCore(ef => ef.UseSqlServer(sqlServerConnectionString)); - else if(sqlDatabaseProvider == SqlDatabaseProvider.PostgreSql) + else if (sqlDatabaseProvider == SqlDatabaseProvider.PostgreSql) management.UseEntityFrameworkCore(ef => ef.UsePostgreSql(postgreSqlConnectionString)); else if (sqlDatabaseProvider == SqlDatabaseProvider.Sqlite) management.UseEntityFrameworkCore(ef => ef.UseSqlite(sqliteConnectionString)); +#if !NET9_0 + else if (sqlDatabaseProvider == SqlDatabaseProvider.MySql) + management.UseEntityFrameworkCore(ef => ef.UseMySql(mySqlConnectionString)); +#endif }) .UseWorkflowRuntime(runtime => { - if (sqlDatabaseProvider == SqlDatabaseProvider.MySql) - runtime.UseEntityFrameworkCore(ef => ef.UseMySql(mySqlConnectionString)); - else if (sqlDatabaseProvider == SqlDatabaseProvider.SqlServer) + if (sqlDatabaseProvider == SqlDatabaseProvider.SqlServer) runtime.UseEntityFrameworkCore(ef => ef.UseSqlServer(sqlServerConnectionString)); - else if(sqlDatabaseProvider == SqlDatabaseProvider.PostgreSql) + else if (sqlDatabaseProvider == SqlDatabaseProvider.PostgreSql) runtime.UseEntityFrameworkCore(ef => ef.UsePostgreSql(postgreSqlConnectionString)); else if (sqlDatabaseProvider == SqlDatabaseProvider.Sqlite) runtime.UseEntityFrameworkCore(ef => ef.UseSqlite(sqliteConnectionString)); +#if !NET9_0 + else if (sqlDatabaseProvider == SqlDatabaseProvider.MySql) + runtime.UseEntityFrameworkCore(ef => ef.UseMySql(mySqlConnectionString)); +#endif if (useMassTransit) { @@ -134,14 +138,16 @@ .UseAgentsApi() .UseAgentPersistence(persistence => persistence.UseEntityFrameworkCore(ef => { - if (sqlDatabaseProvider == SqlDatabaseProvider.MySql) - ef.UseMySql(mySqlConnectionString); - else if (sqlDatabaseProvider == SqlDatabaseProvider.SqlServer) + if (sqlDatabaseProvider == SqlDatabaseProvider.SqlServer) ef.UseSqlServer(sqlServerConnectionString); - else if(sqlDatabaseProvider == SqlDatabaseProvider.PostgreSql) + else if (sqlDatabaseProvider == SqlDatabaseProvider.PostgreSql) ef.UsePostgreSql(postgreSqlConnectionString); else if (sqlDatabaseProvider == SqlDatabaseProvider.Sqlite) ef.UseSqlite(sqliteConnectionString); +#if !NET9_0 + else if (sqlDatabaseProvider == SqlDatabaseProvider.MySql) + ef.UseMySql(mySqlConnectionString); +#endif })) .UseAgentActivities() .AddActivitiesFrom() diff --git a/src/apps/Elsa.Studio.Web/Elsa.Studio.Web.csproj b/src/apps/Elsa.Studio.Web/Elsa.Studio.Web.csproj index 20f8481e77..8fb1118017 100644 --- a/src/apps/Elsa.Studio.Web/Elsa.Studio.Web.csproj +++ b/src/apps/Elsa.Studio.Web/Elsa.Studio.Web.csproj @@ -1,7 +1,7 @@ - net8.0 + net9.0 Linux false diff --git a/src/apps/ElsaStudioWebAssembly/ElsaStudioWebAssembly.csproj b/src/apps/ElsaStudioWebAssembly/ElsaStudioWebAssembly.csproj index 9e93808f46..f4d84a5f4a 100644 --- a/src/apps/ElsaStudioWebAssembly/ElsaStudioWebAssembly.csproj +++ b/src/apps/ElsaStudioWebAssembly/ElsaStudioWebAssembly.csproj @@ -1,7 +1,7 @@ - net8.0 + net9.0 diff --git a/src/modules/Elsa.Agents.Persistence.EntityFrameworkCore.MySql/Elsa.Agents.Persistence.EntityFrameworkCore.MySql.csproj b/src/modules/Elsa.Agents.Persistence.EntityFrameworkCore.MySql/Elsa.Agents.Persistence.EntityFrameworkCore.MySql.csproj index ba9da32959..04d22bca57 100644 --- a/src/modules/Elsa.Agents.Persistence.EntityFrameworkCore.MySql/Elsa.Agents.Persistence.EntityFrameworkCore.MySql.csproj +++ b/src/modules/Elsa.Agents.Persistence.EntityFrameworkCore.MySql/Elsa.Agents.Persistence.EntityFrameworkCore.MySql.csproj @@ -1,6 +1,7 @@  + net6.0;net8.0 Provides an EF Core migrations for MySQL for the Agents Persistence module. elsa module agents semantic kernel llm ai persistence efcore entity framework core mysql diff --git a/src/modules/Elsa.EntityFrameworkCore.MySql/Elsa.EntityFrameworkCore.MySql.csproj b/src/modules/Elsa.EntityFrameworkCore.MySql/Elsa.EntityFrameworkCore.MySql.csproj index c00d3b8d70..c8ad4abb87 100644 --- a/src/modules/Elsa.EntityFrameworkCore.MySql/Elsa.EntityFrameworkCore.MySql.csproj +++ b/src/modules/Elsa.EntityFrameworkCore.MySql/Elsa.EntityFrameworkCore.MySql.csproj @@ -1,6 +1,7 @@ + net6.0;net8.0 Provides MySQL EF Core migrations for various modules. diff --git a/src/modules/Elsa.EntityFrameworkCore.Oracle/Elsa.EntityFrameworkCore.Oracle.csproj b/src/modules/Elsa.EntityFrameworkCore.Oracle/Elsa.EntityFrameworkCore.Oracle.csproj index c4ecf6716d..a4c4c77143 100644 --- a/src/modules/Elsa.EntityFrameworkCore.Oracle/Elsa.EntityFrameworkCore.Oracle.csproj +++ b/src/modules/Elsa.EntityFrameworkCore.Oracle/Elsa.EntityFrameworkCore.Oracle.csproj @@ -1,6 +1,7 @@  + net6.0;net8.0 Provides Oracle EF Core migrations for various modules. diff --git a/src/modules/Elsa.Quartz.EntityFrameworkCore.MySql/Elsa.Quartz.EntityFrameworkCore.MySql.csproj b/src/modules/Elsa.Quartz.EntityFrameworkCore.MySql/Elsa.Quartz.EntityFrameworkCore.MySql.csproj index 20bb854d82..e9362407a3 100644 --- a/src/modules/Elsa.Quartz.EntityFrameworkCore.MySql/Elsa.Quartz.EntityFrameworkCore.MySql.csproj +++ b/src/modules/Elsa.Quartz.EntityFrameworkCore.MySql/Elsa.Quartz.EntityFrameworkCore.MySql.csproj @@ -1,6 +1,7 @@ + net6.0;net8.0 Provides EF Core migrations for Quartz.NET. diff --git a/src/modules/Elsa.Quartz/Elsa.Quartz.csproj b/src/modules/Elsa.Quartz/Elsa.Quartz.csproj index 4af095308f..d58faa3c69 100644 --- a/src/modules/Elsa.Quartz/Elsa.Quartz.csproj +++ b/src/modules/Elsa.Quartz/Elsa.Quartz.csproj @@ -1,7 +1,7 @@ - net6.0;net8.0 + net6.0;net8.0;net9.0 Provides integration with the Quartz.NET library and provide am implementation of Elsa's IJobScheduler using Quartz.NET. diff --git a/test/Directory.Build.props b/test/Directory.Build.props index fe20ad6f84..740c5090c3 100644 --- a/test/Directory.Build.props +++ b/test/Directory.Build.props @@ -3,7 +3,7 @@ - net8.0 + net9.0 enable enable false diff --git a/test/component/Elsa.AzureServiceBus.ComponentTests/Elsa.AzureServiceBus.ComponentTests.csproj b/test/component/Elsa.AzureServiceBus.ComponentTests/Elsa.AzureServiceBus.ComponentTests.csproj index 89ed27ddee..6c8b199eac 100644 --- a/test/component/Elsa.AzureServiceBus.ComponentTests/Elsa.AzureServiceBus.ComponentTests.csproj +++ b/test/component/Elsa.AzureServiceBus.ComponentTests/Elsa.AzureServiceBus.ComponentTests.csproj @@ -1,7 +1,7 @@ - net8.0 + net9.0 enable enable diff --git a/test/component/Elsa.Workflows.ComponentTests/Elsa.Workflows.ComponentTests.csproj b/test/component/Elsa.Workflows.ComponentTests/Elsa.Workflows.ComponentTests.csproj index 84ef3ece21..15b32f89be 100644 --- a/test/component/Elsa.Workflows.ComponentTests/Elsa.Workflows.ComponentTests.csproj +++ b/test/component/Elsa.Workflows.ComponentTests/Elsa.Workflows.ComponentTests.csproj @@ -1,7 +1,7 @@ - net8.0 + net9.0 enable enable diff --git a/test/integration/Elsa.Activities.IntegrationTests/Elsa.Activities.IntegrationTests.csproj b/test/integration/Elsa.Activities.IntegrationTests/Elsa.Activities.IntegrationTests.csproj index 697b6ab186..e8a382546f 100644 --- a/test/integration/Elsa.Activities.IntegrationTests/Elsa.Activities.IntegrationTests.csproj +++ b/test/integration/Elsa.Activities.IntegrationTests/Elsa.Activities.IntegrationTests.csproj @@ -1,7 +1,7 @@ - net8.0 + net9.0 diff --git a/test/integration/Elsa.JavaScript.IntegrationTests/Elsa.JavaScript.IntegrationTests.csproj b/test/integration/Elsa.JavaScript.IntegrationTests/Elsa.JavaScript.IntegrationTests.csproj index c4e240b161..d82fe514dd 100644 --- a/test/integration/Elsa.JavaScript.IntegrationTests/Elsa.JavaScript.IntegrationTests.csproj +++ b/test/integration/Elsa.JavaScript.IntegrationTests/Elsa.JavaScript.IntegrationTests.csproj @@ -1,7 +1,7 @@ - net8.0 + net9.0 diff --git a/test/performance/Elsa.Workflows.PerformanceTests/Elsa.Workflows.PerformanceTests.csproj b/test/performance/Elsa.Workflows.PerformanceTests/Elsa.Workflows.PerformanceTests.csproj index c0dea99e4d..fc1b99f935 100644 --- a/test/performance/Elsa.Workflows.PerformanceTests/Elsa.Workflows.PerformanceTests.csproj +++ b/test/performance/Elsa.Workflows.PerformanceTests/Elsa.Workflows.PerformanceTests.csproj @@ -1,7 +1,7 @@ - net8.0 + net9.0 enable enable diff --git a/test/unit/Elsa.MongoDb.UnitTests/Elsa.MongoDb.UnitTests.csproj b/test/unit/Elsa.MongoDb.UnitTests/Elsa.MongoDb.UnitTests.csproj index d511196d0f..a729c87e8c 100644 --- a/test/unit/Elsa.MongoDb.UnitTests/Elsa.MongoDb.UnitTests.csproj +++ b/test/unit/Elsa.MongoDb.UnitTests/Elsa.MongoDb.UnitTests.csproj @@ -1,7 +1,7 @@  - net8.0 + net9.0 diff --git a/test/unit/Elsa.Workflows.Core.UnitTests/Elsa.Workflows.Core.UnitTests.csproj b/test/unit/Elsa.Workflows.Core.UnitTests/Elsa.Workflows.Core.UnitTests.csproj index 524932680a..8b83eaf765 100644 --- a/test/unit/Elsa.Workflows.Core.UnitTests/Elsa.Workflows.Core.UnitTests.csproj +++ b/test/unit/Elsa.Workflows.Core.UnitTests/Elsa.Workflows.Core.UnitTests.csproj @@ -1,7 +1,7 @@ - net8.0 + net9.0 diff --git a/test/unit/Elsa.Workflows.Runtime.UnitTests/Elsa.Workflows.Runtime.UnitTests.csproj b/test/unit/Elsa.Workflows.Runtime.UnitTests/Elsa.Workflows.Runtime.UnitTests.csproj index 243a3ddde6..6e760c2342 100644 --- a/test/unit/Elsa.Workflows.Runtime.UnitTests/Elsa.Workflows.Runtime.UnitTests.csproj +++ b/test/unit/Elsa.Workflows.Runtime.UnitTests/Elsa.Workflows.Runtime.UnitTests.csproj @@ -1,7 +1,7 @@ - net8.0 + net9.0 From dae77709d4b96b4a8d90c02d011c5f0663ab6745 Mon Sep 17 00:00:00 2001 From: Robin Sue Date: Fri, 6 Dec 2024 22:22:30 +0100 Subject: [PATCH 6/8] Add .NET 9 to actions --- .github/workflows/packages.yml | 5 ++++- .github/workflows/pr.yml | 3 +++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/packages.yml b/.github/workflows/packages.yml index a2ba52ccea..f2ad9875a3 100644 --- a/.github/workflows/packages.yml +++ b/.github/workflows/packages.yml @@ -36,7 +36,7 @@ jobs: echo "BRANCH_NAME=${BRANCH_NAME}" >> $GITHUB_ENV echo "PACKAGE_PREFIX=${PACKAGE_PREFIX}" >> $GITHUB_ENV - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Verify commit exists in branch run: | if [[ "${{ github.ref }}" == refs/tags/* && "${{ github.event_name }}" == "release" && ("${{ github.event.action }}" == "published" || "${{ github.event.action }}" == "prereleased")]]; then @@ -60,6 +60,9 @@ jobs: # with: # java-version: '17' # distribution: 'adopt' + - uses: actions/setup-dotnet@v4 + with: + dotnet-version: 9.x # - name: Install SonarScanner for .NET # run: dotnet tool install --global dotnet-sonarscanner # - name: Install Coverlet for code coverage diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index b6394a0898..bb879d54bf 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -33,5 +33,8 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 + - uses: actions/setup-dotnet@v4 + with: + dotnet-version: 9.x - name: 'Run: Compile, Test, Pack' run: ./build.cmd Compile Test Pack From 17382b981eb7837f458baae5ff3f7cfd65bea8e5 Mon Sep 17 00:00:00 2001 From: Robin Sue Date: Fri, 6 Dec 2024 22:26:23 +0100 Subject: [PATCH 7/8] Upgrade Nuke to remove BinaryFormatter dependency --- Directory.Packages.props | 2 +- build/Build.cs | 8 +++----- build/_build.csproj | 6 +++--- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index f4a634379a..3fc5bf0d8c 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -71,7 +71,7 @@ - + diff --git a/build/Build.cs b/build/Build.cs index 769673dd17..840f70e426 100644 --- a/build/Build.cs +++ b/build/Build.cs @@ -76,14 +76,12 @@ protected override void OnBuildInitialized() ((IHazSolution)this).Solution.AllProjects.Where(x => x.Name.EndsWith("Tests")); public Configure TestProjectSettings => (testSettings, project) => testSettings - .When(GitHubActions.Instance is not null, settings => settings.AddLoggers("GitHubActions;report-warnings=false")) - .When(AnalyseCode, settings => settings + .When(_ => GitHubActions.Instance is not null, settings => settings.AddLoggers("GitHubActions;report-warnings=false")) + .When(_ => AnalyseCode, settings => settings .SetCoverletOutputFormat(CoverletOutputFormat.opencover) .EnableCollectCoverage() .SetResultsDirectory(TestResultDirectory) .SetCoverletOutput($"{TestResultDirectory}/opencoverCoverage.xml") - .SetProcessArgumentConfigurator(args => - args.Add("--collect:\"XPlat Code Coverage;Format=opencover\"") - ) + .AddProcessAdditionalArguments("--collect:\"XPlat Code Coverage;Format=opencover\"") ); } \ No newline at end of file diff --git a/build/_build.csproj b/build/_build.csproj index 3325957d71..66629bd30a 100644 --- a/build/_build.csproj +++ b/build/_build.csproj @@ -1,4 +1,4 @@ - + Exe @@ -19,12 +19,12 @@ - + - + From 7697b35f4741f41edb07d73e933cea48b6325274 Mon Sep 17 00:00:00 2001 From: Robin Sue Date: Tue, 10 Dec 2024 21:17:00 +0100 Subject: [PATCH 8/8] Add Oracle EFC9 Provider --- Directory.Packages.props | 2 +- .../Elsa.EntityFrameworkCore.Oracle.csproj | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 3fc5bf0d8c..a69ea25296 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -223,7 +223,7 @@ - + diff --git a/src/modules/Elsa.EntityFrameworkCore.Oracle/Elsa.EntityFrameworkCore.Oracle.csproj b/src/modules/Elsa.EntityFrameworkCore.Oracle/Elsa.EntityFrameworkCore.Oracle.csproj index a4c4c77143..c4ecf6716d 100644 --- a/src/modules/Elsa.EntityFrameworkCore.Oracle/Elsa.EntityFrameworkCore.Oracle.csproj +++ b/src/modules/Elsa.EntityFrameworkCore.Oracle/Elsa.EntityFrameworkCore.Oracle.csproj @@ -1,7 +1,6 @@  - net6.0;net8.0 Provides Oracle EF Core migrations for various modules.