Skip to content
Merged
Show file tree
Hide file tree
Changes from 8 commits
Commits
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
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,21 @@ jobs:
global-json-file: global.json

- name: "Regenerating package versions"
run: .\tracer\build.ps1 GeneratePackageVersions
run: .\tracer\build.ps1 GeneratePackageVersions --PackageVersionCooldownDays 2

- name: Read cooldown report
id: cooldown
if: always()
shell: pwsh
run: |
$report = ""
$reportPath = ".nuke/temp/cooldown_report.md"
if (Test-Path $reportPath) {
$report = Get-Content $reportPath -Raw
}
"report<<EOF" >> $env:GITHUB_OUTPUT
$report >> $env:GITHUB_OUTPUT
"EOF" >> $env:GITHUB_OUTPUT

- name: Create Pull Request
id: pr
Expand All @@ -55,6 +69,8 @@ jobs:
body: |
Updates the package versions for integration tests.

${{ steps.cooldown.outputs.report }}

- name: Send Slack notification about generating failure
if: failure()
uses: slackapi/slack-github-action@91efab103c0de0a537f72a35f6b8cda0ee76bf0a # v2.1.1
Expand Down
20 changes: 10 additions & 10 deletions tracer/build/PackageVersionsLatestMinors.g.props
Original file line number Diff line number Diff line change
Expand Up @@ -10507,7 +10507,7 @@ NOTE: This code was generated by the GeneratePackageVersions tool. To safely
<SampleName>Samples.GoogleProtobuf</SampleName>
</PackageVersionSample>
<PackageVersionSample Include="test\test-applications\integrations\Samples.GoogleProtobuf\Samples.GoogleProtobuf.csproj">
<Properties>ApiVersion=3.25.8;RestoreRecursive=false;BuildProjectReferences=false</Properties>
<Properties>ApiVersion=3.25.9;RestoreRecursive=false;BuildProjectReferences=false</Properties>
<TargetFramework>net48</TargetFramework>
<RequiresDockerDependency>None</RequiresDockerDependency>
<SampleName>Samples.GoogleProtobuf</SampleName>
Expand Down Expand Up @@ -10717,7 +10717,7 @@ NOTE: This code was generated by the GeneratePackageVersions tool. To safely
<SampleName>Samples.GoogleProtobuf</SampleName>
</PackageVersionSample>
<PackageVersionSample Include="test\test-applications\integrations\Samples.GoogleProtobuf\Samples.GoogleProtobuf.csproj">
<Properties>ApiVersion=3.25.8;RestoreRecursive=false;BuildProjectReferences=false</Properties>
<Properties>ApiVersion=3.25.9;RestoreRecursive=false;BuildProjectReferences=false</Properties>
<TargetFramework>netcoreapp2.1</TargetFramework>
<RequiresDockerDependency>None</RequiresDockerDependency>
<SampleName>Samples.GoogleProtobuf</SampleName>
Expand Down Expand Up @@ -10927,7 +10927,7 @@ NOTE: This code was generated by the GeneratePackageVersions tool. To safely
<SampleName>Samples.GoogleProtobuf</SampleName>
</PackageVersionSample>
<PackageVersionSample Include="test\test-applications\integrations\Samples.GoogleProtobuf\Samples.GoogleProtobuf.csproj">
<Properties>ApiVersion=3.25.8;RestoreRecursive=false;BuildProjectReferences=false</Properties>
<Properties>ApiVersion=3.25.9;RestoreRecursive=false;BuildProjectReferences=false</Properties>
<TargetFramework>netcoreapp3.0</TargetFramework>
<RequiresDockerDependency>None</RequiresDockerDependency>
<SampleName>Samples.GoogleProtobuf</SampleName>
Expand Down Expand Up @@ -11137,7 +11137,7 @@ NOTE: This code was generated by the GeneratePackageVersions tool. To safely
<SampleName>Samples.GoogleProtobuf</SampleName>
</PackageVersionSample>
<PackageVersionSample Include="test\test-applications\integrations\Samples.GoogleProtobuf\Samples.GoogleProtobuf.csproj">
<Properties>ApiVersion=3.25.8;RestoreRecursive=false;BuildProjectReferences=false</Properties>
<Properties>ApiVersion=3.25.9;RestoreRecursive=false;BuildProjectReferences=false</Properties>
<TargetFramework>netcoreapp3.1</TargetFramework>
<RequiresDockerDependency>None</RequiresDockerDependency>
<SampleName>Samples.GoogleProtobuf</SampleName>
Expand Down Expand Up @@ -11347,7 +11347,7 @@ NOTE: This code was generated by the GeneratePackageVersions tool. To safely
<SampleName>Samples.GoogleProtobuf</SampleName>
</PackageVersionSample>
<PackageVersionSample Include="test\test-applications\integrations\Samples.GoogleProtobuf\Samples.GoogleProtobuf.csproj">
<Properties>ApiVersion=3.25.8;RestoreRecursive=false;BuildProjectReferences=false</Properties>
<Properties>ApiVersion=3.25.9;RestoreRecursive=false;BuildProjectReferences=false</Properties>
<TargetFramework>net5.0</TargetFramework>
<RequiresDockerDependency>None</RequiresDockerDependency>
<SampleName>Samples.GoogleProtobuf</SampleName>
Expand Down Expand Up @@ -11557,7 +11557,7 @@ NOTE: This code was generated by the GeneratePackageVersions tool. To safely
<SampleName>Samples.GoogleProtobuf</SampleName>
</PackageVersionSample>
<PackageVersionSample Include="test\test-applications\integrations\Samples.GoogleProtobuf\Samples.GoogleProtobuf.csproj">
<Properties>ApiVersion=3.25.8;RestoreRecursive=false;BuildProjectReferences=false</Properties>
<Properties>ApiVersion=3.25.9;RestoreRecursive=false;BuildProjectReferences=false</Properties>
<TargetFramework>net6.0</TargetFramework>
<RequiresDockerDependency>None</RequiresDockerDependency>
<SampleName>Samples.GoogleProtobuf</SampleName>
Expand Down Expand Up @@ -11767,7 +11767,7 @@ NOTE: This code was generated by the GeneratePackageVersions tool. To safely
<SampleName>Samples.GoogleProtobuf</SampleName>
</PackageVersionSample>
<PackageVersionSample Include="test\test-applications\integrations\Samples.GoogleProtobuf\Samples.GoogleProtobuf.csproj">
<Properties>ApiVersion=3.25.8;RestoreRecursive=false;BuildProjectReferences=false</Properties>
<Properties>ApiVersion=3.25.9;RestoreRecursive=false;BuildProjectReferences=false</Properties>
<TargetFramework>net7.0</TargetFramework>
<RequiresDockerDependency>None</RequiresDockerDependency>
<SampleName>Samples.GoogleProtobuf</SampleName>
Expand Down Expand Up @@ -11977,7 +11977,7 @@ NOTE: This code was generated by the GeneratePackageVersions tool. To safely
<SampleName>Samples.GoogleProtobuf</SampleName>
</PackageVersionSample>
<PackageVersionSample Include="test\test-applications\integrations\Samples.GoogleProtobuf\Samples.GoogleProtobuf.csproj">
<Properties>ApiVersion=3.25.8;RestoreRecursive=false;BuildProjectReferences=false</Properties>
<Properties>ApiVersion=3.25.9;RestoreRecursive=false;BuildProjectReferences=false</Properties>
<TargetFramework>net8.0</TargetFramework>
<RequiresDockerDependency>None</RequiresDockerDependency>
<SampleName>Samples.GoogleProtobuf</SampleName>
Expand Down Expand Up @@ -12187,7 +12187,7 @@ NOTE: This code was generated by the GeneratePackageVersions tool. To safely
<SampleName>Samples.GoogleProtobuf</SampleName>
</PackageVersionSample>
<PackageVersionSample Include="test\test-applications\integrations\Samples.GoogleProtobuf\Samples.GoogleProtobuf.csproj">
<Properties>ApiVersion=3.25.8;RestoreRecursive=false;BuildProjectReferences=false</Properties>
<Properties>ApiVersion=3.25.9;RestoreRecursive=false;BuildProjectReferences=false</Properties>
<TargetFramework>net9.0</TargetFramework>
<RequiresDockerDependency>None</RequiresDockerDependency>
<SampleName>Samples.GoogleProtobuf</SampleName>
Expand Down Expand Up @@ -12397,7 +12397,7 @@ NOTE: This code was generated by the GeneratePackageVersions tool. To safely
<SampleName>Samples.GoogleProtobuf</SampleName>
</PackageVersionSample>
<PackageVersionSample Include="test\test-applications\integrations\Samples.GoogleProtobuf\Samples.GoogleProtobuf.csproj">
<Properties>ApiVersion=3.25.8;RestoreRecursive=false;BuildProjectReferences=false</Properties>
<Properties>ApiVersion=3.25.9;RestoreRecursive=false;BuildProjectReferences=false</Properties>
<TargetFramework>net10.0</TargetFramework>
<RequiresDockerDependency>None</RequiresDockerDependency>
<SampleName>Samples.GoogleProtobuf</SampleName>
Expand Down
4 changes: 2 additions & 2 deletions tracer/build/PackageVersionsLatestSpecific.g.props
Original file line number Diff line number Diff line change
Expand Up @@ -7051,13 +7051,13 @@ NOTE: This code was generated by the GeneratePackageVersions tool. To safely
<SampleName>Samples.CosmosDb.Vnext</SampleName>
</PackageVersionSample>
<PackageVersionSample Include="test\test-applications\integrations\LogsInjection.Serilog\LogsInjection.Serilog.csproj">
<Properties>ApiVersion=1.5.14;RestoreRecursive=false;BuildProjectReferences=false</Properties>
<Properties>ApiVersion=1.4.214;RestoreRecursive=false;BuildProjectReferences=false</Properties>
<TargetFramework>net48</TargetFramework>
<RequiresDockerDependency>None</RequiresDockerDependency>
<SampleName>LogsInjection.Serilog</SampleName>
</PackageVersionSample>
<PackageVersionSample Include="test\test-applications\integrations\LogsInjection.Serilog\LogsInjection.Serilog.csproj">
<Properties>ApiVersion=1.4.214;RestoreRecursive=false;BuildProjectReferences=false</Properties>
<Properties>ApiVersion=1.5.14;RestoreRecursive=false;BuildProjectReferences=false</Properties>
<TargetFramework>net48</TargetFramework>
<RequiresDockerDependency>None</RequiresDockerDependency>
<SampleName>LogsInjection.Serilog</SampleName>
Expand Down
85 changes: 84 additions & 1 deletion tracer/build/_build/Build.Utilities.cs
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,9 @@ partial class Build
[Parameter("Only update package versions for packages with the following names")]
readonly string[] IncludePackages;

[Parameter("Minimum age in days a NuGet package version must have been published before auto-including. Defaults to 2 days, or 0 when --IncludePackages is set")]
readonly int? PackageVersionCooldownDays;

[LazyLocalExecutable(@"C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools\gacutil.exe")]
readonly Lazy<Tool> GacUtil;
[LazyLocalExecutable(@"C:\Program Files\IIS Express\iisexpress.exe")]
Expand Down Expand Up @@ -247,11 +250,89 @@ partial class Build
var previousSupportedVersions = await GenerateSupportMatrix.LoadPreviousVersions(supportedVersionsPath);
Logger.Information("Loaded previous supported versions with {Count} entries", previousSupportedVersions.Count);

// Derive baseline from supported_versions.json: the max tested version per package
// acts as a floor to prevent cooldown filtering from downgrading previously accepted versions.
var baseline = previousSupportedVersions
.Where(kvp => kvp.Value.MaxVersionTestedInclusive is not null)
.GroupBy(kvp => kvp.Key.PackageName)
.ToDictionary(
g => g.Key,
g => g.Max(kvp => new Version(kvp.Value.MaxVersionTestedInclusive!)));
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Scope cooldown baseline by package range

Building baseline as a single max tested version per package lets newer versions in lower compatibility ranges bypass the cooldown check. PackageVersionsGeneratorDefinitions.json contains multiple entries for the same package with different ranges (for example, GraphQL has 4.1.0-6.0.0 and 7.0.0-9.0.0), so a high tested baseline from one range (e.g., 8.x) makes all 5.x versions satisfy version <= baseline in ApplyCooldown, even when they were published within the cooldown window. That defeats the remediation goal for split-range packages; baseline needs to be keyed by the specific entry/range (or assembly+package) instead of package name alone.

Useful? React with 👍 / 👎.

Logger.Information("Derived version baseline with {Count} entries from supported_versions.json", baseline.Count);

// Resolve effective cooldown:
// - Explicit --PackageVersionCooldownDays wins
// - --IncludePackages without explicit cooldown defaults to 0
var effectiveCooldownDays = PackageVersionCooldownDays ?? (IncludePackages is not null ? 0 : 2);

// Pipeline A: generate .g.props/.g.cs files
var versionGenerator = new PackageVersionGenerator(TracerDirectory, testDir, shouldUpdatePackage, previousVersionCache);
Logger.Information("Using package version cooldown of {Days} days", effectiveCooldownDays);
var versionGenerator = new PackageVersionGenerator(TracerDirectory, testDir, shouldUpdatePackage, previousVersionCache, effectiveCooldownDays, baseline);
var testedVersions = await versionGenerator.GenerateVersions(Solution);
await NuGetVersionCache.Save(cacheFilePath, versionGenerator.VersionCache);

// Log version changes: bumps, unchanged, and overridden
var versionCache = versionGenerator.VersionCache;
var bumped = 0;
var unchanged = 0;
foreach (var tested in testedVersions)
{
var packageName = tested.NugetPackageSearchName;
baseline.TryGetValue(packageName, out var previousMax);

if (previousMax is null || tested.MaxVersion > previousMax)
{
bumped++;
var publishedDate = "(unknown)";
if (versionCache.TryGetValue(packageName, out var cachedVersions))
{
var match = cachedVersions.FirstOrDefault(v => v.Version == tested.MaxVersion.ToString());
if (match?.Published is not null)
{
publishedDate = match.Published.Value.ToString("yyyy-MM-dd");
}
}

Logger.Information(
" {Package} {Previous} -> {Current} (published {Date}, https://www.nuget.org/packages/{Package}/{Current})",
packageName,
previousMax?.ToString() ?? "(new)",
tested.MaxVersion,
publishedDate,
packageName,
tested.MaxVersion);
}
else
{
unchanged++;
}
}

Logger.Information("{Bumped} package(s) bumped, {Unchanged} unchanged", bumped, unchanged);

if (versionGenerator.CooldownReport.HasEntries)
{
Logger.Warning(
"{Count} package version(s) were excluded due to the {Days}-day cooldown period",
versionGenerator.CooldownReport.Entries.Count,
effectiveCooldownDays);

foreach (var entry in versionGenerator.CooldownReport.Entries)
{
var resolvedText = entry.ResolvedVersion is not null ? $"using: {entry.ResolvedVersion}" : "skipped";
Logger.Warning(
" {Package} {Version} overridden (published {Date}, {Resolved})",
entry.PackageName,
entry.OverriddenVersion,
entry.PublishedDate?.ToString("yyyy-MM-dd") ?? "unknown",
resolvedText);
}

var reportPath = TemporaryDirectory / "cooldown_report.md";
await versionGenerator.CooldownReport.SaveToFile(reportPath);
Logger.Information("Cooldown report saved to {Path}", reportPath);
}

var assemblies = MonitoringHomeDirectory
.GlobFiles("**/Datadog.Trace.dll")
.Select(x => x.ToString())
Expand All @@ -260,6 +341,8 @@ partial class Build
var integrations = GenerateIntegrationDefinitions.GetAllIntegrations(assemblies, definitionsFile);

