From 70be2eb6dab0d016aef91a62d5e3822a404fb5e1 Mon Sep 17 00:00:00 2001
From: Kyle <92152685+idiskyle@users.noreply.github.com>
Date: Fri, 25 Oct 2024 00:15:39 +0800
Subject: [PATCH] Migrate Nuget Windows AI Pipeline to Use 1ES Template
(#22572)
---
.../azure-pipelines/nuget-windows-ai.yml | 312 ++++++++++++++++++
.../nuget/nuget_config/nuget.config | 13 +
.../nuget/nuget_config/x64/packages.config | 6 +
.../nuget/nuget_config/x86/packages.config | 6 +
.../templates/windowsai-steps.yml | 179 ++++++++++
5 files changed, 516 insertions(+)
create mode 100644 tools/ci_build/github/azure-pipelines/nuget-windows-ai.yml
create mode 100644 tools/ci_build/github/azure-pipelines/nuget/nuget_config/nuget.config
create mode 100644 tools/ci_build/github/azure-pipelines/nuget/nuget_config/x64/packages.config
create mode 100644 tools/ci_build/github/azure-pipelines/nuget/nuget_config/x86/packages.config
create mode 100644 tools/ci_build/github/azure-pipelines/templates/windowsai-steps.yml
diff --git a/tools/ci_build/github/azure-pipelines/nuget-windows-ai.yml b/tools/ci_build/github/azure-pipelines/nuget-windows-ai.yml
new file mode 100644
index 0000000000..1fdc509857
--- /dev/null
+++ b/tools/ci_build/github/azure-pipelines/nuget-windows-ai.yml
@@ -0,0 +1,312 @@
+trigger: none
+
+variables:
+ DisableDockerDetector: true
+
+resources:
+ repositories:
+ - repository: 1esPipelines
+ type: git
+ name: 1ESPipelineTemplates/1ESPipelineTemplates
+ ref: refs/tags/release
+
+extends:
+ template: v1/1ES.Official.PipelineTemplate.yml@1esPipelines
+ parameters:
+ pool:
+ name: onnxruntime-Win-CPU-2022
+ os: windows
+ sdl:
+ tsa:
+ enabled: true
+ policheck:
+ enabled: true
+ exclusionsFile: '$(Build.SourcesDirectory)\tools\ci_build\policheck_exclusions.xml'
+ stages:
+ - stage: Windows_Build
+ jobs:
+ - template: tools/ci_build/github/azure-pipelines/templates/windowsai-steps.yml@self
+ parameters:
+ BuildArch: x64
+
+ - template: tools/ci_build/github/azure-pipelines/templates/windowsai-steps.yml@self
+ parameters:
+ BuildArch: x86
+
+ - template: tools/ci_build/github/azure-pipelines/templates/windowsai-steps.yml@self
+ parameters:
+ BuildArch: arm64
+
+ - template: tools/ci_build/github/azure-pipelines/templates/windowsai-steps.yml@self
+ parameters:
+ BuildArch: x64
+ Runtime: static
+
+ - template: tools/ci_build/github/azure-pipelines/templates/windowsai-steps.yml@self
+ parameters:
+ BuildArch: x86
+ Runtime: static
+
+ - template: tools/ci_build/github/azure-pipelines/templates/windowsai-steps.yml@self
+ parameters:
+ BuildArch: arm64
+ Runtime: static
+
+ - job: NuGet_Packaging
+ dependsOn:
+ - Windows_Packaging_x64_dynamic
+ - Windows_Packaging_x86_dynamic
+ - Windows_Packaging_arm64_dynamic
+ - Windows_Packaging_x64_static
+ - Windows_Packaging_x86_static
+ - Windows_Packaging_arm64_static
+ condition: succeeded()
+ templateContext:
+ inputs:
+ - input: pipelineArtifact
+ artifactName: drop_Windows_Build_Windows_Packaging_x64_dynamic
+ targetPath: $(Build.BinariesDirectory)/nuget-artifact-x64
+ - input: pipelineArtifact
+ artifactName: drop_Windows_Build_Windows_Packaging_x86_dynamic
+ targetPath: $(Build.BinariesDirectory)/nuget-artifact-x86
+ - input: pipelineArtifact
+ artifactName: drop_Windows_Build_Windows_Packaging_arm64_dynamic
+ targetPath: $(Build.BinariesDirectory)/nuget-artifact-arm64
+ - input: pipelineArtifact
+ artifactName: drop_Windows_Build_Windows_Packaging_x64_static
+ targetPath: $(Build.BinariesDirectory)/nuget-artifact-x64-static-runtime
+ - input: pipelineArtifact
+ artifactName: drop_Windows_Build_Windows_Packaging_x86_static
+ targetPath: $(Build.BinariesDirectory)/nuget-artifact-x86-static-runtime
+ - input: pipelineArtifact
+ artifactName: drop_Windows_Build_Windows_Packaging_arm64_static
+ targetPath: $(Build.BinariesDirectory)/nuget-artifact-arm64-static-runtime
+ outputs:
+ - output: pipelineArtifact
+ path: '$(Build.ArtifactStagingDirectory)/merged'
+ artifact: drop_Windows_Build_NuGet_Packaging
+
+ steps:
+ - task: PowerShell@2
+ displayName: 'Bundle NuGet and other binaries'
+ inputs:
+ targetType: 'inline'
+ script: |
+ Add-Type -AssemblyName "System.IO.Compression.FileSystem"
+
+ $nupkgs = (Get-ChildItem -Filter Microsoft.AI.MachineLearning*.nupkg -Recurse)
+ $x64_nuget_package_name = $nupkgs[0].Name
+ $x64_nuget_package = $nupkgs[0].FullName
+ $x64_nupkg_unzipped_directory_root = $nupkgs[0].Directory.FullName
+ $x64_nupkg_unzipped_directory = [System.IO.Path]::Combine($x64_nupkg_unzipped_directory_root, 'binaries', [System.IO.Path]::GetFileNameWithoutExtension($x64_nuget_package))
+ [System.IO.Compression.ZipFile]::ExtractToDirectory($x64_nuget_package, $x64_nupkg_unzipped_directory)
+
+ $nupkgs = (Get-ChildItem ..\nuget-artifact-x64-static-runtime -Filter Microsoft.AI.MachineLearning*.nupkg -Recurse)
+ $x64_static_runtime_nuget_package = $nupkgs[0].FullName
+ $x64_static_runtime_nupkg_unzipped_directory_root = $nupkgs[0].Directory.FullName
+ $x64_static_runtime_nupkg_unzipped_directory = [System.IO.Path]::Combine($x64_static_runtime_nupkg_unzipped_directory_root, 'binaries', [System.IO.Path]::GetFileNameWithoutExtension($x64_static_runtime_nuget_package))
+ [System.IO.Compression.ZipFile]::ExtractToDirectory($x64_static_runtime_nuget_package, $x64_static_runtime_nupkg_unzipped_directory)
+
+ $nupkgs = (Get-ChildItem ..\nuget-artifact-x86 -Filter Microsoft.AI.MachineLearning*.nupkg -Recurse)
+ $x86_nuget_package = $nupkgs[0].FullName
+ $x86_nupkg_unzipped_directory_root = $nupkgs[0].Directory.FullName
+ $x86_nupkg_unzipped_directory = [System.IO.Path]::Combine($x86_nupkg_unzipped_directory_root, 'binaries', [System.IO.Path]::GetFileNameWithoutExtension($x86_nuget_package))
+ [System.IO.Compression.ZipFile]::ExtractToDirectory($x86_nuget_package, $x86_nupkg_unzipped_directory)
+
+ $nupkgs = (Get-ChildItem ..\nuget-artifact-x86-static-runtime -Filter Microsoft.AI.MachineLearning*.nupkg -Recurse)
+ $x86_static_runtime_nuget_package = $nupkgs[0].FullName
+ $x86_static_runtime_nupkg_unzipped_directory_root = $nupkgs[0].Directory.FullName
+ $x86_static_runtime_nupkg_unzipped_directory = [System.IO.Path]::Combine($x86_static_runtime_nupkg_unzipped_directory_root, 'binaries', [System.IO.Path]::GetFileNameWithoutExtension($x86_static_runtime_nuget_package))
+ [System.IO.Compression.ZipFile]::ExtractToDirectory($x86_static_runtime_nuget_package, $x86_static_runtime_nupkg_unzipped_directory)
+
+ $nupkgs = (Get-ChildItem ..\nuget-artifact-arm64 -Filter Microsoft.AI.MachineLearning*.nupkg -Recurse)
+ $arm64_nuget_package = $nupkgs[0].FullName
+ $arm64_nupkg_unzipped_directory_root = $nupkgs[0].Directory.FullName
+ $arm64_nupkg_unzipped_directory = [System.IO.Path]::Combine($arm64_nupkg_unzipped_directory_root, 'binaries', [System.IO.Path]::GetFileNameWithoutExtension($arm64_nuget_package))
+ [System.IO.Compression.ZipFile]::ExtractToDirectory($arm64_nuget_package, $arm64_nupkg_unzipped_directory)
+
+ $nupkgs = (Get-ChildItem ..\nuget-artifact-arm64-static-runtime -Filter Microsoft.AI.MachineLearning*.nupkg -Recurse)
+ $arm64_static_runtime_nuget_package = $nupkgs[0].FullName
+ $arm64_static_runtime_nupkg_unzipped_directory_root = $nupkgs[0].Directory.FullName
+ $arm64_static_runtime_nupkg_unzipped_directory = [System.IO.Path]::Combine($arm64_static_runtime_nupkg_unzipped_directory_root, 'binaries', [System.IO.Path]::GetFileNameWithoutExtension($arm64_static_runtime_nuget_package))
+ [System.IO.Compression.ZipFile]::ExtractToDirectory($arm64_static_runtime_nuget_package, $arm64_static_runtime_nupkg_unzipped_directory)
+
+
+
+ $x64_static_runtime_path_old = [System.IO.Path]::Combine($x64_static_runtime_nupkg_unzipped_directory, 'runtimes', 'win-x64', '_native')
+ $x64_static_runtime_path_new = [System.IO.Path]::Combine($x64_nupkg_unzipped_directory, 'runtimes', 'win-x64', '_native', 'static')
+ $x86_runtime_path_old = [System.IO.Path]::Combine($x86_nupkg_unzipped_directory, 'runtimes', 'win-x86', '_native')
+ $x86_runtime_path_new = [System.IO.Path]::Combine($x64_nupkg_unzipped_directory, 'runtimes', 'win-x86', '_native')
+ $x86_static_runtime_path_old = [System.IO.Path]::Combine($x86_static_runtime_nupkg_unzipped_directory, 'runtimes', 'win-x86', '_native')
+ $x86_static_runtime_path_new = [System.IO.Path]::Combine($x64_nupkg_unzipped_directory, 'runtimes', 'win-x86', '_native', 'static')
+ $arm64_runtime_path_old = [System.IO.Path]::Combine($arm64_nupkg_unzipped_directory, 'runtimes', 'win-arm64', '_native')
+ $arm64_runtime_path_new = [System.IO.Path]::Combine($x64_nupkg_unzipped_directory, 'runtimes', 'win-arm64', '_native')
+ $arm64_static_runtime_path_old = [System.IO.Path]::Combine($arm64_static_runtime_nupkg_unzipped_directory, 'runtimes', 'win-arm64', '_native')
+ $arm64_static_runtime_path_new = [System.IO.Path]::Combine($x64_nupkg_unzipped_directory, 'runtimes', 'win-arm64', '_native', 'static')
+
+ $uap_build_path_old = [System.IO.Path]::Combine($x64_static_runtime_nupkg_unzipped_directory, 'build', 'native')
+ $uap_build_path_new = [System.IO.Path]::Combine($x64_nupkg_unzipped_directory, 'build', 'uap10.0')
+
+ New-Item -Path $x64_static_runtime_path_new -ItemType Directory
+ New-Item -Path $x86_runtime_path_new -ItemType Directory
+ New-Item -Path $x86_static_runtime_path_new -ItemType Directory
+ New-Item -Path $arm64_runtime_path_new -ItemType Directory
+ New-Item -Path $arm64_static_runtime_path_new -ItemType Directory
+
+ Copy-Item ([System.IO.Path]::Combine($x86_runtime_path_old, 'onnxruntime.dll')) $x86_runtime_path_new
+ Copy-Item ([System.IO.Path]::Combine($x86_runtime_path_old, 'onnxruntime.lib')) $x86_runtime_path_new
+ Copy-Item ([System.IO.Path]::Combine($x86_runtime_path_old, 'microsoft.ai.machinelearning.dll')) $x86_runtime_path_new
+ Copy-Item ([System.IO.Path]::Combine($x86_runtime_path_old, 'microsoft.ai.machinelearning.lib')) $x86_runtime_path_new
+
+ Copy-Item ([System.IO.Path]::Combine($arm64_runtime_path_old, 'onnxruntime.dll')) $arm64_runtime_path_new
+ Copy-Item ([System.IO.Path]::Combine($arm64_runtime_path_old, 'onnxruntime.lib')) $arm64_runtime_path_new
+ Copy-Item ([System.IO.Path]::Combine($arm64_runtime_path_old, 'microsoft.ai.machinelearning.dll')) $arm64_runtime_path_new
+ Copy-Item ([System.IO.Path]::Combine($arm64_runtime_path_old, 'microsoft.ai.machinelearning.lib')) $arm64_runtime_path_new
+
+ Copy-Item ([System.IO.Path]::Combine($x64_static_runtime_path_old, 'onnxruntime.dll')) ([System.IO.Path]::Combine($x64_static_runtime_path_new, 'onnxruntime.dll'))
+ Copy-Item ([System.IO.Path]::Combine($x64_static_runtime_path_old, 'onnxruntime.lib')) ([System.IO.Path]::Combine($x64_static_runtime_path_new, 'onnxruntime.lib'))
+ Copy-Item ([System.IO.Path]::Combine($x64_static_runtime_path_old, 'microsoft.ai.machinelearning.dll')) ([System.IO.Path]::Combine($x64_static_runtime_path_new, 'microsoft.ai.machinelearning.dll'))
+ Copy-Item ([System.IO.Path]::Combine($x64_static_runtime_path_old, 'microsoft.ai.machinelearning.lib')) ([System.IO.Path]::Combine($x64_static_runtime_path_new, 'microsoft.ai.machinelearning.lib'))
+
+ Copy-Item ([System.IO.Path]::Combine($x86_static_runtime_path_old, 'onnxruntime.dll')) ([System.IO.Path]::Combine($x86_static_runtime_path_new, 'onnxruntime.dll'))
+ Copy-Item ([System.IO.Path]::Combine($x86_static_runtime_path_old, 'onnxruntime.lib')) ([System.IO.Path]::Combine($x86_static_runtime_path_new, 'onnxruntime.lib'))
+ Copy-Item ([System.IO.Path]::Combine($x86_static_runtime_path_old, 'microsoft.ai.machinelearning.dll')) ([System.IO.Path]::Combine($x86_static_runtime_path_new, 'microsoft.ai.machinelearning.dll'))
+ Copy-Item ([System.IO.Path]::Combine($x86_static_runtime_path_old, 'microsoft.ai.machinelearning.lib')) ([System.IO.Path]::Combine($x86_static_runtime_path_new, 'microsoft.ai.machinelearning.lib'))
+
+ Copy-Item ([System.IO.Path]::Combine($arm64_static_runtime_path_old, 'onnxruntime.dll')) ([System.IO.Path]::Combine($arm64_static_runtime_path_new, 'onnxruntime.dll'))
+ Copy-Item ([System.IO.Path]::Combine($arm64_static_runtime_path_old, 'onnxruntime.lib')) ([System.IO.Path]::Combine($arm64_static_runtime_path_new, 'onnxruntime.lib'))
+ Copy-Item ([System.IO.Path]::Combine($arm64_static_runtime_path_old, 'microsoft.ai.machinelearning.dll')) ([System.IO.Path]::Combine($arm64_static_runtime_path_new, 'microsoft.ai.machinelearning.dll'))
+ Copy-Item ([System.IO.Path]::Combine($arm64_static_runtime_path_old, 'microsoft.ai.machinelearning.lib')) ([System.IO.Path]::Combine($arm64_static_runtime_path_new, 'microsoft.ai.machinelearning.lib'))
+
+ Copy-Item -Recurse $uap_build_path_old $uap_build_path_new
+
+ $merged_nuget_path = [System.IO.Path]::Combine($Env:BUILD_ARTIFACTSTAGINGDIRECTORY, 'merged')
+ if (!(Test-Path $merged_nuget_path)) {
+ New-Item -Path $merged_nuget_path -ItemType Directory
+ }
+
+ $merged_nuget = [System.IO.Path]::Combine($merged_nuget_path, $x64_nuget_package_name)
+ Start-Process -FilePath "7z" -ArgumentList "-tzip a -r $merged_nuget ." -WorkingDirectory $x64_nupkg_unzipped_directory -NoNewWindow -Wait
+
+ workingDirectory: $(Build.BinariesDirectory)\nuget-artifact-x64
+
+ - task: PowerShell@2
+ displayName: 'Bundle Symbols NuGet'
+ inputs:
+ targetType: 'inline'
+ script: |
+ Add-Type -AssemblyName "System.IO.Compression.FileSystem"
+
+ $nupkgs = (Get-ChildItem -Filter Microsoft.AI.MachineLearning*.snupkg -Recurse)
+ $x64_nuget_package_name = $nupkgs[0].Name
+ $x64_nuget_package = $nupkgs[0].FullName
+ $x64_nupkg_unzipped_directory_root = $nupkgs[0].Directory.FullName
+ $x64_nupkg_unzipped_directory = [System.IO.Path]::Combine($x64_nupkg_unzipped_directory_root, 'symbols', [System.IO.Path]::GetFileNameWithoutExtension($x64_nuget_package))
+ [System.IO.Compression.ZipFile]::ExtractToDirectory($x64_nuget_package, $x64_nupkg_unzipped_directory)
+
+ $nupkgs = (Get-ChildItem ..\nuget-artifact-x86 -Filter Microsoft.AI.MachineLearning*.snupkg -Recurse)
+ $x86_nuget_package = $nupkgs[0].FullName
+ $x86_nupkg_unzipped_directory_root = $nupkgs[0].Directory.FullName
+ $x86_nupkg_unzipped_directory = [System.IO.Path]::Combine($x86_nupkg_unzipped_directory_root, 'symbols', [System.IO.Path]::GetFileNameWithoutExtension($x86_nuget_package))
+ [System.IO.Compression.ZipFile]::ExtractToDirectory($x86_nuget_package, $x86_nupkg_unzipped_directory)
+
+ $nupkgs = (Get-ChildItem ..\nuget-artifact-arm64 -Filter Microsoft.AI.MachineLearning*.snupkg -Recurse)
+ $arm64_nuget_package = $nupkgs[0].FullName
+ $arm64_nupkg_unzipped_directory_root = $nupkgs[0].Directory.FullName
+ $arm64_nupkg_unzipped_directory = [System.IO.Path]::Combine($arm64_nupkg_unzipped_directory_root, 'symbols', [System.IO.Path]::GetFileNameWithoutExtension($arm64_nuget_package))
+ [System.IO.Compression.ZipFile]::ExtractToDirectory($arm64_nuget_package, $arm64_nupkg_unzipped_directory)
+
+ $x86_runtime_path_old = [System.IO.Path]::Combine($x86_nupkg_unzipped_directory, 'runtimes', 'win-x86', '_native')
+ $x86_runtime_path_new = [System.IO.Path]::Combine($x64_nupkg_unzipped_directory, 'runtimes', 'win-x86', '_native')
+ $arm64_runtime_path_old = [System.IO.Path]::Combine($arm64_nupkg_unzipped_directory, 'runtimes', 'win-arm64', '_native')
+ $arm64_runtime_path_new = [System.IO.Path]::Combine($x64_nupkg_unzipped_directory, 'runtimes', 'win-arm64', '_native')
+
+ New-Item -Path $x86_runtime_path_new -ItemType Directory
+ New-Item -Path $arm64_runtime_path_new -ItemType Directory
+
+ Copy-Item ([System.IO.Path]::Combine($x86_runtime_path_old, 'onnxruntime.pdb')) $x86_runtime_path_new
+ Copy-Item ([System.IO.Path]::Combine($x86_runtime_path_old, 'microsoft.ai.machinelearning.pdb')) $x86_runtime_path_new
+
+ Copy-Item ([System.IO.Path]::Combine($arm64_runtime_path_old, 'onnxruntime.pdb')) $arm64_runtime_path_new
+ Copy-Item ([System.IO.Path]::Combine($arm64_runtime_path_old, 'microsoft.ai.machinelearning.pdb')) $arm64_runtime_path_new
+
+ $merged_nuget_path = [System.IO.Path]::Combine($Env:BUILD_ARTIFACTSTAGINGDIRECTORY, 'merged')
+ if (!(Test-Path $merged_nuget_path)) {
+ New-Item -Path $merged_nuget_path -ItemType Directory
+ }
+
+ $merged_nuget = [System.IO.Path]::Combine($merged_nuget_path, $x64_nuget_package_name)
+
+ Start-Process -FilePath "7z" -ArgumentList "-tzip a -r $merged_nuget ." -WorkingDirectory $x64_nupkg_unzipped_directory -NoNewWindow -Wait
+
+ $merged_nuget_without_pdb = [System.IO.Path]::ChangeExtension($merged_nuget, '.nupkg')
+
+ # Now we combine the DLLs and PDBs together, put them back in a folder under $(Build.SourcesDirectory)
+ # We won't upload the unzipped folder. We will just feed it to BinSkim.
+ 7z x -o$(Build.SourcesDirectory)\unzipped $merged_nuget
+ 7z -y x -o$(Build.SourcesDirectory)\unzipped $merged_nuget_without_pdb
+
+ workingDirectory: $(Build.BinariesDirectory)\nuget-artifact-x64
+
+ - script: |
+ dir $(Build.SourcesDirectory)\unzipped\runtimes\win-x64\_native
+
+ - task: SFP.build-tasks.custom-build-task-1.EsrpCodeSigning@5
+ displayName: "Sign Nuget package"
+ inputs:
+ ConnectedServiceName: 'OnnxrunTimeCodeSign_20240611'
+ AppRegistrationClientId: '53d54d02-978d-4305-8572-583cf6711c4f'
+ AppRegistrationTenantId: '72f988bf-86f1-41af-91ab-2d7cd011db47'
+ AuthAKVName: 'buildkeyvault'
+ AuthCertName: '53d54d02-SSL-AutoRotate'
+ AuthSignCertName: '53d54d02-978d-4305-8572-583cf6711c4f'
+
+ FolderPath: $(Build.ArtifactStagingDirectory)
+ Pattern: '*.nupkg'
+ SessionTimeout: 90
+ ServiceEndpointUrl: 'https://api.esrp.microsoft.com/api/v2'
+ MaxConcurrency: 25
+ signConfigType: inlineSignParams
+ inlineOperation: |
+ [
+ {
+ "keyCode": "CP-401405",
+ "operationSetCode": "NuGetSign",
+ "parameters": [ ],
+ "toolName": "sign",
+ "toolVersion": "6.2.9304.0"
+ },
+ {
+ "keyCode": "CP-401405",
+ "operationSetCode": "NuGetVerify",
+ "parameters": [ ],
+ "toolName": "sign",
+ "toolVersion": "6.2.9304.0"
+ }
+ ]
+
+ - job: NuGet_Publishing
+ dependsOn:
+ - NuGet_Packaging
+ condition: succeeded()
+ templateContext:
+ inputs:
+ - input: pipelineArtifact
+ artifactName: drop_Windows_Build_NuGet_Packaging
+ targetPath: $(Build.BinariesDirectory)/merged
+ outputs:
+ - output: nuget
+ # condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main')) # Optional condition
+ useDotNetTask: false # The default is false to use the NuGetCommand task. Set to true to use the DotNetCoreCLI task to publish packages.
+ packagesToPush: '$(Build.BinariesDirectory)/packages/*.nupkg;!$(Build.BinariesDirectory)/packages/*.symbols.nupkg'
+ packageParentPath: '$(Build.BinariesDirectory)/'
+ publishVstsFeed: PublicPackages/ORT-Nightly # Required when pushing to internal feed.
+ nuGetFeedType: internal # Change to external when publishing to external feed
+ allowPackageConflicts: true # Optional. NuGetCommand task only.
+ publishPackageMetadata: true # Optional
+ steps:
+ - powershell: |
+ Rename-Item -Path merged packages
+
+ workingDirectory: '$(Build.BinariesDirectory)'
+ displayName: 'Rename nuget folder'
diff --git a/tools/ci_build/github/azure-pipelines/nuget/nuget_config/nuget.config b/tools/ci_build/github/azure-pipelines/nuget/nuget_config/nuget.config
new file mode 100644
index 0000000000..f654900ad0
--- /dev/null
+++ b/tools/ci_build/github/azure-pipelines/nuget/nuget_config/nuget.config
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tools/ci_build/github/azure-pipelines/nuget/nuget_config/x64/packages.config b/tools/ci_build/github/azure-pipelines/nuget/nuget_config/x64/packages.config
new file mode 100644
index 0000000000..294bd926a3
--- /dev/null
+++ b/tools/ci_build/github/azure-pipelines/nuget/nuget_config/x64/packages.config
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/tools/ci_build/github/azure-pipelines/nuget/nuget_config/x86/packages.config b/tools/ci_build/github/azure-pipelines/nuget/nuget_config/x86/packages.config
new file mode 100644
index 0000000000..3528545dfb
--- /dev/null
+++ b/tools/ci_build/github/azure-pipelines/nuget/nuget_config/x86/packages.config
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/tools/ci_build/github/azure-pipelines/templates/windowsai-steps.yml b/tools/ci_build/github/azure-pipelines/templates/windowsai-steps.yml
new file mode 100644
index 0000000000..6b492ad951
--- /dev/null
+++ b/tools/ci_build/github/azure-pipelines/templates/windowsai-steps.yml
@@ -0,0 +1,179 @@
+parameters:
+- name: BuildArch
+ displayName: BuildArch
+ type: string
+ default: 'x64'
+
+- name: Runtime
+ displayName: MSVC Runtime, should be 'dynamic' or 'static'.
+ type: string
+ default: 'dynamic'
+
+jobs:
+- job: Windows_Packaging_${{ parameters.BuildArch }}_${{ parameters.Runtime }}
+ templateContext:
+ outputs:
+ - output: pipelineArtifact
+ path: '$(Build.ArtifactStagingDirectory)'
+ artifact: drop_Windows_Build_Windows_Packaging_${{ parameters.BuildArch }}_${{ parameters.Runtime }}
+
+ steps:
+ - task: UseDotNet@2
+ inputs:
+ version: '6.x'
+
+ - task: UsePythonVersion@0
+ inputs:
+ versionSpec: '3.9'
+ addToPath: true
+ ${{ if eq(parameters.BuildArch, 'x86') }}:
+ architecture: 'x86'
+
+ - template: telemetry-steps.yml
+
+ - task: NuGetCommand@2
+ displayName: 'NuGet restore'
+ inputs:
+ command: restore
+ feedsToUse: config
+ nugetConfigPath: $(Build.SourcesDirectory)\tools\ci_build\github\azure-pipelines\nuget\nuget_config\nuget.config
+ restoreDirectory: '$(Build.BinariesDirectory)'
+ ${{ if eq(parameters.BuildArch, 'x64') }}:
+ restoreSolution: $(Build.SourcesDirectory)\tools\ci_build\github\azure-pipelines\nuget\nuget_config\x64\packages.config
+ ${{ if eq(parameters.BuildArch, 'x86') }}:
+ restoreSolution: $(Build.SourcesDirectory)\.tools\ci_build\github\azure-pipelines\nuget\nuget_config\x86\packages.config
+ ${{ if eq(parameters.BuildArch, 'arm') }}:
+ restoreSolution: $(Build.SourcesDirectory)\tools\ci_build\github\azure-pipelines\nuget\nuget_config\x64\packages.config
+ ${{ if eq(parameters.BuildArch, 'arm64') }}:
+ restoreSolution: $(Build.SourcesDirectory)\tools\ci_build\github\azure-pipelines\nuget\nuget_config\x64\packages.config
+
+ - script: |
+ @echo off
+ set vswherepath="%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe"
+ for /f "usebackq delims=" %%i in (`%vswherepath% -latest -property installationPath`) do (
+ set vslatest="%%i"
+ if exist "%%i\Common7\Tools\vsdevcmd.bat" (
+ set vsdevcmd="%%i\Common7\Tools\vsdevcmd.bat"
+ )
+ )
+
+ @echo vslatest %vslatest%
+ @echo vsdevcmd %vsdevcmd%
+
+ @echo ##vso[task.setvariable variable=vslatest]%vslatest%
+ @echo ##vso[task.setvariable variable=vsdevcmd]%vsdevcmd% -arch=${{ parameters.BuildArch }}
+ displayName: 'locate vsdevcmd via vswhere'
+
+ - powershell: |
+ Write-Host "##vso[task.setvariable variable=BuildFlags]"
+ Write-Host "##vso[task.setvariable variable=ArtifactName]Microsoft.AI.MachineLearning.${{ parameters.BuildArch }}"
+ displayName: Initialize build flags
+
+ - powershell: |
+ Write-Host "##vso[task.setvariable variable=BuildFlags]$(BuildFlags) --${{ parameters.BuildArch }}"
+ displayName: Add cross compilation flags for ARM
+ condition: and(ne('${{ parameters.BuildArch }}', 'x64'), ne('${{ parameters.BuildArch }}', 'x86'))
+
+ - powershell: |
+ Write-Host "##vso[task.setvariable variable=BuildFlags]$(BuildFlags) --enable_msvc_static_runtime"
+ Write-Host "##vso[task.setvariable variable=ArtifactName]$(ArtifactName).StaticRuntime"
+ displayName: Add static runtime flags
+ condition: eq('${{ parameters.Runtime }}', 'static')
+
+ # must call vsdevcmd first to add cmake to PATH
+ - script: |
+ curl -O -L https://github.com/Kitware/CMake/releases/download/v3.28.3/cmake-3.28.3-windows-x86_64.zip
+ 7z x cmake-3.28.3-windows-x86_64.zip
+ python --version
+ python "$(Build.SourcesDirectory)\tools\ci_build\build.py" --build_dir $(Build.BinariesDirectory) --parallel --use_binskim_compliant_compile_flags --build_shared_lib --enable_onnx_tests --ms_experimental --use_dml --use_winml --cmake_generator "Visual Studio 17 2022" --update --config RelWithDebInfo --enable_lto --use_telemetry --disable_rtti --enable_wcos --windows_sdk_version "10.0.22621.0" $(BuildFlags) --cmake_extra_defines "CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO=/PROFILE" "CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO=/PROFILE" --cmake_path $(Build.BinariesDirectory)\cmake-3.28.3-windows-x86_64\bin\cmake.exe --ctest_path $(Build.BinariesDirectory)\cmake-3.28.3-windows-x86_64\bin\ctest.exe
+ workingDirectory: '$(Build.BinariesDirectory)'
+ displayName: 'Generate cmake config'
+
+ - task: VSBuild@1
+ displayName: 'Build'
+ inputs:
+ solution: '$(Build.BinariesDirectory)\RelWithDebInfo\onnxruntime.sln'
+ ${{ if ne(parameters.BuildArch, 'x86') }}:
+ platform: ${{ parameters.BuildArch }}
+ ${{ if eq(parameters.BuildArch, 'x86') }}:
+ platform: 'Win32'
+ configuration: RelWithDebInfo
+ msbuildArchitecture: ${{ parameters.BuildArch }}
+ maximumCpuCount: true
+ logProjectEvents: true
+ workingFolder: '$(Build.BinariesDirectory)\RelWithDebInfo'
+ createLogFile: true
+
+ - ${{ if eq(parameters.Runtime, 'dynamic') }}:
+ - script: |
+ xcopy $(Build.BinariesDirectory)\RelWithDebInfo\RelWithDebInfo\winml_test_api.exe $(Build.ArtifactStagingDirectory)\test_artifact\
+ copy $(Build.BinariesDirectory)\RelWithDebInfo\RelWithDebInfo\winml_test_scenario.exe $(Build.ArtifactStagingDirectory)\test_artifact\
+ copy $(Build.SourcesDirectory)\winml\test\api\models\*.onnx $(Build.ArtifactStagingDirectory)\test_artifact\
+ copy $(Build.SourcesDirectory)\winml\test\scenario\cppwinrt\*.onnx $(Build.ArtifactStagingDirectory)\test_artifact\
+ copy $(Build.SourcesDirectory)\winml\test\scenario\models\*.onnx $(Build.ArtifactStagingDirectory)\test_artifact\
+ copy $(Build.SourcesDirectory)\winml\test\common\testdata\squeezenet\* $(Build.ArtifactStagingDirectory)\test_artifact\
+ copy $(Build.SourcesDirectory)\winml\test\collateral\models\*.onnx $(Build.ArtifactStagingDirectory)\test_artifact\
+ xcopy $(Build.SourcesDirectory)\winml\test\collateral\models\ModelSubdirectory $(Build.ArtifactStagingDirectory)\test_artifact\ModelSubdirectory\ /i
+ copy $(Build.SourcesDirectory)\winml\test\collateral\images\*.png $(Build.ArtifactStagingDirectory)\test_artifact\
+ copy $(Build.SourcesDirectory)\winml\test\collateral\images\*.jpg $(Build.ArtifactStagingDirectory)\test_artifact\
+ copy $(Build.SourcesDirectory)\onnxruntime\test\testdata\sequence_length.onnx $(Build.ArtifactStagingDirectory)\test_artifact\
+ copy $(Build.SourcesDirectory)\onnxruntime\test\testdata\sequence_construct.onnx $(Build.ArtifactStagingDirectory)\test_artifact\
+ displayName: 'Copy WinML test collateral to artifact directory'
+
+
+ - ${{ if eq(parameters.BuildArch, 'x64') }}:
+ - script: |
+ call $(vsdevcmd)
+ msbuild Microsoft.AI.MachineLearning.Interop.csproj /p:Configuration=RelWithDebInfo /p:Platform="Any CPU" /p:OnnxRuntimeBuildDirectory=$(Build.BinariesDirectory) -restore
+ workingDirectory: '$(Build.SourcesDirectory)\csharp\src\Microsoft.AI.MachineLearning.Interop'
+ displayName: 'Build Microsoft.AI.MachineLearning.Interop.dll'
+
+ - template: win-esrp-dll.yml
+ parameters:
+ FolderPath: '$(Build.BinariesDirectory)\RelWithDebInfo\RelWithDebInfo'
+ DisplayName: 'Sign runtime DLLs'
+ Pattern: '*.exe,*.dll'
+
+ - ${{ if eq(parameters.BuildArch, 'x64') }}:
+ - script: |
+ call $(vsdevcmd)
+ msbuild $(Build.SourcesDirectory)\csharp\OnnxRuntime.CSharp.proj /p:Configuration=RelWithDebInfo /t:CreateWindowsAIPackage /p:OnnxRuntimeBuildDirectory=$(Build.BinariesDirectory) /p:OnnxRuntimeSourceDirectory=$(Build.SourcesDirectory)
+ copy $(Build.BinariesDirectory)\RelWithDebInfo\RelWithDebInfo\*.nupkg $(Build.ArtifactStagingDirectory)
+ copy $(Build.BinariesDirectory)\RelWithDebInfo\RelWithDebInfo\*.snupkg $(Build.ArtifactStagingDirectory)
+ workingDirectory: '$(Build.SourcesDirectory)\csharp'
+ displayName: 'Create NuGet Package'
+
+ - ${{ if eq(parameters.BuildArch, 'x86') }}:
+ - script: |
+ call $(vsdevcmd)
+ msbuild $(Build.SourcesDirectory)\csharp\OnnxRuntime.CSharp.proj /p:Configuration=RelWithDebInfo /t:CreateWindowsAIPackage /p:OnnxRuntimeBuildDirectory=$(Build.BinariesDirectory) /p:OnnxRuntimeSourceDirectory=$(Build.SourcesDirectory) /p:TargetArchitecture=x86
+ copy $(Build.BinariesDirectory)\RelWithDebInfo\RelWithDebInfo\*.nupkg $(Build.ArtifactStagingDirectory)
+ copy $(Build.BinariesDirectory)\RelWithDebInfo\RelWithDebInfo\*.snupkg $(Build.ArtifactStagingDirectory)
+ workingDirectory: '$(Build.SourcesDirectory)\csharp'
+ displayName: 'Create NuGet Package'
+
+ - ${{ if eq(parameters.BuildArch, 'arm64') }}:
+ - script: |
+ call $(vsdevcmd)
+ msbuild $(Build.SourcesDirectory)\csharp\OnnxRuntime.CSharp.proj /p:Configuration=RelWithDebInfo /t:CreateWindowsAIPackage /p:OnnxRuntimeBuildDirectory=$(Build.BinariesDirectory) /p:OnnxRuntimeSourceDirectory=$(Build.SourcesDirectory) /p:TargetArchitecture=arm64 /p:ProtocDirectory=$(Build.BinariesDirectory)\host_protoc\Release
+ copy $(Build.BinariesDirectory)\RelWithDebInfo\RelWithDebInfo\*.nupkg $(Build.ArtifactStagingDirectory)
+ copy $(Build.BinariesDirectory)\RelWithDebInfo\RelWithDebInfo\*.snupkg $(Build.ArtifactStagingDirectory)
+ workingDirectory: '$(Build.SourcesDirectory)\csharp'
+ displayName: 'Create NuGet Package'
+
+ - ${{ if eq(parameters.BuildArch, 'arm') }}:
+ - script: |
+ call $(vsdevcmd)
+ msbuild $(Build.SourcesDirectory)\csharp\OnnxRuntime.CSharp.proj /p:Configuration=RelWithDebInfo /t:CreateWindowsAIPackage /p:OnnxRuntimeBuildDirectory=$(Build.BinariesDirectory) /p:OnnxRuntimeSourceDirectory=$(Build.SourcesDirectory) /p:TargetArchitecture=arm /p:ProtocDirectory=$(Build.BinariesDirectory)\host_protoc\Release
+ copy $(Build.BinariesDirectory)\RelWithDebInfo\RelWithDebInfo\*.nupkg $(Build.ArtifactStagingDirectory)
+ copy $(Build.BinariesDirectory)\RelWithDebInfo\RelWithDebInfo\*.snupkg $(Build.ArtifactStagingDirectory)
+ workingDirectory: '$(Build.SourcesDirectory)\csharp'
+ displayName: 'Create NuGet Package'
+
+ # Only dynamic copied to test_artifact
+ - ${{ if eq(parameters.Runtime, 'dynamic') }}:
+ - template: win-esrp-dll.yml
+ parameters:
+ FolderPath: '$(Build.ArtifactStagingDirectory)\test_artifact'
+ DisplayName: 'Sign test_artifact'
+ Pattern: '*.exe,*.dll'