Skip to content

implement ADO packaging pipeline for FLC & SDK#552

Open
prathikr wants to merge 111 commits intomainfrom
prathikrao/foundry-local-packaging-pipeline
Open

implement ADO packaging pipeline for FLC & SDK#552
prathikr wants to merge 111 commits intomainfrom
prathikrao/foundry-local-packaging-pipeline

Conversation

@prathikr
Copy link
Copy Markdown
Contributor

@prathikr prathikr commented Mar 25, 2026

Foundry Local Packaging Pipeline

Summary

This PR introduces the Foundry Local Packaging Pipeline, a unified ADO pipeline that builds, signs, and tests Foundry Local Core (FLC) for all platforms, packages it as NuGet and Python wheels, then builds, signs, and tests the C#, JS, Python, and Rust SDKs — for both standard and WinML variants.

Pipeline stages:

  1. Build FLC — Native AOT binaries for win-x64, win-arm64, linux-x64, osx-arm64
  2. Package FLC — Multi-platform NuGet package + Python wheels from the built binaries
  3. Build SDKs — C#, JS, Python, Rust using the packaged FLC
  4. Test SDKs — Validate each SDK against the pipeline-built FLC

Produced artifacts: flc-nuget, flc-nuget-winml, flc-wheels, flc-wheels-winml, cs-sdk, cs-sdk-winml, js-sdk, js-sdk-winml, python-sdk, python-sdk-winml, rust-sdk, rust-sdk-winml

SDK Changes:

  1. Adds ability for python sdk to skip installing native depenencies and use pre-installed binaries like foundry-local-core, onnxruntime, onnxruntime-genai
  2. Adjusts APIs to leverage new download_and_register_eps native interop call for manually downloading and registering EPs
  3. Adds temporary nuget.config to github actions c# pipeline to allow ORT-Nightly to auto-fetch missing dependencies from upstream nuget.org

Test coverage

All SDK tests currently run on win-x64 only. Additional platform test jobs are blocked on infrastructure:

  • Windows ARM64 — waiting on a 1ES-hosted win-arm64 pool
  • macOS ARM64 — waiting on a 1ES-hosted macOS ARM64 pool
  • Linux x64 — waiting on the Linux onnxruntime dependency to be stabilized

TODOs are tracked in the pipeline YAML for each.

Build strategy

All FLC builds (including win-arm64 and osx-arm64) run on x64 machines because .NET Native AOT supports cross-compilation. The win-arm64 build cross-compiles from x64 Windows — see Cross-compilation docs. Linux builds run on its own respective x64 hosted image.

Origin

  • Foundry Local Core build steps were lifted from neutron-server/.pipelines/FoundryLocalCore/
  • SDK build/test steps were lifted from Foundry-Local/.github/

Copilot AI review requested due to automatic review settings March 25, 2026 21:17
@vercel
Copy link
Copy Markdown

vercel bot commented Mar 25, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
foundry-local Ready Ready Preview, Comment Mar 29, 2026 10:38pm

Request Review

baijumeswani
baijumeswani previously approved these changes Mar 25, 2026
@prathikr prathikr requested a review from baijumeswani March 25, 2026 21:19
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds an Azure DevOps (1ES) packaging pipeline that builds Foundry Local Core (from neutron-server), then uses the produced Core NuGet to build/test/package the C# and JS SDKs in this repo (including signing).

Changes:

  • Introduces a new foundry-local-packaging.yml pipeline orchestrating Core build, Core NuGet packaging, and SDK builds.
  • Adds reusable templates for building Core per-RID, packaging the Core NuGet, and building/packing the C# and JS SDKs.
  • Integrates ESRP signing for produced NuGet artifacts (Core + C# SDK).

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated 9 comments.

Show a summary per file
File Description
.pipelines/foundry-local-packaging.yml Orchestrates multi-stage ADO pipeline for Core + SDK packaging.
.pipelines/templates/build-core-steps.yml Builds/publishes per-platform Core native AOT binaries and stages them as artifacts.
.pipelines/templates/package-core-steps.yml Collects per-platform Core artifacts into NuGet layout, then packs/signs the Core NuGet.
.pipelines/templates/build-cs-steps.yml Restores/builds/tests/signs/packs the C# SDK using the locally built Core package.
.pipelines/templates/build-js-steps.yml Builds/tests/packs the JS SDK and overwrites installed Core binaries from the locally built Core NuGet.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 17 out of 17 changed files in this pull request and generated 13 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

prathikr and others added 12 commits March 28, 2026 15:47
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 22 out of 22 changed files in this pull request and generated 3 comments.

Comments suppressed due to low confidence (1)

sdk/python/build_backend.py:216

  • skip-native-deps is applied to most PEP 517 hooks via _apply_patches, but build_sdist() still only applies the WinML patch and ignores skip-native-deps. This makes behavior inconsistent across hooks and can produce sdists whose dependency metadata still includes the native pins even when skip-native-deps is enabled. Consider switching build_sdist() to use _apply_patches(config_settings) as well.
def build_sdist(sdist_directory, config_settings=None):
    if _is_winml(config_settings):
        with _patch_for_winml():
            return _sb.build_sdist(sdist_directory, config_settings)
    return _sb.build_sdist(sdist_directory, config_settings)

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

prathikr and others added 11 commits March 29, 2026 10:56
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants