From 4cfcf48720dd3092435aaf98a6dd0bf349dc62f9 Mon Sep 17 00:00:00 2001 From: Martijn Laarman Date: Thu, 12 Nov 2026 14:59:12 +0100 Subject: [PATCH 1/2] Move to Nullean.Argh and Nullean.Make 0.30.0 and Proc 0.22.1 Nullean.Make.Fs 0.30.0 replaces `executes (shell { ... })` inside `command { }` with `command { ... } |> executes { ... }`, so the build script moves to that form. Co-Authored-By: Claude Opus 5.5 --- Directory.Packages.props | 4 ++-- build/scripts/Program.fs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 0124cdd..169f75f 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -6,7 +6,7 @@ - + @@ -18,6 +18,6 @@ - + diff --git a/build/scripts/Program.fs b/build/scripts/Program.fs index ae72e1e..59ac687 100644 --- a/build/scripts/Program.fs +++ b/build/scripts/Program.fs @@ -48,8 +48,8 @@ let main argv = for project in Directory.EnumerateFiles("src", "*.?sproj", SearchOption.AllDirectories) do sh $"dotnet clean {project} -c Release -v q" } | Build -> command { - composes [Clean] - executes (shell { sh $"dotnet build -c Release" }) } + composes [Clean] } + |> executes { sh $"dotnet build -c Release" } // there are no tests, so ci is pack: build, then create, validate and diff the packages | Pack -> command { requires [Build]; composes [Generatepackages; Validatepackages; Generateapichanges] } | Ci -> command { requires [Pack]; composes [] } From 225a070089d26807ba67538b9d0f22acc103e759 Mon Sep 17 00:00:00 2001 From: Martijn Laarman Date: Thu, 12 Nov 2026 15:37:09 +0100 Subject: [PATCH 2/2] Target net11.0, and drop net8.0 now it is out of support The tool now builds for net10.0 and net11.0. The build follows: the managed frameworks the any package is patched for, and the AOT smoke and container publish, which move to net11.0 on the 11.0 chiseled image. The API diff already compared net10.0 builds. With net8.0 gone the NuGet.Versioning 7.x pin is dead, and nothing runs on the .NET 10 runtime any more, so mise stops installing it. Co-Authored-By: Claude Opus 5.5 --- AGENTS.md | 5 ++--- Directory.Packages.props | 4 +--- README.md | 2 +- build/scripts/Paths.fs | 2 +- build/scripts/Program.fs | 8 ++++---- mise.toml | 4 ++-- src/release-notes/release-notes.csproj | 4 ++-- 7 files changed, 13 insertions(+), 16 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 77fbe55..de59b1b 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -9,7 +9,7 @@ container (`ghcr.io/nullean/release-notes`) and a GitHub Action (`action.yml`) t | Path | What | |---|---| -| `src/release-notes` | the tool (net8.0 and net10.0), a `Nullean.Argh` CLI; `ReleaseNotesCommands.cs` holds the commands | +| `src/release-notes` | the tool (net10.0 and net11.0), a `Nullean.Argh` CLI; `ReleaseNotesCommands.cs` holds the commands | | `src/release-notes/GitHubReleaseClient.cs` | the GitHub writes (releases, labels), source-generated JSON instead of Octokit | | `build/scripts` | the F# build ([Nullean.Make.Fs](https://www.nuget.org/packages/Nullean.Make.Fs), net11.0) the `mise` tasks and CI call | | `build/keys` | the strong-name key the tool's own assembly is signed with | @@ -17,8 +17,7 @@ container (`ghcr.io/nullean/release-notes`) and a GitHub Action (`action.yml`) t ## Commands -mise installs the SDK pinned in `global.json` (plus the net10.0 runtime nupkg-validator runs on). Run -everything through it: +mise installs the SDK pinned in `global.json`. Run everything through it: ```bash mise run build # build the solution diff --git a/Directory.Packages.props b/Directory.Packages.props index 169f75f..0cbd354 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -7,9 +7,7 @@ - - - + diff --git a/README.md b/README.md index 205b1a7..43af66e 100644 --- a/README.md +++ b/README.md @@ -127,7 +127,7 @@ The tool ships as one package per platform. Install the root package; the .NET S |---|---|---| | [`release-notes`](src/release-notes/README.md) | the tool; points the SDK at the package for your platform | [![NuGet](https://img.shields.io/nuget/v/release-notes?style=flat-square)](https://www.nuget.org/packages/release-notes) | | `release-notes.` | the native-AOT build for `linux-x64`, `linux-arm64`, `win-x64`, `win-arm64` and `osx-arm64` | [![NuGet](https://img.shields.io/nuget/v/release-notes.linux-x64?style=flat-square)](https://www.nuget.org/packages/release-notes.linux-x64) | -| `release-notes.any` | the framework-dependent fallback (net8.0, net10.0) for every other platform | [![NuGet](https://img.shields.io/nuget/v/release-notes.any?style=flat-square)](https://www.nuget.org/packages/release-notes.any) | +| `release-notes.any` | the framework-dependent fallback (net10.0, net11.0) for every other platform | [![NuGet](https://img.shields.io/nuget/v/release-notes.any?style=flat-square)](https://www.nuget.org/packages/release-notes.any) | ## Learn more diff --git a/build/scripts/Paths.fs b/build/scripts/Paths.fs index c23d1d1..eefef63 100644 --- a/build/scripts/Paths.fs +++ b/build/scripts/Paths.fs @@ -12,7 +12,7 @@ let AotRuntimeIdentifiers = ["linux-x64"; "linux-arm64"; "win-x64"; "win-arm64"; /// Must mirror release-notes.csproj's TargetFrameworks. Used to patch the signed managed dll back /// into the packed 'any' fallback for every TFM it ships — see fixAnyPackageSigning in Targets.fs. -let ManagedTargetFrameworks = ["net8.0"; "net10.0"] +let ManagedTargetFrameworks = ["net10.0"; "net11.0"] let Root = let mutable dir = DirectoryInfo(".") diff --git a/build/scripts/Program.fs b/build/scripts/Program.fs index 59ac687..ece3642 100644 --- a/build/scripts/Program.fs +++ b/build/scripts/Program.fs @@ -107,13 +107,13 @@ let main argv = // works, with no ghcr.io credentials configured there. Only the build job, which does log in, passes // --push. | Publishcontainers -> target [] { - let baseImage = "mcr.microsoft.com/dotnet/runtime-deps:10.0-noble-chiseled" + let baseImage = "mcr.microsoft.com/dotnet/runtime-deps:11.0-resolute-chiseled" // MSBuild reads the quotes: without them the tags' `;` would split the property let tags = $"ContainerImageTags=\"{Packaging.containerImageTags Versions.current.Value}\"" if push.Value then - sh $"dotnet publish {toolProject} -c Release -f net10.0 -r linux-x64 /t:PublishContainer -p DebugType=none -p ContainerBaseImage={baseImage} -p ContainerRepository={Paths.Repository} -p {tags} -p ContainerUser=1001:1001 -p ContainerRegistry=ghcr.io" + sh $"dotnet publish {toolProject} -c Release -f net11.0 -r linux-x64 /t:PublishContainer -p DebugType=none -p ContainerBaseImage={baseImage} -p ContainerRepository={Paths.Repository} -p {tags} -p ContainerUser=1001:1001 -p ContainerRegistry=ghcr.io" else - sh $"dotnet publish {toolProject} -c Release -f net10.0 -r linux-x64 /t:PublishContainer -p DebugType=none -p ContainerBaseImage={baseImage} -p ContainerRepository={Paths.Repository} -p {tags} -p ContainerUser=1001:1001" } + sh $"dotnet publish {toolProject} -c Release -f net11.0 -r linux-x64 /t:PublishContainer -p DebugType=none -p ContainerBaseImage={baseImage} -p ContainerRepository={Paths.Repository} -p {tags} -p ContainerUser=1001:1001" } // The framework-dependent build cannot catch what trimming breaks: #47 broke only the native-AOT binary, where // Octokit's reflection-based JSON returned nothing or threw. So this publishes that binary and reads releases @@ -124,7 +124,7 @@ let main argv = let rid = RuntimeInformation.RuntimeIdentifier let publishDirectory = Path.Combine(Paths.Output.FullName, "aot-smoke") let publish = Paths.RootRelative publishDirectory - sh $"dotnet publish {toolProject} -c Release -f net10.0 -r {rid} -o {publish}" + sh $"dotnet publish {toolProject} -c Release -f net11.0 -r {rid} -o {publish}" let executable = if OperatingSystem.IsWindows() then $"{Paths.ToolName}.exe" else Paths.ToolName let binary = Paths.RootRelative <| Path.Combine(publishDirectory, executable) // Make.Fs quotes each interpolated hole as one argument, so --token stays in the command text diff --git a/mise.toml b/mise.toml index a803641..7b45ff9 100644 --- a/mise.toml +++ b/mise.toml @@ -1,6 +1,6 @@ # Bootstraps the toolchain and is the one entry point: `mise run `, the same task names in every nullean repo. # The .NET SDK version lives only in global.json: the first dotnet entry reads it from there (sdk.version is the first -# "version" key). The net10.0 runtime is listed after it because nupkg-validator runs on net10.0. +# "version" key). List further runtimes after it when tests run on older target frameworks too. [env] DOTNET_NOLOGO = "1" @@ -8,7 +8,7 @@ DOTNET_CLI_TELEMETRY_OPTOUT = "1" DOTNET_SKIP_FIRST_TIME_EXPERIENCE = "1" [tools] -dotnet = ["""{{ read_file(path='global.json') | split(pat='"version"') | nth(n=1) | split(pat='"') | nth(n=1) }}""", "10"] +dotnet = ["""{{ read_file(path='global.json') | split(pat='"version"') | nth(n=1) | split(pat='"') | nth(n=1) }}"""] gh = "latest" zizmor = "1" diff --git a/src/release-notes/release-notes.csproj b/src/release-notes/release-notes.csproj index c0f27b3..859ef6d 100644 --- a/src/release-notes/release-notes.csproj +++ b/src/release-notes/release-notes.csproj @@ -2,7 +2,7 @@ Exe - net8.0;net10.0 + net10.0;net11.0 release-notes ReleaseNotes enable @@ -22,7 +22,7 @@ The root package's DotnetToolSettings.xml (v2) maps each RID to its per-RID package. Installing requires the .NET 10 SDK or greater. --> linux-x64;linux-arm64;win-x64;win-arm64;osx-arm64;any - true