OXYGENHUB

Runner updates: Windows runners are offered flow-windows-x86_64.exe b6dfcb61cf5e

refs #322
Author
Andy McCall @andymccall <[email protected]>
When
· 2026-10-26 03:30 UTC
Signature
◈ sealed by Andy McCall
Hash
b6dfcb61cf5eb499420b7eee55ed6c6ca61af5e2e9f2b24772ad793e5f8a328a
Depends on
8501fd5815b9 b5668108487f d7050703d2f4
Depended on by
1ec29691b67a faf5246c900e dc5c64296b0a
In bookmarks
api-unknown-fields diffusion-pin-bookmark main proposal-list-fast
In tags
v0.9.11 v0.9.15 v0.9.16 v0.9.19 v0.9.20 v0.9.21 v0.9.22 v0.9.23 v0.9.24 v0.9.6 v0.9.7 v0.9.8 v0.9.9
Edits
8 atoms, 0 tree operations, 3 files

Browse the tree at this change

modified CHANGELOG.md +1 −1
…
4 unchanged lines
5 5
## Unreleased
6 6
7 7
- **A WASM job's placement names no image (#323):** a job on the WASM tier was placed saying its runner "fetches the image from the hub"; it has none, so the line now starts with what the runner is doing (andymccall/windows-runner-demo run #1).
8 -
- **Runner updates: policy, test groups and the offer (#322):** Admin › Runners › Updates sets where runner builds come from (a repository whose releases carry `flow-linux-ARCH` files) and who takes them. Updates are off unless chosen; the site, an owner, a test group and a runner may each set updates on or off, a channel (`stable`, `canary` or a version), a window of hours (UTC) and dry run, and the nearest setting wins, each setting on its own. A test group is chosen runners or a percentage of the site's (or an owner's) runners, by a stable hash of each runner's id, so a share is the same machines every rollout and 10% sits inside 50%. `GET /api/v1/flow/runner/update` tells a runner its policy, where each setting came from, and the build to install (its BLAKE3, to check the download against); `POST` takes what the runner did, shown on the page and in the audit log. Pins OxygenFlow's main.
8 +
- **Runner updates: policy, test groups and the offer (#322):** Admin › Runners › Updates sets where runner builds come from (a repository whose releases carry `flow-linux-ARCH` files, and `flow-windows-x86_64.exe` for Windows runners) and who takes them. Updates are off unless chosen; the site, an owner, a test group and a runner may each set updates on or off, a channel (`stable`, `canary` or a version), a window of hours (UTC) and dry run, and the nearest setting wins, each setting on its own. A test group is chosen runners or a percentage of the site's (or an owner's) runners, by a stable hash of each runner's id, so a share is the same machines every rollout and 10% sits inside 50%. `GET /api/v1/flow/runner/update` tells a runner its policy, where each setting came from, and the build to install (its BLAKE3, to check the download against); `POST` takes what the runner did, shown on the page and in the audit log. Pins OxygenFlow's main.
9 9
10 10
## 0.9.5 (2026-10-26)
11 11
…
334 unchanged lines
modified crates/hub/src/runner_updates.rs +9 −1
…
139 unchanged lines
140 140
    parts(a) < parts(b)
141 141
}
142 142
143 +
/// The release asset a runner on `os` and `arch` runs: `flow-linux-x86_64`,
144 +
/// `flow-windows-x86_64.exe`.
145 +
pub fn asset_for(os: &str, arch: &str) -> String {
146 +
    format!("flow-{os}-{arch}{}", if os == "windows" { ".exe" } else { "" })
147 +
}
148 +
143 149
/// The build `r` should install under `policy` at hour `hour` (UTC), or
144 150
/// why there is none.
145 151
pub async fn offer(pool: &Pool, r: &Runner, policy: &UpdatePolicy, hour: u8) -> sqlx::Result<(Option<UpdateOffer>, String)> {
…
26 unchanged lines
172 178
    if going_back && matches!(policy.channel.as_str(), "stable" | "canary") {
173 179
        return Ok((None, format!("runs flow {have}, newer than the {} channel's {want}", policy.channel)));
174 180
    }
175 -
    let file = format!("flow-{}-{}", r.os, r.arch);
181 +
    let file = asset_for(&r.os, &r.arch);
176 182
    let assets = db::releases::assets(pool, release.id).await?;
177 183
    let Some(a) = assets.iter().find(|a| a.name == file) else {
178 184
        return Ok((None, format!("{spec} {} has no {file}", release.tag)));
…
94 unchanged lines
273 279
        assert!(!valid_channel("latest") && !valid_channel("0.3.") && !valid_channel(""));
274 280
        assert_eq!(version_of("v0.3.2"), "0.3.2");
275 281
        assert_eq!(version_of("0.3.1 (local build)"), "0.3.1");
282 +
        assert_eq!(asset_for("linux", "riscv64"), "flow-linux-riscv64");
283 +
        assert_eq!(asset_for("windows", "x86_64"), "flow-windows-x86_64.exe");
276 284
    }
277 285
}
modified templates/admin_runner_updates.html +1 −1
…
26 unchanged lines
27 27
  <h2>Where builds come from</h2>
28 28
  <label for="update-repo">The repository whose releases carry runner builds</label>
29 29
  <input type="text" id="update-repo" name="repo" value="{{ repo }}" placeholder="owner/name, e.g. andymccall/oxygenflow">
30 -
  <p class="small mute">Each release offers one file per machine, <code>flow-linux-x86_64</code>, <code>flow-linux-aarch64</code>, <code>flow-linux-riscv64</code>. <em>stable</em> is its newest release, <em>canary</em> its newest including pre-releases; a version (<code>0.3.4</code>) pins it, going back if need be.</p>
30 +
  <p class="small mute">Each release offers one file per machine, <code>flow-linux-x86_64</code>, <code>flow-linux-aarch64</code>, <code>flow-linux-riscv64</code>, <code>flow-windows-x86_64.exe</code>. <em>stable</em> is its newest release, <em>canary</em> its newest including pre-releases; a version (<code>0.3.4</code>) pins it, going back if need be.</p>
31 31
  <button type="submit">Save</button>
32 32
</form>
33 33
<form class="card wide" method="post" action="/admin/runners/updates/policy">
…
82 unchanged lines