Skip to content

Add CI, nightly builds and pull request build links - #1273

Open
rr- wants to merge 4 commits into
TombEngine:developfrom
rr-:develop
Open

Add CI, nightly builds and pull request build links#1273
rr- wants to merge 4 commits into
TombEngine:developfrom
rr-:develop

Conversation

@rr-

@rr-rr- commented Jul 30, 2026

Copy link
Copy Markdown

Right now nothing builds the solution or runs the test suite automatically. This adds GitHub Actions on Windows runners (free for public repos) to build and test everything, then reuses that build so testers have something to download.

  • Pull requests: build, run tests, and post a comment with a downloadable artifact (kept for 15 days)
  • Pushes to develop: same as above, plus update a rolling nightly pre-release

job_build.yml is shared between both workflows, so the build logic only lives in one place.

This is demonstrated on my fork:

End-to-end CI takes about 2m40s.
The snapshot ZIP is about 30 MB. The full build output is around 370 MB, mostly because of TIDE/Templates and native libraries for platforms an x64 build never loads. Those are stripped out, and the ZIP is meant to be extracted over an existing installation. Only TombIDE actually uses the templates. If you'd rather have the snapshots be self-contained, I can do that instead, but I'd recommend against it, as serving 400 MB for nightly builds and PR snapshots seems excessive :)

The first commit fixes a failing test. CanInvertFaces_WhenProcessAnimationsIsTrue_ReturnsFalse has been failing on develop because it leaves ProcessGeometry at its default (true), while CanInvertFaces is based entirely on that property. In production, ProcessAnimations = true is always paired with ProcessGeometry = false. I'm happy to split that fix into a separate PR if you'd rather keep it separate.

Releases are unchanged; installers are still built manually and published to TombEditorReleases. The nightly snapshots are just ZIPs with no installer, published under a single rolling pre-release and clearly marked as "not a release" – they're just a testing channel, not a second set of releases.

Two small caveats: comment_build.yml only runs from the default branch, so PR comments won't appear until this lands on master. Also, CI won't pass on master as it stands, since TombLib.Rendering requires full MSBuild rather than dotnet build.

rr- added 3 commits July 30, 2026 12:09
The test only set ProcessAnimations, leaving ProcessGeometry at its
default of true. CanInvertFaces is defined purely as ProcessGeometry, so
it correctly returned true and the assert failed.
Animation settings always disable geometry processing in practice, as in
AnimationSettingsPresets and the WadTool animation import, so the test
now sets ProcessGeometry explicitly to match.
Nothing built the solution or ran the test suites automatically. Pull
requests and pushes to master now build Release x64 and run both MSTest
suites, and pushes to develop additionally publish a portable snapshot to
a single rolling "nightly" pre-release. Runners have to be Windows, as
all but one project targets net6.0-windows and the test projects touch
WPF.
The build itself lives in a reusable job_build.yml that both workflows
call, so the packaging rules exist in one place.
Snapshots are a developer channel and stay clear of the release process:
stable installers are still built by hand and published to
TombEngine/TombEditorReleases, so snapshots ship without an NSIS
installer to keep the two apart. They are also pruned to an overlay,
dropping TombIDE project templates and native libraries for other
platforms, which takes the download from 370 MB to roughly 30 MB. The
pruning throws if either path is missing, so a layout change cannot
silently restore the full package.
Build artifacts are kept for 15 days and linked from a comment on the
pull request, which is edited in place on later pushes rather than added
to.
This has to be a separate workflow_run workflow, because a pull_request
run from a fork only gets a read-only token and cannot comment. Comments
carry GitHub's own artifact URL alongside a nightly.link mirror: the
former always works but needs an account, the latter needs no account but
is a third party that can go down. Expiry dates are read back from the
API rather than computed.

CopilotAI 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.

Pull request overview

This PR introduces GitHub Actions-based CI for building and testing the Tomb Editor solution on Windows runners, adds a rolling nightly snapshot release from develop, and posts downloadable build artifact links back to pull requests. It also fixes a previously failing TombLib unit test by aligning the test setup with the production settings combination.

Changes:

  • Add reusable Windows build+test workflow (job_build.yml) that restores, builds, runs both test suites, and uploads packaged build + test results artifacts.
  • Add CI workflow for PRs (and master pushes) plus a Nightly workflow for develop that publishes a rolling nightly pre-release ZIP.
  • Add a workflow_run-based commenter workflow that posts/updates artifact download links on the associated PR.

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated 1 comment.

Show a summary per file
FileDescription
TombLib/TombLib.Test/ViewModels/GeometryIOSettingsWindowViewModelTests.csFixes a failing test by setting ProcessGeometry = false when ProcessAnimations = true.
.github/workflows/ci.ymlAdds the main CI entrypoint that calls the shared build/test workflow for PRs and master.
.github/workflows/job_build.ymlImplements the shared Windows build/test/package logic and publishes artifacts.
.github/workflows/nightly.ymlAdds a develop-triggered build and rolling prerelease publisher for nightly snapshots.
.github/workflows/comment_build.ymlAdds a workflow-run triggered PR commenter that posts artifact download links.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread.github/workflows/comment_build.yml Outdated
Comment on lines +89 to +93
const { data: comments } = await github.rest.issues.listComments({
owner, repo, issue_number: pr.number,
});
const existing = comments.filter(c => c.body.includes(marker)).pop();

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Fixed

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@rr-
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Add CI, nightly builds and pull request build links by rr- · Pull Request #1273 · TombEngine/Tomb-Editor · GitHub
Skip to content

Add CI, nightly builds and pull request build links - #1273

Open
rr- wants to merge 4 commits into
TombEngine:developfrom
rr-:develop
Open

Add CI, nightly builds and pull request build links#1273
rr- wants to merge 4 commits into
TombEngine:developfrom
rr-:develop

Conversation

@rr-

@rr-rr- commented Jul 30, 2026

Copy link
Copy Markdown

Right now nothing builds the solution or runs the test suite automatically. This adds GitHub Actions on Windows runners (free for public repos) to build and test everything, then reuses that build so testers have something to download.

  • Pull requests: build, run tests, and post a comment with a downloadable artifact (kept for 15 days)
  • Pushes to develop: same as above, plus update a rolling nightly pre-release

job_build.yml is shared between both workflows, so the build logic only lives in one place.

This is demonstrated on my fork:

End-to-end CI takes about 2m40s.
The snapshot ZIP is about 30 MB. The full build output is around 370 MB, mostly because of TIDE/Templates and native libraries for platforms an x64 build never loads. Those are stripped out, and the ZIP is meant to be extracted over an existing installation. Only TombIDE actually uses the templates. If you'd rather have the snapshots be self-contained, I can do that instead, but I'd recommend against it, as serving 400 MB for nightly builds and PR snapshots seems excessive :)

The first commit fixes a failing test. CanInvertFaces_WhenProcessAnimationsIsTrue_ReturnsFalse has been failing on develop because it leaves ProcessGeometry at its default (true), while CanInvertFaces is based entirely on that property. In production, ProcessAnimations = true is always paired with ProcessGeometry = false. I'm happy to split that fix into a separate PR if you'd rather keep it separate.

Releases are unchanged; installers are still built manually and published to TombEditorReleases. The nightly snapshots are just ZIPs with no installer, published under a single rolling pre-release and clearly marked as "not a release" – they're just a testing channel, not a second set of releases.

Two small caveats: comment_build.yml only runs from the default branch, so PR comments won't appear until this lands on master. Also, CI won't pass on master as it stands, since TombLib.Rendering requires full MSBuild rather than dotnet build.

rr- added 3 commits July 30, 2026 12:09
The test only set ProcessAnimations, leaving ProcessGeometry at its
default of true. CanInvertFaces is defined purely as ProcessGeometry, so
it correctly returned true and the assert failed.
Animation settings always disable geometry processing in practice, as in
AnimationSettingsPresets and the WadTool animation import, so the test
now sets ProcessGeometry explicitly to match.
Nothing built the solution or ran the test suites automatically. Pull
requests and pushes to master now build Release x64 and run both MSTest
suites, and pushes to develop additionally publish a portable snapshot to
a single rolling "nightly" pre-release. Runners have to be Windows, as
all but one project targets net6.0-windows and the test projects touch
WPF.
The build itself lives in a reusable job_build.yml that both workflows
call, so the packaging rules exist in one place.
Snapshots are a developer channel and stay clear of the release process:
stable installers are still built by hand and published to
TombEngine/TombEditorReleases, so snapshots ship without an NSIS
installer to keep the two apart. They are also pruned to an overlay,
dropping TombIDE project templates and native libraries for other
platforms, which takes the download from 370 MB to roughly 30 MB. The
pruning throws if either path is missing, so a layout change cannot
silently restore the full package.
Build artifacts are kept for 15 days and linked from a comment on the
pull request, which is edited in place on later pushes rather than added
to.
This has to be a separate workflow_run workflow, because a pull_request
run from a fork only gets a read-only token and cannot comment. Comments
carry GitHub's own artifact URL alongside a nightly.link mirror: the
former always works but needs an account, the latter needs no account but
is a third party that can go down. Expiry dates are read back from the
API rather than computed.

CopilotAI 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.

Pull request overview

This PR introduces GitHub Actions-based CI for building and testing the Tomb Editor solution on Windows runners, adds a rolling nightly snapshot release from develop, and posts downloadable build artifact links back to pull requests. It also fixes a previously failing TombLib unit test by aligning the test setup with the production settings combination.

Changes:

  • Add reusable Windows build+test workflow (job_build.yml) that restores, builds, runs both test suites, and uploads packaged build + test results artifacts.
  • Add CI workflow for PRs (and master pushes) plus a Nightly workflow for develop that publishes a rolling nightly pre-release ZIP.
  • Add a workflow_run-based commenter workflow that posts/updates artifact download links on the associated PR.

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated 1 comment.

Show a summary per file
FileDescription
TombLib/TombLib.Test/ViewModels/GeometryIOSettingsWindowViewModelTests.csFixes a failing test by setting ProcessGeometry = false when ProcessAnimations = true.
.github/workflows/ci.ymlAdds the main CI entrypoint that calls the shared build/test workflow for PRs and master.
.github/workflows/job_build.ymlImplements the shared Windows build/test/package logic and publishes artifacts.
.github/workflows/nightly.ymlAdds a develop-triggered build and rolling prerelease publisher for nightly snapshots.
.github/workflows/comment_build.ymlAdds a workflow-run triggered PR commenter that posts artifact download links.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread.github/workflows/comment_build.yml Outdated
Comment on lines +89 to +93
const { data: comments } = await github.rest.issues.listComments({
owner, repo, issue_number: pr.number,
});
const existing = comments.filter(c => c.body.includes(marker)).pop();

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Fixed

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@rr-
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Add CI, nightly builds and pull request build links by rr- · Pull Request #1273 · TombEngine/Tomb-Editor · GitHub
Skip to content

