Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update V3.x Branch with Latest Changes from Branch Dev #2958

Merged
merged 23 commits into from
Nov 13, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
4a5edf8
Merge pull request #2559 from Azure/dev
bachuv Aug 29, 2023
c9ad121
Merge pull request #2562 from Azure/dev
bachuv Aug 31, 2023
e378bfa
Merge pull request #2579 from Azure/dev
jviau Sep 12, 2023
32680a3
Merge pull request #2583 from Azure/dev
jviau Sep 13, 2023
92c6712
Merge pull request #2637 from Azure/dev
nytian Oct 12, 2023
e7c22eb
Merge pull request #2643 from Azure/dev
nytian Oct 17, 2023
ddf88b9
Merge pull request #2670 from Azure/dev
bachuv Nov 13, 2023
3dd943b
Merge dev into main for worker extension v1.1.0 release
bachuv Nov 14, 2023
3784988
Merge pull request #2724 from Azure/dev
nytian Jan 12, 2024
0596909
Merge pull request #2817 from Azure/dev
nytian May 14, 2024
c3f5504
Merge Branch dev to Branch main #2837 from Azure/dev
nytian May 29, 2024
58cad68
build java smoke test on build pipeline (#2941)
davidmrdavid Oct 16, 2024
6a63e24
Add automated release pipeline (#2932)
davidmrdavid Oct 16, 2024
48da8ad
Merge pull request #2943 from Azure/main
davidmrdavid Oct 17, 2024
820e9dd
Fix custom connection name not working when using IDurableClientFacto…
hctan Oct 17, 2024
7dcbab4
Correct typo in analyzer description from definied -> defined (#2901)
schlechtums Oct 17, 2024
4cc6ec2
Change 'durabletask-extension.official' to `durable-extension.officia…
davidmrdavid Oct 21, 2024
a7c6d69
Implement CreateHttpManagementPayload API in Durable Worker Extension…
nytian Oct 23, 2024
8470f3d
Fail fast if `ExtendedSessionsEnabled` is requested for a non-.NET wo…
gukoff Oct 28, 2024
79e2295
Add WaitForCompletionOrCreateCheckStatusResponseAsync to Microsoft.Az…
dixonte Nov 5, 2024
aa30752
Make durable client registration idempotent. (#2950)
jviau Nov 8, 2024
9facae2
merge latest change from main
nytian Nov 13, 2024
cbedfe5
update CustomTestStorageAccountProvider to use IStorageServiceClientP…
nytian Nov 13, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
99 changes: 99 additions & 0 deletions eng/ci/publish.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
# This is our package-publishing pipeline.
# When executed, it automatically publishes the output of the 'official pipeline' (the nupkgs) to our internal ADO feed.
# It may optionally also publish the packages to NuGet, but that is gated behind a manual approval.

trigger: none # only trigger is manual
pr: none # only trigger is manual

# We include to this variable group to be able to access the NuGet API key
variables:
- group: durabletask_config

resources:
repositories:
- repository: 1es
type: git
name: 1ESPipelineTemplates/1ESPipelineTemplates
ref: refs/tags/release
- repository: eng
type: git
name: engineering
ref: refs/tags/release

pipelines:
- pipeline: officialPipeline # Reference to the pipeline to be used as an artifact source
source: 'durable-extension.official'

extends:
template: v1/1ES.Official.PipelineTemplate.yml@1es
parameters:
pool:
name: 1es-pool-azfunc
image: 1es-windows-2022
os: windows

stages:
- stage: release
jobs:

# ADO release
- job: adoRelease
displayName: ADO Release
templateContext:
inputs:
- input: pipelineArtifact
pipeline: officialPipeline # Pipeline reference, as defined in the resources section
artifactName: drop
targetPath: $(System.DefaultWorkingDirectory)/drop

# The preferred method of release on 1ES is by populating the 'output' section of a 1ES template.
# We use this method to release to ADO, but not to release to NuGet; this is explained in the 'nugetRelease' job.
# To read more about the 'output syntax', see:
# - https://eng.ms/docs/cloud-ai-platform/devdiv/one-engineering-system-1es/1es-docs/1es-pipeline-templates/features/outputs
# - https://eng.ms/docs/cloud-ai-platform/devdiv/one-engineering-system-1es/1es-docs/1es-pipeline-templates/features/outputs/nuget-packages
outputs:
- output: nuget # 'nuget' is an output "type" for pushing to NuGet
displayName: 'Push to durabletask ADO feed'
packageParentPath: $(System.DefaultWorkingDirectory) # This needs to be set to some prefix of the `packagesToPush` parameter. Apparently it helps with SDL tooling
packagesToPush: '$(System.DefaultWorkingDirectory)/**/*.nupkg;!$(System.DefaultWorkingDirectory)/**/*.symbols.nupkg'
publishVstsFeed: '3f99e810-c336-441f-8892-84983093ad7f/c895696b-ce37-4fe7-b7ce-74333a04f8bf'
allowPackageConflicts: true

# NuGet approval gate
- job: nugetApproval
displayName: NuGetApproval
pool: server # This task only works when executed on serverl pools, so this needs to be specified
steps:
# Wait for manual approval.
- task: ManualValidation@1
inputs:
instructions: Confirm you want to push to NuGet
onTimeout: 'reject'

# NuGet release
- job: nugetRelease
displayName: NuGet Release
dependsOn:
- nugetApproval
- adoRelease
condition: succeeded('nugetApproval', 'adoRelease')
templateContext:
inputs:
- input: pipelineArtifact
pipeline: officialPipeline # Pipeline reference as defined in the resources section
artifactName: drop
targetPath: $(System.DefaultWorkingDirectory)/drop
# Ideally, we would push to NuGet using the 1ES "template output" syntax, like we do for ADO.
# Unfortunately, that syntax does not allow for skipping duplicates when pushing to NuGet feeds
# (i.e; not failing the job when trying to push a package version that already exists on NuGet).
# This is a problem for us because our pipelines often produce multiple packages, and we want to be able to
# perform a 'nuget push *.nupkg' that skips packages already on NuGet while pushing the rest.
# Therefore, we use a regular .NET Core ADO Task to publish the packages until that usability gap is addressed.
steps:
- task: DotNetCoreCLI@2
displayName: 'Push to nuget.org'
inputs:
command: custom
custom: nuget
arguments: 'push "*.nupkg" --api-key $(nuget_api_key) --skip-duplicate --source https://api.nuget.org/v3/index.json'
workingDirectory: '$(System.DefaultWorkingDirectory)/drop'
11 changes: 11 additions & 0 deletions eng/templates/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -124,3 +124,14 @@ jobs:
SourceFolder: '$(System.DefaultWorkingDirectory)/test/PerfTests/DFPerfTests/Output/'
Contents: '**'
TargetFolder: '$(System.DefaultWorkingDirectory)/azure-functions-durable-extension/'

# We also need to build the Java smoke test, for CodeQL compliance
# We don't need to build the other smoke tests, because they can be analyzed without being compiled,
# as they're interpreted languages.
# This could be a separate pipeline, but the task is so small that it's paired with the .NET code build
# for convenience.
- pwsh: |
cd ./test/SmokeTests/OOProcSmokeTests/durableJava/
gradle build
ls
displayName: 'Build Java OOProc test (for CodeQL compliance)'
7 changes: 5 additions & 2 deletions release_notes.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,13 @@

### New Features

- Fail fast if extendedSessionsEnabled set to 'true' for the worker type that doesn't support extended sessions (https://github.com/Azure/azure-functions-durable-extension/pull/2732).
- Added an `IFunctionsWorkerApplicationBuilder.ConfigureDurableExtension()` extension method for cases where auto-registration does not work (no source gen running). (#2950)

### Bug Fixes

- Fix support for distributed tracing v2 in dotnet-isolated and Java (https://github.com/Azure/azure-functions-durable-extension/pull/2634)
- Update Microsoft.DurableTask.\* dependencies to v1.0.5
- Fix custom connection name not working when using IDurableClientFactory.CreateClient() - contributed by [@hctan](https://github.com/hctan)
- Made durable extension for isolated worker configuration idempotent, allowing multiple calls safely. (#2950)

### Breaking Changes

Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions src/WebJobs.Extensions.DurableTask.Analyzers/Resources.resx
Original file line number Diff line number Diff line change
Expand Up @@ -306,10 +306,10 @@ https://docs.microsoft.com/azure/azure-functions/durable/durable-functions-check
<value>I/O operations are not allowed inside an orchestrator function.</value>
</data>
<data name="MethodAnalyzerMessageFormat" xml:space="preserve">
<value>Method call '{0}' violates the orchestrator deterministic code constraint. Methods definied in source code that are used in an orchestrator must be deterministic.</value>
<value>Method call '{0}' violates the orchestrator deterministic code constraint. Methods defined in source code that are used in an orchestrator must be deterministic.</value>
</data>
<data name="MethodAnalyzerTitle" xml:space="preserve">
<value>Methods definied in source code that are used in an orchestrator must be deterministic.</value>
<value>Methods defined in source code that are used in an orchestrator must be deterministic.</value>
</data>
<data name="SignalEntityAnalyzerDescription" xml:space="preserve">
<value>SignalEntityAsync must use an Entity Interface.</value>
Expand Down
9 changes: 9 additions & 0 deletions src/WebJobs.Extensions.DurableTask/Bindings/BindingHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ public string DurableOrchestrationClientToString(IDurableOrchestrationClient cli
ConnectionName = attr.ConnectionName,
RpcBaseUrl = localRpcAddress,
RequiredQueryStringParameters = this.config.HttpApiHandler.GetUniversalQueryStrings(),
HttpBaseUrl = this.config.HttpApiHandler.GetBaseUrl(),
});
}

Expand Down Expand Up @@ -130,6 +131,14 @@ private class OrchestrationClientInputData
/// </summary>
[JsonProperty("rpcBaseUrl")]
public string? RpcBaseUrl { get; set; }

/// <summary>
/// The base URL of the Azure Functions host, used in the out-of-proc model.
/// This URL is sent by the client binding object to the Durable Worker extension,
/// allowing the extension to know the host's base URL for constructing management URLs.
/// </summary>
[JsonProperty("httpBaseUrl")]
public string? HttpBaseUrl { get; set; }
}
}
}
2 changes: 1 addition & 1 deletion src/WebJobs.Extensions.DurableTask/DurableTaskExtension.cs
Original file line number Diff line number Diff line change
Expand Up @@ -293,7 +293,7 @@ void IExtensionConfigProvider.Initialize(ExtensionConfigContext context)
}

// Throw if any of the configured options are invalid
this.Options.Validate(this.nameResolver, this.TraceHelper);
this.Options.Validate(this.nameResolver);

#pragma warning disable CS0618 // Type or member is obsolete

Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

11 changes: 4 additions & 7 deletions src/WebJobs.Extensions.DurableTask/Options/DurableTaskOptions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -302,7 +302,7 @@ internal void TraceConfiguration(EndToEndTraceHelper traceHelper, JObject storag
traceHelper.TraceConfiguration(this.HubName, configurationJson.ToString(Formatting.None));
}

internal void Validate(INameResolver environmentVariableResolver, EndToEndTraceHelper traceHelper)
internal void Validate(INameResolver environmentVariableResolver)
{
if (string.IsNullOrEmpty(this.HubName))
{
Expand All @@ -320,12 +320,9 @@ internal void Validate(INameResolver environmentVariableResolver, EndToEndTraceH
runtimeLanguage != null && // If we don't know from the environment variable, don't assume customer isn't .NET
!string.Equals(runtimeLanguage, "dotnet", StringComparison.OrdinalIgnoreCase))
{
traceHelper.ExtensionWarningEvent(
hubName: this.HubName,
functionName: string.Empty,
instanceId: string.Empty,
message: "Durable Functions does not work with extendedSessions = true for non-.NET languages. This value is being set to false instead. See https://docs.microsoft.com/en-us/azure/azure-functions/durable/durable-functions-perf-and-scale#extended-sessions for more details.");
this.ExtendedSessionsEnabled = false;
throw new InvalidOperationException(
"Durable Functions with extendedSessionsEnabled set to 'true' is only supported when using the in-process .NET worker. Please remove the setting or change it to 'false'." +
"See https://docs.microsoft.com/azure/azure-functions/durable/durable-functions-perf-and-scale#extended-sessions for more details.");
}

this.Notifications.Validate();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ public ValueTask<ConversionResult> ConvertAsync(ConverterContext context)
}

DurableTaskClient client = this.clientProvider.GetClient(endpoint, inputData?.taskHubName, inputData?.connectionName);
client = new FunctionsDurableTaskClient(client, inputData!.requiredQueryStringParameters);
client = new FunctionsDurableTaskClient(client, inputData!.requiredQueryStringParameters, inputData!.httpBaseUrl);
return new ValueTask<ConversionResult>(ConversionResult.Success(client));
}
catch (Exception innerException)
Expand All @@ -62,5 +62,5 @@ public ValueTask<ConversionResult> ConvertAsync(ConverterContext context)
}

// Serializer is case-sensitive and incoming JSON properties are camel-cased.
private record DurableClientInputData(string rpcBaseUrl, string taskHubName, string connectionName, string requiredQueryStringParameters);
private record DurableClientInputData(string rpcBaseUrl, string taskHubName, string connectionName, string requiredQueryStringParameters, string httpBaseUrl);
}
Loading
Loading