Skip to content

Commit

Permalink
merge latest change from main
Browse files Browse the repository at this point in the history
  • Loading branch information
nytian committed Nov 13, 2024
2 parents 92fecfc + aa30752 commit 9facae2
Show file tree
Hide file tree
Showing 20 changed files with 928 additions and 102 deletions.
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

0 comments on commit 9facae2

Please sign in to comment.