Add CI, nightly builds and pull request build links - #1273

Open
rr- wants to merge 4 commits into
TombEngine:developfrom
rr-:develop
Open

Add CI, nightly builds and pull request build links#1273
rr- wants to merge 4 commits into
TombEngine:developfrom
rr-:develop

Conversation

@rr-

@rr-rr- commented Jul 30, 2026

Copy link
Copy Markdown

Right now nothing builds the solution or runs the test suite automatically. This adds GitHub Actions on Windows runners (free for public repos) to build and test everything, then reuses that build so testers have something to download.

  • Pull requests: build, run tests, and post a comment with a downloadable artifact (kept for 15 days)
  • Pushes to develop: same as above, plus update a rolling nightly pre-release

job_build.yml is shared between both workflows, so the build logic only lives in one place.

This is demonstrated on my fork:

End-to-end CI takes about 2m40s.
The snapshot ZIP is about 30 MB. The full build output is around 370 MB, mostly because of TIDE/Templates and native libraries for platforms an x64 build never loads. Those are stripped out, and the ZIP is meant to be extracted over an existing installation. Only TombIDE actually uses the templates. If you'd rather have the snapshots be self-contained, I can do that instead, but I'd recommend against it, as serving 400 MB for nightly builds and PR snapshots seems excessive :)

The first commit fixes a failing test. CanInvertFaces_WhenProcessAnimationsIsTrue_ReturnsFalse has been failing on develop because it leaves ProcessGeometry at its default (true), while CanInvertFaces is based entirely on that property. In production, ProcessAnimations = true is always paired with ProcessGeometry = false. I'm happy to split that fix into a separate PR if you'd rather keep it separate.

Releases are unchanged; installers are still built manually and published to TombEditorReleases. The nightly snapshots are just ZIPs with no installer, published under a single rolling pre-release and clearly marked as "not a release" – they're just a testing channel, not a second set of releases.

Two small caveats: comment_build.yml only runs from the default branch, so PR comments won't appear until this lands on master. Also, CI won't pass on master as it stands, since TombLib.Rendering requires full MSBuild rather than dotnet build.

rr- added 3 commits July 30, 2026 12:09
The test only set ProcessAnimations, leaving ProcessGeometry at its
default of true. CanInvertFaces is defined purely as ProcessGeometry, so
it correctly returned true and the assert failed.
Animation settings always disable geometry processing in practice, as in
AnimationSettingsPresets and the WadTool animation import, so the test
now sets ProcessGeometry explicitly to match.
Nothing built the solution or ran the test suites automatically. Pull
requests and pushes to master now build Release x64 and run both MSTest
suites, and pushes to develop additionally publish a portable snapshot to
a single rolling "nightly" pre-release. Runners have to be Windows, as
all but one project targets net6.0-windows and the test projects touch
WPF.
The build itself lives in a reusable job_build.yml that both workflows
call, so the packaging rules exist in one place.
Snapshots are a developer channel and stay clear of the release process:
stable installers are still built by hand and published to
TombEngine/TombEditorReleases, so snapshots ship without an NSIS
installer to keep the two apart. They are also pruned to an overlay,
dropping TombIDE project templates and native libraries for other
platforms, which takes the download from 370 MB to roughly 30 MB. The
pruning throws if either path is missing, so a layout change cannot
silently restore the full package.
Build artifacts are kept for 15 days and linked from a comment on the
pull request, which is edited in place on later pushes rather than added
to.
This has to be a separate workflow_run workflow, because a pull_request
run from a fork only gets a read-only token and cannot comment. Comments
carry GitHub's own artifact URL alongside a nightly.link mirror: the
former always works but needs an account, the latter needs no account but
is a third party that can go down. Expiry dates are read back from the
API rather than computed.

CopilotAI 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.

Pull request overview

This PR introduces GitHub Actions-based CI for building and testing the Tomb Editor solution on Windows runners, adds a rolling nightly snapshot release from develop, and posts downloadable build artifact links back to pull requests. It also fixes a previously failing TombLib unit test by aligning the test setup with the production settings combination.

Changes:

  • Add reusable Windows build+test workflow (job_build.yml) that restores, builds, runs both test suites, and uploads packaged build + test results artifacts.
  • Add CI workflow for PRs (and master pushes) plus a Nightly workflow for develop that publishes a rolling nightly pre-release ZIP.
  • Add a workflow_run-based commenter workflow that posts/updates artifact download links on the associated PR.

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated 1 comment.

Show a summary per file
FileDescription
TombLib/TombLib.Test/ViewModels/GeometryIOSettingsWindowViewModelTests.csFixes a failing test by setting ProcessGeometry = false when ProcessAnimations = true.
.github/workflows/ci.ymlAdds the main CI entrypoint that calls the shared build/test workflow for PRs and master.
.github/workflows/job_build.ymlImplements the shared Windows build/test/package logic and publishes artifacts.
.github/workflows/nightly.ymlAdds a develop-triggered build and rolling prerelease publisher for nightly snapshots.
.github/workflows/comment_build.ymlAdds a workflow-run triggered PR commenter that posts artifact download links.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread.github/workflows/comment_build.yml Outdated
Comment on lines +89 to +93
const { data: comments } = await github.rest.issues.listComments({
owner, repo, issue_number: pr.number,
});
const existing = comments.filter(c => c.body.includes(marker)).pop();

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Fixed

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@rr-
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Add CI, nightly builds and pull request build links by rr- · Pull Request #1273 · TombEngine/Tomb-Editor · GitHub
Skip to content

Add CI, nightly builds and pull request build links - #1273

Open
rr- wants to merge 4 commits into
TombEngine:developfrom
rr-:develop
Open

Add CI, nightly builds and pull request build links#1273
rr- wants to merge 4 commits into
TombEngine:developfrom
rr-:develop

Conversation

@rr-

@rr-rr- commented Jul 30, 2026

Copy link
Copy Markdown

Right now nothing builds the solution or runs the test suite automatically. This adds GitHub Actions on Windows runners (free for public repos) to build and test everything, then reuses that build so testers have something to download.

  • Pull requests: build, run tests, and post a comment with a downloadable artifact (kept for 15 days)
  • Pushes to develop: same as above, plus update a rolling nightly pre-release

job_build.yml is shared between both workflows, so the build logic only lives in one place.

This is demonstrated on my fork:

End-to-end CI takes about 2m40s.
The snapshot ZIP is about 30 MB. The full build output is around 370 MB, mostly because of TIDE/Templates and native libraries for platforms an x64 build never loads. Those are stripped out, and the ZIP is meant to be extracted over an existing installation. Only TombIDE actually uses the templates. If you'd rather have the snapshots be self-contained, I can do that instead, but I'd recommend against it, as serving 400 MB for nightly builds and PR snapshots seems excessive :)

The first commit fixes a failing test. CanInvertFaces_WhenProcessAnimationsIsTrue_ReturnsFalse has been failing on develop because it leaves ProcessGeometry at its default (true), while CanInvertFaces is based entirely on that property. In production, ProcessAnimations = true is always paired with ProcessGeometry = false. I'm happy to split that fix into a separate PR if you'd rather keep it separate.

Releases are unchanged; installers are still built manually and published to TombEditorReleases. The nightly snapshots are just ZIPs with no installer, published under a single rolling pre-release and clearly marked as "not a release" – they're just a testing channel, not a second set of releases.

Two small caveats: comment_build.yml only runs from the default branch, so PR comments won't appear until this lands on master. Also, CI won't pass on master as it stands, since TombLib.Rendering requires full MSBuild rather than dotnet build.

rr- added 3 commits July 30, 2026 12:09
The test only set ProcessAnimations, leaving ProcessGeometry at its
default of true. CanInvertFaces is defined purely as ProcessGeometry, so
it correctly returned true and the assert failed.
Animation settings always disable geometry processing in practice, as in
AnimationSettingsPresets and the WadTool animation import, so the test
now sets ProcessGeometry explicitly to match.
Nothing built the solution or ran the test suites automatically. Pull
requests and pushes to master now build Release x64 and run both MSTest
suites, and pushes to develop additionally publish a portable snapshot to
a single rolling "nightly" pre-release. Runners have to be Windows, as
all but one project targets net6.0-windows and the test projects touch
WPF.
The build itself lives in a reusable job_build.yml that both workflows
call, so the packaging rules exist in one place.
Snapshots are a developer channel and stay clear of the release process:
stable installers are still built by hand and published to
TombEngine/TombEditorReleases, so snapshots ship without an NSIS
installer to keep the two apart. They are also pruned to an overlay,
dropping TombIDE project templates and native libraries for other
platforms, which takes the download from 370 MB to roughly 30 MB. The
pruning throws if either path is missing, so a layout change cannot
silently restore the full package.
Build artifacts are kept for 15 days and linked from a comment on the
pull request, which is edited in place on later pushes rather than added
to.
This has to be a separate workflow_run workflow, because a pull_request
run from a fork only gets a read-only token and cannot comment. Comments
carry GitHub's own artifact URL alongside a nightly.link mirror: the
former always works but needs an account, the latter needs no account but
is a third party that can go down. Expiry dates are read back from the
API rather than computed.

CopilotAI 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.

Pull request overview

This PR introduces GitHub Actions-based CI for building and testing the Tomb Editor solution on Windows runners, adds a rolling nightly snapshot release from develop, and posts downloadable build artifact links back to pull requests. It also fixes a previously failing TombLib unit test by aligning the test setup with the production settings combination.

Changes:

  • Add reusable Windows build+test workflow (job_build.yml) that restores, builds, runs both test suites, and uploads packaged build + test results artifacts.
  • Add CI workflow for PRs (and master pushes) plus a Nightly workflow for develop that publishes a rolling nightly pre-release ZIP.
  • Add a workflow_run-based commenter workflow that posts/updates artifact download links on the associated PR.

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated 1 comment.

Show a summary per file
FileDescription
TombLib/TombLib.Test/ViewModels/GeometryIOSettingsWindowViewModelTests.csFixes a failing test by setting ProcessGeometry = false when ProcessAnimations = true.
.github/workflows/ci.ymlAdds the main CI entrypoint that calls the shared build/test workflow for PRs and master.
.github/workflows/job_build.ymlImplements the shared Windows build/test/package logic and publishes artifacts.
.github/workflows/nightly.ymlAdds a develop-triggered build and rolling prerelease publisher for nightly snapshots.
.github/workflows/comment_build.ymlAdds a workflow-run triggered PR commenter that posts artifact download links.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread.github/workflows/comment_build.yml Outdated
Comment on lines +89 to +93
const { data: comments } = await github.rest.issues.listComments({
owner, repo, issue_number: pr.number,
});
const existing = comments.filter(c => c.body.includes(marker)).pop();

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Fixed

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@rr-
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Add CI, nightly builds and pull request build links by rr- · Pull Request #1273 · TombEngine/Tomb-Editor · GitHub
Skip to content

