Skip to content

Conversation

evgenyfedorov2
Copy link
Member

@evgenyfedorov2 evgenyfedorov2 commented Jul 17, 2025

Adding a brand new component - Build metadata, which automatically grabs build information from the CI/CD pipelines, deserializes it into a strong type BuildMetadata and registers it in Dependency Injection container as IOptions<BuildMetadata>.
The component uses source generation to collect build information and immediately express it via C# code.

Initially, only GitHub Actions and Azure DevOps are supported

Microsoft Reviewers: Open in CodeFlow

@dariusclay
Copy link
Member

I love porting until I realize my commit history is lost. 🤣

// Azure DevOps environment variables: https://learn.microsoft.com/azure/devops/pipelines/build/variables#build-variables-devops-services
internal static string? AzureBuildId = Environment.GetEnvironmentVariable("Build_BuildId");
internal static string? AzureBuildNumber = Environment.GetEnvironmentVariable("Build_BuildNumber");
internal static string? AzureSourceBranchName = Environment.GetEnvironmentVariable("Build_SourceBranchName");
Copy link

Choose a reason for hiding this comment

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

Couldn't this alternatively be fetched by the InitializeSourceControlInformation and related targets in MSBuild that are used for SourceLink, that way this would work for local builds as well as CI.

Copy link
Member Author

Choose a reason for hiding this comment

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

updated to fetch data from MSBuild properties, which by default are initialized from environment variables.

Copy link

@KalleOlaviNiemitalo KalleOlaviNiemitalo left a comment

Choose a reason for hiding this comment

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

What's the purpose of the empty src/Libraries/Microsoft.Extensions.AmbientMetadata.Build/Microsoft.Extensions.AmbientMetadata.Build.json file?

@evgenyfedorov2
Copy link
Member Author

What's the purpose of the empty src/Libraries/Microsoft.Extensions.AmbientMetadata.Build/Microsoft.Extensions.AmbientMetadata.Build.json file?

Removed :)

@evgenyfedorov2 evgenyfedorov2 marked this pull request as ready for review September 16, 2025 13:06
@evgenyfedorov2 evgenyfedorov2 requested a review from a team as a code owner September 16, 2025 13:06
@Copilot Copilot AI review requested due to automatic review settings September 16, 2025 13:06
Copy link
Contributor

@Copilot 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

This PR introduces a new AmbientMetadata.Build component that provides automatic build metadata collection from CI/CD pipelines. The component uses source generation to extract build information at compile time and register it in the dependency injection container as IOptions.

Key changes:

  • New BuildMetadata class with properties for build ID, number, branch name, and source version
  • Source generator that reads MSBuild properties and generates configuration extensions
  • Support for both Azure DevOps and GitHub Actions CI environments

Reviewed Changes

Copilot reviewed 20 out of 24 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
src/Libraries/Microsoft.Extensions.AmbientMetadata.Build/BuildMetadata.cs Defines the core data model for build metadata
src/Generators/Microsoft.Gen.BuildMetadata/BuildMetadataGenerator.cs Main source generator that creates build metadata extensions
src/Libraries/Microsoft.Extensions.AmbientMetadata.Build/BuildMetadataServiceCollectionExtensions.cs Extension methods for registering BuildMetadata in DI container
src/Libraries/Microsoft.Extensions.AmbientMetadata.Build/buildTransitive/Microsoft.Extensions.AmbientMetadata.Build.props MSBuild properties file that maps CI environment variables to build properties
test/Libraries/Microsoft.Extensions.AmbientMetadata.Build.Tests/ Unit tests for the build metadata functionality

Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.

…s/ConfigurationBindingQuirkBehaviorTests.cs

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Copy link
Contributor

@Copilot 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 20 out of 24 changed files in this pull request and generated 2 comments.


Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.

@evgenyfedorov2 evgenyfedorov2 force-pushed the users/evgenyfedorov2/add_build_metadata branch from 9e1009a to 7ed6565 Compare September 16, 2025 13:15
Copy link
Contributor

@Copilot 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 20 out of 24 changed files in this pull request and generated 2 comments.


Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.

Comment on lines +25 to +26
return !string.IsNullOrEmpty(value) &&
string.Equals(value, "true", System.StringComparison.OrdinalIgnoreCase);
Copy link
Preview

Copilot AI Sep 16, 2025

Choose a reason for hiding this comment

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

The boolean parsing logic only recognizes 'true' as true and treats everything else (including 'false') as false. Consider using bool.TryParse for more robust boolean parsing that handles both 'true' and 'false' values correctly.

Suggested change
return !string.IsNullOrEmpty(value) &&
string.Equals(value, "true", System.StringComparison.OrdinalIgnoreCase);
return bool.TryParse(value, out var result) && result;

Copilot uses AI. Check for mistakes.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants