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 |