Add CI, nightly builds and pull request build links - #1273

Open
rr- wants to merge 4 commits into
TombEngine:developfrom
rr-:develop
Open

Add CI, nightly builds and pull request build links#1273
rr- wants to merge 4 commits into
TombEngine:developfrom
rr-:develop

Conversation

@rr-

@rr-rr- commented Jul 30, 2026

Copy link
Copy Markdown

Right now nothing builds the solution or runs the test suite automatically. This adds GitHub Actions on Windows runners (free for public repos) to build and test everything, then reuses that build so testers have something to download.

  • Pull requests: build, run tests, and post a comment with a downloadable artifact (kept for 15 days)
  • Pushes to develop: same as above, plus update a rolling nightly pre-release

job_build.yml is shared between both workflows, so the build logic only lives in one place.

This is demonstrated on my fork:

End-to-end CI takes about 2m40s.
The snapshot ZIP is about 30 MB. The full build output is around 370 MB, mostly because of TIDE/Templates and native libraries for platforms an x64 build never loads. Those are stripped out, and the ZIP is meant to be extracted over an existing installation. Only TombIDE actually uses the templates. If you'd rather have the snapshots be self-contained, I can do that instead, but I'd recommend against it, as serving 400 MB for nightly builds and PR snapshots seems excessive :)

The first commit fixes a failing test. CanInvertFaces_WhenProcessAnimationsIsTrue_ReturnsFalse has been failing on develop because it leaves ProcessGeometry at its default (true), while CanInvertFaces is based entirely on that property. In production, ProcessAnimations = true is always paired with ProcessGeometry = false. I'm happy to split that fix into a separate PR if you'd rather keep it separate.

Releases are unchanged; installers are still built manually and published to TombEditorReleases. The nightly snapshots are just ZIPs with no installer, published under a single rolling pre-release and clearly marked as "not a release" – they're just a testing channel, not a second set of releases.

Two small caveats: comment_build.yml only runs from the default branch, so PR comments won't appear until this lands on master. Also, CI won't pass on master as it stands, since TombLib.Rendering requires full MSBuild rather than dotnet build.

rr- added 3 commits July 30, 2026 12:09
The test only set ProcessAnimations, leaving ProcessGeometry at its
default of true. CanInvertFaces is defined purely as ProcessGeometry, so
it correctly returned true and the assert failed.
Animation settings always disable geometry processing in practice, as in
AnimationSettingsPresets and the WadTool animation import, so the test
now sets ProcessGeometry explicitly to match.
Nothing built the solution or ran the test suites automatically. Pull
requests and pushes to master now build Release x64 and run both MSTest
suites, and pushes to develop additionally publish a portable snapshot to
a single rolling "nightly" pre-release. Runners have to be Windows, as
all but one project targets net6.0-windows and the test projects touch
WPF.
The build itself lives in a reusable job_build.yml that both workflows
call, so the packaging rules exist in one place.
Snapshots are a developer channel and stay clear of the release process:
stable installers are still built by hand and published to
TombEngine/TombEditorReleases, so snapshots ship without an NSIS
installer to keep the two apart. They are also pruned to an overlay,
dropping TombIDE project templates and native libraries for other
platforms, which takes the download from 370 MB to roughly 30 MB. The
pruning throws if either path is missing, so a layout change cannot
silently restore the full package.
Build artifacts are kept for 15 days and linked from a comment on the
pull request, which is edited in place on later pushes rather than added
to.
This has to be a separate workflow_run workflow, because a pull_request
run from a fork only gets a read-only token and cannot comment. Comments
carry GitHub's own artifact URL alongside a nightly.link mirror: the
former always works but needs an account, the latter needs no account but
is a third party that can go down. Expiry dates are read back from the
API rather than computed.

CopilotAI 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.

Pull request overview

This PR introduces GitHub Actions-based CI for building and testing the Tomb Editor solution on Windows runners, adds a rolling nightly snapshot release from develop, and posts downloadable build artifact links back to pull requests. It also fixes a previously failing TombLib unit test by aligning the test setup with the production settings combination.

Changes:

  • Add reusable Windows build+test workflow (job_build.yml) that restores, builds, runs both test suites, and uploads packaged build + test results artifacts.
  • Add CI workflow for PRs (and master pushes) plus a Nightly workflow for develop that publishes a rolling nightly pre-release ZIP.
  • Add a workflow_run-based commenter workflow that posts/updates artifact download links on the associated PR.

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated 1 comment.

Show a summary per file
FileDescription
TombLib/TombLib.Test/ViewModels/GeometryIOSettingsWindowViewModelTests.csFixes a failing test by setting ProcessGeometry = false when ProcessAnimations = true.
.github/workflows/ci.ymlAdds the main CI entrypoint that calls the shared build/test workflow for PRs and master.
.github/workflows/job_build.ymlImplements the shared Windows build/test/package logic and publishes artifacts.
.github/workflows/nightly.ymlAdds a develop-triggered build and rolling prerelease publisher for nightly snapshots.
.github/workflows/comment_build.ymlAdds a workflow-run triggered PR commenter that posts artifact download links.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread.github/workflows/comment_build.yml Outdated
Comment on lines +89 to +93
const { data: comments } = await github.rest.issues.listComments({
owner, repo, issue_number: pr.number,
});
const existing = comments.filter(c => c.body.includes(marker)).pop();

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Fixed

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@rr-
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Add CI, nightly builds and pull request build links by rr- · Pull Request #1273 · TombEngine/Tomb-Editor · GitHub
Skip to content

