Skip to content

Migrate the build orchestrator from NUKE to Fallout, and refresh the CI workflow actions - #135

Merged
FlorianRappl merged 2 commits into
AngleSharp:develfrom
lahma:fallout
Jul 30, 2026
Merged

Migrate the build orchestrator from NUKE to Fallout, and refresh the CI workflow actions#135
FlorianRappl merged 2 commits into
AngleSharp:develfrom
lahma:fallout

Conversation

@lahma

@lahma lahma commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

NUKE is unmaintained, and its transitive dependency graph is what keeps producing the advisories this repository has been pinning around. Fallout is the maintained hard fork, so this swaps the orchestrator over. The build logic itself is unchanged — same targets, same semantics.

What the tool did

fallout-migrate handled the mechanical part: Nuke.*Fallout.* in .cs/.csproj, NukeBuildFalloutBuild, the <Nuke*> MSBuild properties (all three are still honored under their new names), and .nuke/.fallout/.

What needed hand work

  • Nuke.Common.ProjectModel is not a 1:1 namespace map. Solution and Project now live in Fallout.Solutions, so the naive prefix swap left the file uncompilable.
  • build.ps1 / build.sh are now thin shims. They still provision an SDK the same way, but instead of building and running _build.csproj themselves they end with dotnet tool restore + dotnet fallout. That moves the orchestrator version into .config/dotnet-tools.json — pinned as fallout.cli, which is the package that actually exists; the docs and fallout :setup name Fallout.GlobalTools, which is unpublished. The NUKE_ENTERPRISE_TOKEN feedz block is gone from both scripts.
  • nuke/build/. Fallout's CLI resolves build/_build.csproj by convention when .fallout/parameters.json does not name one, so the directory name is now load-bearing rather than cosmetic. src/AngleSharp.Js.sln and the doc references follow.
  • CVE pins re-derived by restore rather than carried over. Both were deleted and only what still warned was re-added: NuGet.Packaging is now clean (Fallout 11.0.18 resolves 6.14.3), so that pin is gone. System.Security.Cryptography.Xml stays — 11.0.18 still ships 10.0.6. The fix is already committed on Fallout's main but not released, so the pin should come out on the next Fallout bump.
  • Fallout.Common pinned to 11.0.18, the newest published version. There is no newer prerelease to prefer — the only prereleases on the feed are 10.4.0-rc.*, which predate the 11.0 line.

Things worth a reviewer's attention

  • Three GitBase-synced files had to change: build.ps1, build.sh and .gitignore (.nuke/temp.fallout/temp). The migration cannot avoid them, so these edits need folding back into AngleSharp.GitBase or the next sync will undo them. The workflow touched by the second commit is in the same category.
  • The migration itself needed no workflow change. This repository's workflow is hand-written rather than generated from a [GitHubActions] attribute, and it invokes the bootstrap scripts — which keep their interface, including -Target and -AngleSharpVersion. The workflow changes below are independent of the migration and split into their own commit; they can be dropped or landed separately without affecting it.
  • [Fallout.Common.Parameter] stays fully qualified. It reads awkwardly, but unqualifying it is a compile error: Octokit.Internal.ParameterAttribute is also in scope.
  • No CHANGELOG.md line. Nothing here ships in the package, matching how previous build-infrastructure changes were handled.
  • No Dependabot group for Fallout.*, since the repository has no Dependabot configuration at all — adding one is a separate decision.

Second commit: CI workflow actions

Independent of the migration, and separable from it.

Was Now Why
actions/checkout v5 v7 Two majors behind
actions/setup-dotnet v5 v6 One major behind
actions/setup-node v5 v7 Two majors behind
node-version 20.x 20.x Left alone at @FlorianRappl's request
dotnet-version 10.0.x 10.0.x Already the current LTS — no change

Each of those action majors is an ESM migration plus dependency upgrades, with no input changes that affect this workflow. checkout v7 additionally blocks checking out fork PRs under pull_request_target / workflow_run, which this workflow does not use — it triggers on push and pull_request. The oldest of the three majors is six weeks old, the newest two weeks.

Runtime versions are deliberately untouched. 10.0.x is already the current .NET LTS, supported to November 2028. node-version had been bumped to 24.x here on LTS grounds — Node 20 went EOL in April 2026 — but it only feeds the doclet publish, whose npm dependencies are old enough that moving the runtime risks breaking them for no gain, so it is back at 20.x.

One adjacent fix, easy to drop if unwanted: the can_document job used ::set-output, a workflow command deprecated in 2022 that no longer sets anything. Since it is what feeds needs.can_document.outputs.value, the documentation job's if: could not evaluate true while it stayed. Replaced with an append to $GITHUB_OUTPUT; the run log now shows Set output 'value' where it previously showed nothing.

Verification

.\build.ps1 RunUnitTests -AngleSharpVersion 1.5.0 — 286 tests pass on each of net10.0, net462 and net472. Clean, Restore and Compile were exercised individually, -Target argument parsing confirmed, and the AngleSharpVersion parameter confirmed to reach the inner dotnet invocations as --property:AngleSharpVersion=1.5.0. dotnet restore build/_build.csproj reports no NU190x warnings.

