Skip to content

Commit 665932a

Browse files
authored
Diff release version against previous version from Nuget (#4223)
This commit adds a new build target to diff the release version against the previous version on Nuget, to identify breaking API changes. This new build target is added as a dependent target of the release target.
1 parent 3f3f98c commit 665932a

File tree

3 files changed

+87
-7
lines changed

3 files changed

+87
-7
lines changed

build/scripts/Differ.fs

+75-4
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,86 @@
11
namespace Scripts
22

3+
open System.Collections.Generic
4+
open System.IO
5+
open System.Threading
36
open Fake.Core
7+
open Fake.IO
8+
open Fake.IO.Globbing.Operators
9+
open NuGet.Common
10+
open NuGet.Protocol.Core.Types
11+
open NuGet.Protocol
12+
open NuGet.Configuration
13+
open NuGet.Versioning
414
open Commandline
15+
open Projects
516

6-
module Differ =
7-
8-
let Run args =
9-
Tooling.DotNet.Exec ["tool"; "restore"]
17+
module Differ =
18+
let private nestJsonNetSerializerNugetId = (Project NestJsonNetSerializer).NugetId
19+
20+
let private netStandard20Identifier = DotNetFramework.NetStandard2_0.Identifier.Nuget
21+
22+
let private findPreviousVersionOnNuget (version:string) =
23+
let nugetVersion = new NuGetVersion(version)
24+
let providers = new List<Lazy<INuGetResourceProvider>>();
25+
providers.AddRange(Repository.Provider.GetCoreV3());
26+
let packageSource = new PackageSource("https://api.nuget.org/v3/index.json")
27+
let sourceRepository = new SourceRepository(packageSource, providers)
28+
let metadata = sourceRepository.GetResource<PackageMetadataResource>()
29+
let searchMetadata =
30+
metadata.GetMetadataAsync(nestJsonNetSerializerNugetId, false, false, NullLogger.Instance, CancellationToken.None)
31+
|> Async.AwaitTask
32+
|> Async.RunSynchronously
33+
34+
let previousPackage = searchMetadata
35+
|> Seq.cast<PackageSearchMetadata>
36+
|> Seq.sortByDescending (fun p -> p.Version)
37+
|> Seq.filter (fun p -> p.Version < nugetVersion)
38+
|> Seq.tryHead
39+
40+
match previousPackage with
41+
| Some p -> Some(p.Version.ToFullString())
42+
| None -> None
43+
44+
let private unzipReleasePackages () =
45+
!! (Fake.IO.Path.combine Paths.NugetOutput "*.nupkg")
46+
|> Seq.iter(fun f ->
47+
let name = Path.GetFileNameWithoutExtension(f)
48+
let directory = Path.Combine(Paths.NugetOutput, name)
49+
Zip.unzip directory f
50+
)
1051

52+
let tmp = Fake.IO.Path.combine Paths.NugetOutput "tmp"
53+
if Directory.Exists tmp then Directory.delete tmp
54+
Directory.create tmp
55+
56+
Directory.EnumerateDirectories(Paths.NugetOutput)
57+
|> Seq.filter (fun d -> d <> tmp)
58+
|> Seq.iter(fun d ->
59+
let netstandard20Dlls = System.IO.Path.Combine(d, "lib", netStandard20Identifier)
60+
Directory.EnumerateFiles(netstandard20Dlls, "*.dll") |> Shell.copyFiles tmp
61+
)
62+
63+
tmp |> Path.GetFullPath
64+
65+
let Run args =
66+
Tooling.DotNet.Exec ["tool"; "restore"]
1167
let differ = "assembly-differ"
1268
let args = args.RemainingArguments |> String.concat " "
1369
let command = sprintf @"%s %s -o ../../%s" differ args Paths.BuildOutput
1470
Environment.setEnvironVar "NUGET" Tooling.nugetFile
1571
Tooling.DotNet.ExecIn Paths.TargetsFolder [command] |> ignore
72+
73+
let DiffWithPreviousNugetVersion args =
74+
match args.CommandArguments with
75+
| SetVersion v ->
76+
let previousVersion = findPreviousVersionOnNuget v.Version
77+
match previousVersion with
78+
| Some p ->
79+
let directory = unzipReleasePackages ()
80+
let command = [ sprintf "nuget|%s|%s|%s" nestJsonNetSerializerNugetId p netStandard20Identifier;
81+
sprintf "directory|%s" directory ]
82+
83+
System.Console.WriteLine("Running diff of {0}, {1} from Nuget against local {2}", netStandard20Identifier, p, v.Version)
84+
Run { args with RemainingArguments = command }
85+
| None -> failwithf "Could not find previous version on Nuget for version %s" v.Version
86+
| _ -> failwith "DiffWithPreviousNugetVersion can only be run with SetVersion arguments"

build/scripts/Targets.fs

+9-2
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,9 @@ module Main =
7575

7676
conditional (parsed.Target = "canary" && not isMono) "nuget-pack-versioned" <| fun _ -> Release.NugetPackVersioned artifactsVersion
7777

78-
conditional (parsed.Target <> "canary") "generate-release-notes" <| fun _ -> ReleaseNotes.GenerateNotes buildVersions
78+
conditional (parsed.Target <> "canary") "generate-release-notes" <| fun _ -> ReleaseNotes.GenerateNotes buildVersions
79+
80+
conditional (parsed.Target <> "canary") "diff-against-nuget" <| fun _ -> Differ.DiffWithPreviousNugetVersion parsed
7981

8082
target "validate-artifacts" <| fun _ -> Versioning.ValidateArtifacts artifactsVersion
8183

@@ -93,7 +95,12 @@ module Main =
9395
command "integrate" [ "clean"; "restore"; "full-build";] <| fun _ -> Tests.RunIntegrationTests parsed
9496

9597
command "release" [
96-
"build"; "nuget-pack"; "nuget-pack-versioned"; "validate-artifacts"; "generate-release-notes"
98+
"build";
99+
"nuget-pack";
100+
"nuget-pack-versioned";
101+
"validate-artifacts";
102+
"diff-against-nuget";
103+
"generate-release-notes"
97104
] (fun _ -> printfn "Finished Release Build %O" artifactsVersion)
98105

99106
command "diff" [ "clean"; ] <| fun _ -> Differ.Run parsed

build/scripts/scripts.fsproj

+3-1
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,13 @@
4242
<PackageReference Include="Fake.Core.SemVer" Version="5.15.0" />
4343
<PackageReference Include="Fake.IO.FileSystem" Version="5.15.0" />
4444
<PackageReference Include="Fake.IO.Zip" Version="5.15.0" />
45-
4645

4746
<PackageReference Include="ILRepack" Version="2.1.0-beta1" />
4847
<PackageReference Include="Newtonsoft.Json" Version="12.0.1" />
4948
<PackageReference Include="NuGet.CommandLine" Version="4.9.4" />
49+
<PackageReference Include="NuGet.PackageManagement" Version="5.3.1" />
50+
<PackageReference Include="NuGet.Protocol.Core.v3" Version="4.2.0" />
51+
5052
<PackageReference Include="Octokit" Version="0.32.0" />
5153
<PackageReference Include="Proc" Version="0.6.1" />
5254
</ItemGroup>

0 commit comments

Comments
 (0)