Add CI, nightly builds and pull request build links - #1273

Open
rr- wants to merge 4 commits into
TombEngine:developfrom
rr-:develop
Open

Add CI, nightly builds and pull request build links#1273
rr- wants to merge 4 commits into
TombEngine:developfrom
rr-:develop

Conversation

@rr-

@rr-rr- commented Jul 30, 2026

Copy link
Copy Markdown

Right now nothing builds the solution or runs the test suite automatically. This adds GitHub Actions on Windows runners (free for public repos) to build and test everything, then reuses that build so testers have something to download.

  • Pull requests: build, run tests, and post a comment with a downloadable artifact (kept for 15 days)
  • Pushes to develop: same as above, plus update a rolling nightly pre-release

job_build.yml is shared between both workflows, so the build logic only lives in one place.

This is demonstrated on my fork:

End-to-end CI takes about 2m40s.
The snapshot ZIP is about 30 MB. The full build output is around 370 MB, mostly because of TIDE/Templates and native libraries for platforms an x64 build never loads. Those are stripped out, and the ZIP is meant to be extracted over an existing installation. Only TombIDE actually uses the templates. If you'd rather have the snapshots be self-contained, I can do that instead, but I'd recommend against it, as serving 400 MB for nightly builds and PR snapshots seems excessive :)

The first commit fixes a failing test. CanInvertFaces_WhenProcessAnimationsIsTrue_ReturnsFalse has been failing on develop because it leaves ProcessGeometry at its default (true), while CanInvertFaces is based entirely on that property. In production, ProcessAnimations = true is always paired with ProcessGeometry = false. I'm happy to split that fix into a separate PR if you'd rather keep it separate.

Releases are unchanged; installers are still built manually and published to TombEditorReleases. The nightly snapshots are just ZIPs with no installer, published under a single rolling pre-release and clearly marked as "not a release" – they're just a testing channel, not a second set of releases.

Two small caveats: comment_build.yml only runs from the default branch, so PR comments won't appear until this lands on master. Also, CI won't pass on master as it stands, since TombLib.Rendering requires full MSBuild rather than dotnet build.

rr- added 3 commits July 30, 2026 12:09
The test only set ProcessAnimations, leaving ProcessGeometry at its
default of true. CanInvertFaces is defined purely as ProcessGeometry, so
it correctly returned true and the assert failed.
Animation settings always disable geometry processing in practice, as in
AnimationSettingsPresets and the WadTool animation import, so the test
now sets ProcessGeometry explicitly to match.
Nothing built the solution or ran the test suites automatically. Pull
requests and pushes to master now build Release x64 and run both MSTest
suites, and pushes to develop additionally publish a portable snapshot to
a single rolling "nightly" pre-release. Runners have to be Windows, as
all but one project targets net6.0-windows and the test projects touch
WPF.
The build itself lives in a reusable job_build.yml that both workflows
call, so the packaging rules exist in one place.
Snapshots are a developer channel and stay clear of the release process:
stable installers are still built by hand and published to
TombEngine/TombEditorReleases, so snapshots ship without an NSIS
installer to keep the two apart. They are also pruned to an overlay,
dropping TombIDE project templates and native libraries for other
platforms, which takes the download from 370 MB to roughly 30 MB. The
pruning throws if either path is missing, so a layout change cannot
silently restore the full package.
Build artifacts are kept for 15 days and linked from a comment on the
pull request, which is edited in place on later pushes rather than added
to.
This has to be a separate workflow_run workflow, because a pull_request
run from a fork only gets a read-only token and cannot comment. Comments
carry GitHub's own artifact URL alongside a nightly.link mirror: the
former always works but needs an account, the latter needs no account but
is a third party that can go down. Expiry dates are read back from the
API rather than computed.

CopilotAI 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.

Pull request overview

This PR introduces GitHub Actions-based CI for building and testing the Tomb Editor solution on Windows runners, adds a rolling nightly snapshot release from develop, and posts downloadable build artifact links back to pull requests. It also fixes a previously failing TombLib unit test by aligning the test setup with the production settings combination.

Changes:

  • Add reusable Windows build+test workflow (job_build.yml) that restores, builds, runs both test suites, and uploads packaged build + test results artifacts.
  • Add CI workflow for PRs (and master pushes) plus a Nightly workflow for develop that publishes a rolling nightly pre-release ZIP.
  • Add a workflow_run-based commenter workflow that posts/updates artifact download links on the associated PR.

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated 1 comment.

Show a summary per file
FileDescription
TombLib/TombLib.Test/ViewModels/GeometryIOSettingsWindowViewModelTests.csFixes a failing test by setting ProcessGeometry = false when ProcessAnimations = true.
.github/workflows/ci.ymlAdds the main CI entrypoint that calls the shared build/test workflow for PRs and master.
.github/workflows/job_build.ymlImplements the shared Windows build/test/package logic and publishes artifacts.
.github/workflows/nightly.ymlAdds a develop-triggered build and rolling prerelease publisher for nightly snapshots.
.github/workflows/comment_build.ymlAdds a workflow-run triggered PR commenter that posts artifact download links.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread.github/workflows/comment_build.yml Outdated
Comment on lines +89 to +93
const { data: comments } = await github.rest.issues.listComments({
owner, repo, issue_number: pr.number,
});
const existing = comments.filter(c => c.body.includes(marker)).pop();

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Fixed

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@rr-
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Add CI, nightly builds and pull request build links by rr- · Pull Request #1273 · TombEngine/Tomb-Editor · GitHub
Skip to content