The publish targets (Publish / PrePublish) were deliberately not run — they push to nuget.org and create GitHub releases. Their code paths are unchanged apart from the namespace swap.

CI is green on both commits: linux and windows pass on the new action versions, and the Windows job exercises the Fallout bootstrap end to end.

🤖 Generated with Claude Code

NUKE is unmaintained and its transitive dependency graph keeps producing advisories.
Fallout is the maintained hard fork, so the move is mostly a namespace swap plus the
change from a bootstrapped build project to Fallout's tool-manifest model.

`fallout-migrate` handled the mechanical part: `Nuke.*` -> `Fallout.*`,
`NukeBuild` -> `FalloutBuild`, the `<Nuke*>` MSBuild properties, and `.nuke/` ->
`.fallout/`. The rest needed hand work:

- `Nuke.Common.ProjectModel` is not a 1:1 map — `Solution` and `Project` now live in
  `Fallout.Solutions`.
- `build.ps1` / `build.sh` become thin shims. They still provision an SDK, but instead
  of building and running `_build.csproj` they end with `dotnet tool restore` +
  `dotnet fallout`, so the orchestrator version is pinned in
  `.config/dotnet-tools.json` (`fallout.cli`, not the unpublished
  `Fallout.GlobalTools` the docs name). The `NUKE_ENTERPRISE_TOKEN` feedz block is gone.
- `nuke/` -> `build/`, which is where Fallout's CLI resolves `_build.csproj` by
  convention when `.fallout/parameters.json` does not name one.
- Dropped the `NuGet.Packaging` CVE pin — Fallout 11.0.18 resolves a clean 6.14.3. The
  `System.Security.Cryptography.Xml` pin stays: 11.0.18 still ships 10.0.6, and the fix
  upstream is committed but unreleased.

`build.ps1`, `build.sh` and `.gitignore` are normally synced from AngleSharp.GitBase; the
migration cannot avoid touching them, so those edits need folding back upstream.

Verified with `.\build.ps1 RunUnitTests -AngleSharpVersion 1.5.0`: 286 tests pass on
net10.0, net462 and net472, and `-Target` plus parameter passing behave as before.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@lahma
lahma marked this pull request as ready for review July 30, 2026 12:53
@lahma

lahma commented Jul 30, 2026

Copy link
Copy Markdown
Contributor Author

Let me know if this is the shape you like and possibly list of repositories that you would like me to send same updates (dotnet pack + Fallout).

@lahma lahma changed the title Migrate the build orchestrator from NUKE to Fallout Migrate the build orchestrator from NUKE to Fallout, and refresh the CI workflow actions Jul 30, 2026
@lahma
lahma marked this pull request as draft July 30, 2026 13:08
@lahma
lahma marked this pull request as ready for review July 30, 2026 13:09
Comment thread .github/workflows/ci.yml Outdated
uses: actions/setup-node@v7
with:
node-version: "20.x"
node-version: "24.x"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Since the npm deps for the build process are rather old (and I don't want to update because its just SWOT) I am not sure this would break things. I'd keep it at 20. It's only necessary for the doclet.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Reverted — node-version is back at 20.x and the line is now untouched by this PR. Only actions/setup-node itself moves (v5 → v7), which changes the action's own runtime and code, not the Node it installs for the doclet, so the old npm deps see exactly the same 20.x as before.

Happy to drop the setup-node bump too if you'd rather leave that job entirely alone.

@FlorianRappl FlorianRappl left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

LGTM - I'd just keep the Node version untouched to avoid issues there.

@FlorianRappl FlorianRappl added this to the v1.0 milestone Jul 30, 2026
All three actions were a major behind: `actions/checkout` v5 → v7,
`actions/setup-dotnet` v5 → v6, `actions/setup-node` v5 → v7. Each of those majors
is an ESM migration plus dependency upgrades, with no input changes affecting this
workflow. checkout v7 additionally blocks checking out fork PRs under
`pull_request_target`/`workflow_run`, which this workflow does not use — it triggers
on `push` and `pull_request`.

Runtime versions are deliberately left alone. `dotnet-version: 10.0.x` is already the
current LTS, supported to November 2028. `node-version` stays at 20.x: it only feeds
the doclet publish, whose npm dependencies are old enough that moving the runtime
risks breaking them for no benefit here.

Also replaced the `::set-output` workflow command, deprecated since 2022 and no longer
functional, with an append to `$GITHUB_OUTPUT`. It is what feeds
`needs.can_document.outputs.value`, so the documentation job's condition could not
evaluate true while it stayed.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@lahma
lahma marked this pull request as draft July 30, 2026 16:34
@lahma
lahma marked this pull request as ready for review July 30, 2026 16:49

@FlorianRappl FlorianRappl left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Awesome!

@FlorianRappl
FlorianRappl merged commit ae5065e into AngleSharp:devel Jul 30, 2026
5 checks passed
@lahma
lahma deleted the fallout branch July 30, 2026 19:13
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.

2 participants