Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/actions/setup-nativelink-cloud/action.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ inputs:

outputs:
enabled:
description: "'true' when a user.bazelrc was written, else 'false'."
description: "'true' when remote cache or execution is enabled, else 'false'."
value: ${{ steps.configure.outputs.enabled }}

runs:
Expand Down
117 changes: 89 additions & 28 deletions .github/workflows/native-bazel.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -20,22 +20,68 @@ concurrency:
cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}

jobs:
# Compute whether the Bazel 8 source-compatibility lane can be affected by
# this diff. That lane runs with --lockfile_mode=off and cannot use the
# Bazel-9-keyed remote cache (it rebuilds from source, ~2x the Bazel 9
# lane), yet it only validates that the sources still build under the older
# Bazel. A pure code PR that does not touch the module graph, bazelrc, or
# toolchains cannot change that answer, so the lane is gated off for those.
# Pushes to main always run it (backstop) so nothing merges unvalidated.
changes:
name: Compute affected Bazel lanes
runs-on: ubuntu-24.04
outputs:
unit-tests-matrix: ${{ steps.matrix.outputs.include }}
steps:
- name: Checkout
uses: >- # v6.0.2
actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
- name: Filter Bazel-8-affecting paths
# Only meaningful on pull requests; pushes to main always run the
# full matrix below, so the filter is skipped there.
if: github.event_name == 'pull_request'
uses: >- # v3.0.2
dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36
id: filter
with:
filters: |
bazel8:
- 'MODULE.bazel'
- 'MODULE.bazel.lock'
- '*.bazelrc'
- '**/BUILD.bazel'
- '**/BUILD'
- '**/*.bzl'
- 'tools/**'
- 'local-remote-execution/**'
- '.github/workflows/native-bazel.yaml'
- '.github/actions/**'
- name: Compose unit-tests matrix
# The gating must live inside this always-running job: a job-level
# `if` cannot see the `matrix` context, and a skipped required job
# would leave the check pending forever.
id: matrix
shell: bash
run: |
# Keep the existing required check name on the project-pinned Bazel.
bazel9='{"os":"ubuntu-24.04","bazel_version":"9.1.1","check_name":"ubuntu-24.04"}'
# Deterministic Bazel compatibility lane. Bazel 8 cannot read the
# Bazel 9 lockfile format, so this lane tests source compatibility
# without enforcing the committed MODULE.bazel.lock.
bazel8='{"os":"ubuntu-24.04","bazel_version":"8.7.0","check_name":"ubuntu-24.04 / Bazel 8.7.0"}'
if [ "${{ github.ref }}" = "refs/heads/main" ] \
|| [ "${{ steps.filter.outputs.bazel8 }}" = "true" ]; then
echo "include=[${bazel9},${bazel8}]" >> "$GITHUB_OUTPUT"
else
echo "include=[${bazel9}]" >> "$GITHUB_OUTPUT"
fi

unit-tests:
needs: [changes]
strategy:
fail-fast: false
matrix:
include:
# Keep the existing required check names on the project-pinned Bazel.
- os: ubuntu-24.04
bazel_version: 9.1.1
check_name: ubuntu-24.04
# Deterministic Bazel compatibility lane. Randomizing Bazel versions
# makes failures harder to reproduce. Bazel 8 cannot read the
# Bazel 9 lockfile format, so this lane tests source compatibility
# without enforcing the committed MODULE.bazel.lock.
- os: ubuntu-24.04
bazel_version: 8.7.0
check_name: ubuntu-24.04 / Bazel 8.7.0
include: ${{ fromJSON(needs.changes.outputs.unit-tests-matrix) }}
name: ${{ matrix.check_name }}
runs-on: ${{ matrix.os }}
timeout-minutes: 30
Expand All @@ -49,15 +95,8 @@ jobs:
- name: Free disk space
uses: ./.github/actions/free-disk

- name: Setup Bazel
uses: >- # v0.19.0
bazel-contrib/setup-bazel@c5acdfb288317d0b5c0bbd7a396a3dc868bb0f86
with:
bazelisk-cache: true
repository-cache: true
disk-cache: ${{ github.workflow }}-${{ matrix.os }}-bazel-${{ matrix.bazel_version }}

- name: Setup NativeLink Cloud
id: setup-nativelink-cloud
uses: ./.github/actions/setup-nativelink-cloud
with:
ci-mode: ${{ vars.NATIVELINK_CI_MODE }}
Expand All @@ -72,6 +111,25 @@ jobs:
# non-Linux runners, so macOS lanes fall back to cache.
exec: ${{ runner.os == 'Linux' && 'on' || 'off' }}

- name: Setup Bazel
uses: >- # v0.19.0
bazel-contrib/setup-bazel@c5acdfb288317d0b5c0bbd7a396a3dc868bb0f86
with:
bazelisk-cache: true
repository-cache: true
# Disk cache only where it nets positive. On the Bazel 9 lane the
# remote cache already covers the build (measured 2273/3915 remote
# hits), so restoring/saving a ~17 GB disk cache is pure transfer
# waste. The Bazel 8 compatibility lane cannot use the Bazel-9-keyed
# remote cache effectively (measured 257/3740 remote hits), so it
# keeps its own keyed disk cache. (Coordinate with the dedicated
# Bazel-8 disk-cache work, "X3", before changing the 8.x key.)
disk-cache: >-
${{ (steps.setup-nativelink-cloud.outputs.enabled == 'false'
|| matrix.bazel_version == '8.7.0')
&& format('{0}-{1}-bazel-{2}', github.workflow, matrix.os, matrix.bazel_version)
|| 'false' }}

- name: Show Bazel version
run: bazel --version

Expand Down Expand Up @@ -119,15 +177,8 @@ jobs:
with:
compose-file: src/bin/docker-compose.store-tester.yaml

- name: Setup Bazel
uses: >- # v0.19.0
bazel-contrib/setup-bazel@c5acdfb288317d0b5c0bbd7a396a3dc868bb0f86
with:
bazelisk-cache: true
repository-cache: true
disk-cache: ${{ github.workflow }}-ubuntu-24.04

- name: Setup NativeLink Cloud
id: setup-nativelink-cloud
uses: ./.github/actions/setup-nativelink-cloud
with:
ci-mode: ${{ vars.NATIVELINK_CI_MODE }}
Expand All @@ -142,6 +193,16 @@ jobs:
# non-Linux runners, so macOS lanes fall back to cache.
exec: ${{ runner.os == 'Linux' && 'on' || 'off' }}

- name: Setup Bazel
uses: >- # v0.19.0
bazel-contrib/setup-bazel@c5acdfb288317d0b5c0bbd7a396a3dc868bb0f86
with:
bazelisk-cache: true
repository-cache: true
# Only enable when we don't have remote cache, otherwise it just gets very slow
# and enormous
disk-cache: ${{ steps.setup-nativelink-cloud.outputs.enabled == 'false'}}

- name: Run Store tester with sentinel
run: |
bazel run //:redis_store_tester \
Expand Down
27 changes: 21 additions & 6 deletions .github/workflows/native-cargo.yaml
Original file line number Diff line number Diff line change
@@ -1,17 +1,27 @@
---
name: Cargo Native

# Opinionated per-PR CI scope: the Cargo build system is validated on every
# push to main (and on demand via workflow_dispatch), not on every PR push.
# Per-PR correctness coverage comes from the Bazel lanes, which build and
# test the same sources against the remote cache; this workflow exists to
# catch Cargo-specific build-system divergence (Cargo.toml/lock drift,
# cargo-only cfg paths, the Windows native toolchain), which a code PR
# cannot usually affect but every main push re-proves. Tradeoff owned in
# the PR introducing this: a cargo-only break is caught at main rather
# than pre-merge; a merge queue is the stricter variant if main must never
# redden.
on:
push:
branches: [main]
paths-ignore:
- '.github/styles/**'
- 'web/**'
pull_request:
branches: [main]
paths-ignore:
- '.github/styles/**'
- 'web/**'
schedule:
# Daily backstop so the lane keeps proving the Cargo build even when
# main is quiet (toolchain or dependency drift shows up within a day).
- cron: '0 6 * * *'
workflow_dispatch:

permissions: read-all

Expand All @@ -32,7 +42,12 @@ jobs:
fail-fast: false
matrix:
os: [ubuntu-24.04, windows-2022]
toolchain: [stable]
# Pin to the committed MSRV instead of floating `stable`. Floating
# stable drifts ahead of the crate's rust-version and turns new
# deprecation lints into hard build errors (e.g. atomic fetch_update
# -> try_update), reddening the lane for a toolchain reason unrelated
# to the change under test. The MSRV is the contract the crate pins.
toolchain: ['1.97.1']
name: ${{ matrix.os }} / ${{ matrix.toolchain }}
runs-on: ${{ matrix.os }}
timeout-minutes: 30
Expand Down
5 changes: 4 additions & 1 deletion .github/workflows/nix.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,10 @@ jobs:

- name: Get commands list
run: |
COMMANDS=$(nix run .#rbe-toolchain-with-nativelink-test list)
# Discovery uses the list-only target, which carries no nativelink
# dependency, so enumerating the lanes no longer rebuilds nativelink
# (that build now happens once per rbe-toolchain shard, not twice).
COMMANDS=$(nix run .#rbe-toolchain-test-list)
echo "matrix={\"command\":${COMMANDS}}" >> $GITHUB_OUTPUT
id: set-matrix

Expand Down
47 changes: 47 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,53 @@

All notable changes to this project will be documented in this file.

## [1.7.3](https://github.com/TraceMachina/nativelink/compare/v1.7.2..v1.7.3) - 2026-10-01



### ⛰️ Features

- Support queueing-service through an opt-in gRPC event sink ([#2811](https://github.com/TraceMachina/nativelink/issues/2811)) - ([181a1d3](https://github.com/TraceMachina/nativelink/commit/181a1d34a116aafd93f7b735f224a7e31f314b54))
- bound the input fetch with max_download_timeout and let a kill reach it ([#2846](https://github.com/TraceMachina/nativelink/issues/2846)) - ([82240c6](https://github.com/TraceMachina/nativelink/commit/82240c640970e8341f6358404456845aad17df47))
- read capacity and free memory from the worker's own cgroup directory ([#2845](https://github.com/TraceMachina/nativelink/issues/2845)) - ([b4a5468](https://github.com/TraceMachina/nativelink/commit/b4a5468248f4699fcd1ad928e3ea65167e92af86))
- Historical resource scheduler: hints by digest keys, size classes with a cold-start policy, and where each reservation came from ([#2832](https://github.com/TraceMachina/nativelink/issues/2832)) - ([59cbad2](https://github.com/TraceMachina/nativelink/commit/59cbad26b2a793e06d5e436b3e984f3d1c2df74a))
- Persistent workers: a configurable pool with an idle sweeper, the action environment, namespaces, measured usage, and a wait at the cap ([#2830](https://github.com/TraceMachina/nativelink/issues/2830)) - ([035dd63](https://github.com/TraceMachina/nativelink/commit/035dd631650a30334db2f5d062dbde8ff3cde301))
- memory escalation with retry budgets by cause, the whole worker as the last step ([#2829](https://github.com/TraceMachina/nativelink/issues/2829)) - ([3c52ee1](https://github.com/TraceMachina/nativelink/commit/3c52ee1a7026014deef13f92d9cef1e6b474136b))
- a disk soft limit, and peak_disk_kb from the files an action writes ([#2825](https://github.com/TraceMachina/nativelink/issues/2825)) - ([7bd3c54](https://github.com/TraceMachina/nativelink/commit/7bd3c5424d00bd29f6e3e1516d60105196f439e2))
- each action gets a private /tmp, its own tmp directory bound over /tmp ([#2824](https://github.com/TraceMachina/nativelink/issues/2824)) - ([c79e3bb](https://github.com/TraceMachina/nativelink/commit/c79e3bbe69e4ecac3e87f9503f47083bffd07fd6))
- Worker reaps the zombies actions leave behind, and an action's stragglers no longer hold its output open ([#2823](https://github.com/TraceMachina/nativelink/issues/2823)) - ([4fe0a27](https://github.com/TraceMachina/nativelink/commit/4fe0a27ba9e44e02aedf2d197e6f2189c6e543b2))
- SIGTERM grace before the kill, output kept, a TMPDIR per action, and resource usage with an outcome ([#2822](https://github.com/TraceMachina/nativelink/issues/2822)) - ([9a95e29](https://github.com/TraceMachina/nativelink/commit/9a95e29153f9cbd64208355f211293b97c6d6106))
- Worker readiness follows scheduler registration ([#2821](https://github.com/TraceMachina/nativelink/issues/2821)) - ([de7a540](https://github.com/TraceMachina/nativelink/commit/de7a540222ca697da3fec83cbb97ba7bcfab039c))
- Worker advertises CPU and memory from its own cgroup limits ([#2820](https://github.com/TraceMachina/nativelink/issues/2820)) - ([d86ff4f](https://github.com/TraceMachina/nativelink/commit/d86ff4f38ca6e40e09235adfff13cbb036eef9cc))
- soft memory enforcement against the reservation, and a disk guard before inputs are fetched ([#2812](https://github.com/TraceMachina/nativelink/issues/2812)) - ([fcdccc8](https://github.com/TraceMachina/nativelink/commit/fcdccc81fd4e29e824f8eed733f72988f3b81a18))
- bound output capture, upload fan-out, precondition scripts and orphaned action directories ([#2810](https://github.com/TraceMachina/nativelink/issues/2810)) - ([f10c7b7](https://github.com/TraceMachina/nativelink/commit/f10c7b70c10a450cefb0062922b33e0840eec8de))
- kill the whole process group when an action times out or is cancelled ([#2809](https://github.com/TraceMachina/nativelink/issues/2809)) - ([e6aa38a](https://github.com/TraceMachina/nativelink/commit/e6aa38a6b490c281a9df03cf205c951e1a1dbedc))
- Dispatch is acknowledged or declined by the worker ([#2808](https://github.com/TraceMachina/nativelink/issues/2808)) - ([a21d82c](https://github.com/TraceMachina/nativelink/commit/a21d82c8bdd4225e7f2287ff8018ba243384157b))
- GoingAway with a drain flag, reconnect backoff with jitter, and a shutdown guard that waits for the drain ([#2807](https://github.com/TraceMachina/nativelink/issues/2807)) - ([2bfa020](https://github.com/TraceMachina/nativelink/commit/2bfa0207f8910d2af4d1b3d2df564a39c1730235))
- Matching pass: room that opens mid-pass goes to the oldest waiting action, one store read per queued action ([#2806](https://github.com/TraceMachina/nativelink/issues/2806)) - ([2762510](https://github.com/TraceMachina/nativelink/commit/276251061994325162b96a79e12dca3b4dce9e20))
- Redis scheduler store: RESP3 cursor pages, the retention default, an unreadable row skipped, a wait for the new index ([#2803](https://github.com/TraceMachina/nativelink/issues/2803)) - ([5ef7a83](https://github.com/TraceMachina/nativelink/commit/5ef7a8315d472f92dbb785eb82dfe8bd85968e06))
- least_loaded and best_fit allocation strategies, typed properties cached per pass ([#2805](https://github.com/TraceMachina/nativelink/issues/2805)) - ([a7cc44d](https://github.com/TraceMachina/nativelink/commit/a7cc44da142e0a8a136176213fa48f2e71464145))
- Admin API: list connected workers and queued demand ([#2804](https://github.com/TraceMachina/nativelink/issues/2804)) - ([02a64f2](https://github.com/TraceMachina/nativelink/commit/02a64f2b4c69ba5ae157c8c88f7bf6aad8aaa730))
- Serve the scheduler queue in order, and let workers report their load on the keepalive ([#2796](https://github.com/TraceMachina/nativelink/issues/2796)) - ([4c06bb8](https://github.com/TraceMachina/nativelink/commit/4c06bb81ec4702d830d8aba7b6f39f225e016aa6))
- Unsatisfiable actions: the clock follows the fleet's shapes, and a timeout for a fleet with no worker at all ([#2799](https://github.com/TraceMachina/nativelink/issues/2799)) - ([31be880](https://github.com/TraceMachina/nativelink/commit/31be88082f7c376d8b8648b1017d10975215c66a))
- Scheduler worker state: budget released at completion, pause until the next keepalive, retry cap fails with FailedPrecondition ([#2798](https://github.com/TraceMachina/nativelink/issues/2798)) - ([71bb05a](https://github.com/TraceMachina/nativelink/commit/71bb05a0eedb89b69a4d8b5b5b562bea261644cc))
- Worker liveness: any message counts, a 10s default, a dead keepalive reconnects, SIGINT drains ([#2797](https://github.com/TraceMachina/nativelink/issues/2797)) - ([2f54cc3](https://github.com/TraceMachina/nativelink/commit/2f54cc3bcb9548b83eedc447bfa02faca8120374))

### 🐛 Bug Fixes

- a stalled scheduler connection reconnects instead of leaving the worker evicted and idle ([#2856](https://github.com/TraceMachina/nativelink/issues/2856)) - ([389cf73](https://github.com/TraceMachina/nativelink/commit/389cf73574e82ebee101beacea4453424908b06d))
- a fast tier that ends short on a digest resumes from the slow store, and a missing input names its digest so the client re-uploads it ([#2855](https://github.com/TraceMachina/nativelink/issues/2855)) - ([bd1bb34](https://github.com/TraceMachina/nativelink/commit/bd1bb3402e03fd6b377ec7166dd3ba6f0c1b4416))
- Give a live worker a grace period to report its own timeout ([#2826](https://github.com/TraceMachina/nativelink/issues/2826)) - ([5b4e555](https://github.com/TraceMachina/nativelink/commit/5b4e555070fe5e1b3e8709d11d03c1fc6812023b))
- a read that stops short of the digest's size is an error, not EOF ([#2844](https://github.com/TraceMachina/nativelink/issues/2844)) - ([fd6530e](https://github.com/TraceMachina/nativelink/commit/fd6530ea797355506dc4f2ca6e730c398f8900cc))
- build the cleanup mark's guard after the lock is released ([#2843](https://github.com/TraceMachina/nativelink/issues/2843)) - ([9a03932](https://github.com/TraceMachina/nativelink/commit/9a03932c0fd5b38150a865770c3222737b306836))
- Scheduler skips and counts a queue entry it cannot read ([#2795](https://github.com/TraceMachina/nativelink/issues/2795)) - ([4001f52](https://github.com/TraceMachina/nativelink/commit/4001f5256eccfbfa1f09b849a7f03e4092c4f9bc))
- Sorted index reads return the whole set, not ten rows ([#2794](https://github.com/TraceMachina/nativelink/issues/2794)) - ([7b2c02d](https://github.com/TraceMachina/nativelink/commit/7b2c02db4993bffb6073d408d7955d34e7882e1f))

### 🧪 Testing & CI

- Give the oversized-upload store tests the 30 s deadline the third already has ([#2818](https://github.com/TraceMachina/nativelink/issues/2818)) - ([3ff63f1](https://github.com/TraceMachina/nativelink/commit/3ff63f17f52372c7ee7459d4f5f7690713fa6e5c))
- Give trivy three vulnerability database mirrors to fall through ([#2801](https://github.com/TraceMachina/nativelink/issues/2801)) - ([a9c6801](https://github.com/TraceMachina/nativelink/commit/a9c6801f4e374016734811eb35231e14303778c8))

## [1.7.2](https://github.com/TraceMachina/nativelink/compare/v1.7.1..v1.7.2) - 2026-09-25

### Major changes
Expand Down
Loading
Loading