Add CI, nightly builds and pull request build links - #1273

Open
rr- wants to merge 4 commits into
TombEngine:developfrom
rr-:develop
Open

Add CI, nightly builds and pull request build links#1273
rr- wants to merge 4 commits into
TombEngine:developfrom
rr-:develop

Conversation

@rr-

@rr-rr- commented Jul 30, 2026

Copy link
Copy Markdown

Right now nothing builds the solution or runs the test suite automatically. This adds GitHub Actions on Windows runners (free for public repos) to build and test everything, then reuses that build so testers have something to download.

  • Pull requests: build, run tests, and post a comment with a downloadable artifact (kept for 15 days)
  • Pushes to develop: same as above, plus update a rolling nightly pre-release

job_build.yml is shared between both workflows, so the build logic only lives in one place.

This is demonstrated on my fork:

End-to-end CI takes about 2m40s.
The snapshot ZIP is about 30 MB. The full build output is around 370 MB, mostly because of TIDE/Templates and native libraries for platforms an x64 build never loads. Those are stripped out, and the ZIP is meant to be extracted over an existing installation. Only TombIDE actually uses the templates. If you'd rather have the snapshots be self-contained, I can do that instead, but I'd recommend against it, as serving 400 MB for nightly builds and PR snapshots seems excessive :)

The first commit fixes a failing test. CanInvertFaces_WhenProcessAnimationsIsTrue_ReturnsFalse has been failing on develop because it leaves ProcessGeometry at its default (true), while CanInvertFaces is based entirely on that property. In production, ProcessAnimations = true is always paired with ProcessGeometry = false. I'm happy to split that fix into a separate PR if you'd rather keep it separate.

Releases are unchanged; installers are still built manually and published to TombEditorReleases. The nightly snapshots are just ZIPs with no installer, published under a single rolling pre-release and clearly marked as "not a release" – they're just a testing channel, not a second set of releases.

Two small caveats: comment_build.yml only runs from the default branch, so PR comments won't appear until this lands on master. Also, CI won't pass on master as it stands, since TombLib.Rendering requires full MSBuild rather than dotnet build.

rr- added 3 commits July 30, 2026 12:09
The test only set ProcessAnimations, leaving ProcessGeometry at its
default of true. CanInvertFaces is defined purely as ProcessGeometry, so
it correctly returned true and the assert failed.
Animation settings always disable geometry processing in practice, as in
AnimationSettingsPresets and the WadTool animation import, so the test
now sets ProcessGeometry explicitly to match.
Nothing built the solution or ran the test suites automatically. Pull
requests and pushes to master now build Release x64 and run both MSTest
suites, and pushes to develop additionally publish a portable snapshot to
a single rolling "nightly" pre-release. Runners have to be Windows, as
all but one project targets net6.0-windows and the test projects touch
WPF.
The build itself lives in a reusable job_build.yml that both workflows
call, so the packaging rules exist in one place.
Snapshots are a developer channel and stay clear of the release process:
stable installers are still built by hand and published to
TombEngine/TombEditorReleases, so snapshots ship without an NSIS
installer to keep the two apart. They are also pruned to an overlay,
dropping TombIDE project templates and native libraries for other
platforms, which takes the download from 370 MB to roughly 30 MB. The
pruning throws if either path is missing, so a layout change cannot
silently restore the full package.
Build artifacts are kept for 15 days and linked from a comment on the
pull request, which is edited in place on later pushes rather than added
to.
This has to be a separate workflow_run workflow, because a pull_request
run from a fork only gets a read-only token and cannot comment. Comments
carry GitHub's own artifact URL alongside a nightly.link mirror: the
former always works but needs an account, the latter needs no account but
is a third party that can go down. Expiry dates are read back from the
API rather than computed.

CopilotAI 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.

Pull request overview

This PR introduces GitHub Actions-based CI for building and testing the Tomb Editor solution on Windows runners, adds a rolling nightly snapshot release from develop, and posts downloadable build artifact links back to pull requests. It also fixes a previously failing TombLib unit test by aligning the test setup with the production settings combination.

Changes:

  • Add reusable Windows build+test workflow (job_build.yml) that restores, builds, runs both test suites, and uploads packaged build + test results artifacts.
  • Add CI workflow for PRs (and master pushes) plus a Nightly workflow for develop that publishes a rolling nightly pre-release ZIP.
  • Add a workflow_run-based commenter workflow that posts/updates artifact download links on the associated PR.

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated 1 comment.

Show a summary per file
FileDescription
TombLib/TombLib.Test/ViewModels/GeometryIOSettingsWindowViewModelTests.csFixes a failing test by setting ProcessGeometry = false when ProcessAnimations = true.
.github/workflows/ci.ymlAdds the main CI entrypoint that calls the shared build/test workflow for PRs and master.
.github/workflows/job_build.ymlImplements the shared Windows build/test/package logic and publishes artifacts.
.github/workflows/nightly.ymlAdds a develop-triggered build and rolling prerelease publisher for nightly snapshots.
.github/workflows/comment_build.ymlAdds a workflow-run triggered PR commenter that posts artifact download links.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread.github/workflows/comment_build.yml Outdated
Comment on lines +89 to +93
const { data: comments } = await github.rest.issues.listComments({
owner, repo, issue_number: pr.number,
});
const existing = comments.filter(c => c.body.includes(marker)).pop();

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Fixed

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@rr-
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); Add CI, nightly builds and pull request build links by rr- · Pull Request #1273 · TombEngine/Tomb-Editor · GitHub
Skip to content