// Pipeline B: generate dependabot files + supported_versions.json
// TestedVersions are cooldown-filtered but the baseline prevents downgrades,
// so they accurately reflect what we're testing.
var distinctIntegrations = await DependabotFileManager.BuildDistinctIntegrationMaps(
integrations, testedVersions, shouldUpdatePackage, previousSupportedVersions);

Expand Down
89 changes: 89 additions & 0 deletions tracer/build/_build/GeneratePackageVersions/CooldownReport.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
// <copyright file="CooldownReport.cs" company="Datadog">
// Unless explicitly stated otherwise all files in this repository are licensed under the Apache 2 License.
// This product includes software developed at Datadog (https://www.datadoghq.com/). Copyright 2017 Datadog, Inc.
// </copyright>

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading.Tasks;

namespace GeneratePackageVersions;

/// <summary>
/// Collects package versions that were excluded by the cooldown filter
/// and renders them as a markdown report for inclusion in the PR body.
/// </summary>
public class CooldownReport
{
private readonly int _cooldownDays;
private readonly List<CooldownEntry> _entries = new();
private readonly HashSet<(string PackageName, string Version)> _seen = new();

public CooldownReport(int cooldownDays)
{
_cooldownDays = cooldownDays;
}

public bool HasEntries => _entries.Count > 0;

public IReadOnlyList<CooldownEntry> Entries => _entries;

public void Add(CooldownEntry entry)
{
// Deduplicate: the same version gets flagged once per framework and per selection group,
// but we only need to report it once.
if (_seen.Add((entry.PackageName, entry.OverriddenVersion)))
{
_entries.Add(entry);
}
}

public string ToMarkdown()
{
if (_entries.Count == 0)
{
return string.Empty;
}

var sb = new StringBuilder();
sb.AppendLine($"## Package Version Cooldown Report");
sb.AppendLine();
sb.AppendLine($"The following versions were published less than **{_cooldownDays} days** ago and have been overridden.");
sb.AppendLine("These require manual review before inclusion.");
sb.AppendLine();
sb.AppendLine("| Package | Integration | Overridden Version | Published | Age (days) | Using Instead |");
sb.AppendLine("|---------|-------------|--------------------|-----------|------------|---------------|");

foreach (var entry in _entries)
{
var published = entry.PublishedDate?.ToString("yyyy-MM-dd") ?? "unknown";
var age = entry.PublishedDate.HasValue
? ((int)(DateTimeOffset.UtcNow - entry.PublishedDate.Value).TotalDays).ToString()
: "?";
var usingInstead = entry.ResolvedVersion ?? "(skipped)";

sb.AppendLine($"| {entry.PackageName} | {entry.IntegrationName} | {entry.OverriddenVersion} | {published} | {age} | {usingInstead} |");
}

return sb.ToString();
}

public async Task SaveToFile(string path)
{
var markdown = ToMarkdown();
if (!string.IsNullOrEmpty(markdown))
{
// necessary to save to a file so that we can then output it in the PR description
await File.WriteAllTextAsync(path, markdown);
}
}

public record CooldownEntry(
string PackageName,
string IntegrationName,
string OverriddenVersion,
DateTimeOffset? PublishedDate,
string ResolvedVersion);
}
Loading
Loading