Repository navigation
Release workflow: find steam_api64.dll under both Cargo layouts, keep depot artifacts 90 days, guard existing tags - #574
Merged
Conversation
The Windows depot step finds the Valve DLL that steamworks-sys copies into its build-script OUT_DIR, and only matched build\steamworks-sys-<hash>\out. The release builds with the `stable` toolchain resolved at run time, and from Rust 1.100 (stable on 2026-11-12) Cargo's new build-dir layout puts OUT_DIR at build\steamworks-sys\<hash>\out: a probe crate built with 1.100.0-beta.13 lands there, while 1.99.1 still uses the old path. The filter would then match nothing and the step would exit 1, failing the Windows leg, and with it the release, Steam and Defender jobs, for any full or demo build started after the toolchain release. The filter now accepts both layouts; the Valve signature checks that follow are unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013J2EUgaGKdJEx9AhbrXLmS
…elsewhere The Steam depot is assembled from the Release run's desktop-* and demo-desktop-* artifacts, and STEAM_NEXT_FEST_DEMO.md sets a demo build live on beta or default with a later Steam Deploy dispatch against that run_id, weeks after the build in the demo timeline. At a 7-day retention that dispatch found nothing to download, and only a rebuild with a new BuildID recovered. The upload now keeps them 90 days, as the scan records already are, and the demo guide says what to do past that. A full-edition Run workflow creates the release tag on its own commit when the tag does not exist. When it already exists GitHub leaves it in place, so a dispatch from a newer main would stage a Steam build the tag does not point to, and a demo dispatched from the tag would come from different source. Validate now fails such a run before any build, the same comparison the demo guard makes, and passes when the tag is missing or is the run's commit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013J2EUgaGKdJEx9AhbrXLmS
charneykaye
marked this pull request as ready for review
November 10, 2026 04:31
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Three fixes from the pre-release audit of the v0.4.0 pipeline (#495). Each finding was checked by a separate agent trying to refute it, and none was refuted. None is a regression since v0.2.9. All three must be in the workflow before the v0.4.0 and demo runs, because each takes effect at run time.
1. Find
steam_api64.dllunder both Cargo build-dir layoutsWhat the step does. The Windows step "Package Windows portable depot layout for Steam depot" ships the Valve-signed
steam_api64.dllthatsteamworks-syscopies into its build-scriptOUT_DIR. It only matchedbuild\steamworks-sys-<hash>\out.Why it would break. The release installs
dtolnay/rust-toolchain@stable, resolved at run time, with no toolchain pin. Rust 1.100 becomes stable on Thu 2026-11-12, and Cargo's new build-dir layout then putsOUT_DIRatbuild\steamworks-sys\<hash>\out. The verifier reproduced this with a probe crate:build/steamworks-sys-9e36ed8f527f94b5/out/steam_api64.dll;build/steamworks-sys/376c70e31367f0ee/out/steam_api64.dll.On the new layout the filter matches nothing, and the step exits 1. That fails the Windows leg, which skips the release, Steam and Defender jobs, for any full or demo build started after the toolchain release. It is the only build-dir-dependent path in the Windows steps.
The fix. The filter accepts both layouts. It keeps the same one-line form v0.2.9 ran, and the Valve signature checks after it are unchanged:
Pinning the toolchain was considered and left out. With the filter fixed nothing depends on the layout, and a pin needs someone to keep bumping it.
2. Keep the depot artifacts 90 days instead of 7
The Steam depot is assembled from the Release run's
desktop-*/demo-desktop-*artifacts, not from the GitHub release. That happens in the chainedsteamjob, and also in a later Steam Deploy dispatch with thatrun_id, which is howpublishing/STEAM_NEXT_FEST_DEMO.md§3 puts the demo onbetaanddefault. The demo timeline puts that weeks after the build. With 7-day retention, that dispatch would find nothing to download, and only a rebuild with a new BuildID would recover.3. Refuse a full-edition dispatch whose tag already points elsewhere
A full-edition Run workflow creates the release tag on its own commit when the tag doesn't exist (#571). When it already exists, GitHub leaves it in place; softprops logs "Updating commit" and changes nothing. A dispatch from a newer
mainwould therefore stage a Steam build the tag does not point to, and a demo dispatched from the tag would come from different source.Validate now fails such a run before any build. It is the same comparison the demo guard makes, and it passes when the tag is missing or is the run's commit. The release checklist's
validaterow says so.Closes #
Checklist
Tests and CI
bash scripts/smoke-check.shDocumentation
Testing notes
DLL filter, modelled with Windows path semantics (
Directoryis the file's parent folder):build\steamworks-sys-<hash>\out\steam_api64.dll(Rust ≤ 1.99);build\steamworks-sys\<hash>\out\steam_api64.dll(Rust 1.100);build\other-sys\<hash>\out,build\other-sys-1234\out, and asteamworks-sys\<hash>folder with noout.PowerShell itself isn't available in this container.
Tag guard: I pulled the step's script out of the workflow, shellchecked it (clean), and ran it against
origin:TAG=v9.9.9(missing)TAG=v0.2.9,GITHUB_SHA=dbf4750f…(the tag's commit)TAG=v0.2.9,GITHUB_SHA=6bd5f6bd…::error::tag v0.2.9 already exists at dbf4750f…, but this run is on 6bd5f6bd…v0.4.0doesn't exist yet, so the next dispatch frommaintakes the first path. A demo dispatch skips this step and runs the existing demo guard.Other checks: the YAML parses, and
bash scripts/smoke-check.shexits 0.🤖 Generated with Claude Code
https://claude.ai/code/session_013J2EUgaGKdJEx9AhbrXLmS