Add CI, nightly builds and pull request build links - #1273

Open
rr- wants to merge 4 commits into
TombEngine:developfrom
rr-:develop
Open

Add CI, nightly builds and pull request build links#1273
rr- wants to merge 4 commits into
TombEngine:developfrom
rr-:develop

Conversation

@rr-

@rr-rr- commented Jul 30, 2026

Copy link
Copy Markdown

Right now nothing builds the solution or runs the test suite automatically. This adds GitHub Actions on Windows runners (free for public repos) to build and test everything, then reuses that build so testers have something to download.

  • Pull requests: build, run tests, and post a comment with a downloadable artifact (kept for 15 days)
  • Pushes to develop: same as above, plus update a rolling nightly pre-release

job_build.yml is shared between both workflows, so the build logic only lives in one place.

This is demonstrated on my fork:

End-to-end CI takes about 2m40s.
The snapshot ZIP is about 30 MB. The full build output is around 370 MB, mostly because of TIDE/Templates and native libraries for platforms an x64 build never loads. Those are stripped out, and the ZIP is meant to be extracted over an existing installation. Only TombIDE actually uses the templates. If you'd rather have the snapshots be self-contained, I can do that instead, but I'd recommend against it, as serving 400 MB for nightly builds and PR snapshots seems excessive :)

The first commit fixes a failing test. CanInvertFaces_WhenProcessAnimationsIsTrue_ReturnsFalse has been failing on develop because it leaves ProcessGeometry at its default (true), while CanInvertFaces is based entirely on that property. In production, ProcessAnimations = true is always paired with ProcessGeometry = false. I'm happy to split that fix into a separate PR if you'd rather keep it separate.

Releases are unchanged; installers are still built manually and published to TombEditorReleases. The nightly snapshots are just ZIPs with no installer, published under a single rolling pre-release and clearly marked as "not a release" – they're just a testing channel, not a second set of releases.

Two small caveats: comment_build.yml only runs from the default branch, so PR comments won't appear until this lands on master. Also, CI won't pass on master as it stands, since TombLib.Rendering requires full MSBuild rather than dotnet build.

rr- added 3 commits July 30, 2026 12:09
The test only set ProcessAnimations, leaving ProcessGeometry at its
default of true. CanInvertFaces is defined purely as ProcessGeometry, so
it correctly returned true and the assert failed.
Animation settings always disable geometry processing in practice, as in
AnimationSettingsPresets and the WadTool animation import, so the test
now sets ProcessGeometry explicitly to match.
Nothing built the solution or ran the test suites automatically. Pull
requests and pushes to master now build Release x64 and run both MSTest
suites, and pushes to develop additionally publish a portable snapshot to
a single rolling "nightly" pre-release. Runners have to be Windows, as
all but one project targets net6.0-windows and the test projects touch
WPF.
The build itself lives in a reusable job_build.yml that both workflows
call, so the packaging rules exist in one place.
Snapshots are a developer channel and stay clear of the release process:
stable installers are still built by hand and published to
TombEngine/TombEditorReleases, so snapshots ship without an NSIS
installer to keep the two apart. They are also pruned to an overlay,
dropping TombIDE project templates and native libraries for other
platforms, which takes the download from 370 MB to roughly 30 MB. The
pruning throws if either path is missing, so a layout change cannot
silently restore the full package.
Build artifacts are kept for 15 days and linked from a comment on the
pull request, which is edited in place on later pushes rather than added
to.
This has to be a separate workflow_run workflow, because a pull_request
run from a fork only gets a read-only token and cannot comment. Comments
carry GitHub's own artifact URL alongside a nightly.link mirror: the
former always works but needs an account, the latter needs no account but
is a third party that can go down. Expiry dates are read back from the
API rather than computed.

CopilotAI 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.

Pull request overview

This PR introduces GitHub Actions-based CI for building and testing the Tomb Editor solution on Windows runners, adds a rolling nightly snapshot release from develop, and posts downloadable build artifact links back to pull requests. It also fixes a previously failing TombLib unit test by aligning the test setup with the production settings combination.

Changes:

  • Add reusable Windows build+test workflow (job_build.yml) that restores, builds, runs both test suites, and uploads packaged build + test results artifacts.
  • Add CI workflow for PRs (and master pushes) plus a Nightly workflow for develop that publishes a rolling nightly pre-release ZIP.
  • Add a workflow_run-based commenter workflow that posts/updates artifact download links on the associated PR.

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated 1 comment.

Show a summary per file
FileDescription
TombLib/TombLib.Test/ViewModels/GeometryIOSettingsWindowViewModelTests.csFixes a failing test by setting ProcessGeometry = false when ProcessAnimations = true.
.github/workflows/ci.ymlAdds the main CI entrypoint that calls the shared build/test workflow for PRs and master.
.github/workflows/job_build.ymlImplements the shared Windows build/test/package logic and publishes artifacts.
.github/workflows/nightly.ymlAdds a develop-triggered build and rolling prerelease publisher for nightly snapshots.
.github/workflows/comment_build.ymlAdds a workflow-run triggered PR commenter that posts artifact download links.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread.github/workflows/comment_build.yml Outdated
Comment on lines +89 to +93
const { data: comments } = await github.rest.issues.listComments({
owner, repo, issue_number: pr.number,
});
const existing = comments.filter(c => c.body.includes(marker)).pop();

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

Fixed

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@rr-