Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
63 commits
Select commit Hold shift + click to select a range
e3fccd7
Fix publish --delete-data config fallback (#5256)
clockwork-labs-bot Jun 9, 2026
0430253
Improve accuracy and change semantics of metric `wasm_memory_bytes` (…
gefjon Jun 9, 2026
e6a4701
cli: Accept hex-ish strings as Identity parameters for call (#5254)
kim Jun 9, 2026
29b21cc
Store non-full pages in a `BTreeSet`, not a `Vec` (#5071)
gefjon Jun 9, 2026
4c8ce71
Add some tests of procedure concurrency (#4955)
gefjon Jun 9, 2026
a91be36
Add primary keys to procedural views in C# (#5246)
joshua-spacetime Jun 10, 2026
0abf20b
Bump version to `2.5.0` (#5258)
rekhoff Jun 10, 2026
7d16c66
Migrations: handle mounted submodule tables, views, and indexes
aasoni Jun 10, 2026
fb0a458
LLM Benchmark: Sequential Upgrades Test (#4817)
bradleyshep Jun 10, 2026
4ca987e
Remove `cargo bump-versions` (#5157)
bfops Jun 10, 2026
fbee3fc
Consolidate template versions (#5228)
bfops Jun 10, 2026
ca16958
Allow layout-altering automigrations of event tables (#5269)
gefjon Jun 11, 2026
a485189
ctx.as for Handler/Transaction/Procedure contexts
aasoni Jun 3, 2026
99bc436
Cross compile CLI binaries for ARM (#5176)
jdetter Jun 11, 2026
20e165b
Fix broken links in auth docs (#4742)
JulienLavocat Jun 11, 2026
fd1447d
Catch unwinding panics in the scheduler (#5280)
joshua-spacetime Jun 11, 2026
0783d7a
Document schedule table lifecycle (#5265)
clockwork-labs-bot Jun 11, 2026
945b255
Timestamps can be primary keys in C# (#5262)
joshua-spacetime Jun 11, 2026
5d1b136
Unify index key representation in query plan (#5275)
joshua-spacetime Jun 11, 2026
9af04b4
Fail if `spacetime subscribe -n N` doesn't receive exactly `N` update…
joshua-spacetime Jun 11, 2026
b4a392f
First fixes
aasoni Jun 12, 2026
2c9738d
Fix commitlog replay of dropped event tables (#5288)
cloutiertyler Jun 12, 2026
e415c92
Fix TypeScript React provider reconnect (#5185)
gugahoa Jun 12, 2026
7b7e6a3
Stop tracking multiple plan types in the subscription cache (#5263)
joshua-spacetime Jun 12, 2026
346e2b2
Add C++ query builder (#4664)
JasonAtClockwork Jun 12, 2026
608abee
Some more fixes
aasoni Jun 12, 2026
2d5753e
Rename mounts/components to submodules
aasoni Jun 12, 2026
b432c08
Replay: delete orphaned st_event_table rows after replay (#5289)
cloutiertyler Jun 12, 2026
b53d3af
Move index scan tests into benchmark job (#5298)
joshua-spacetime Jun 13, 2026
2161148
Disable automatic snapshots in replay tests (#5297)
joshua-spacetime Jun 13, 2026
dc20faa
docs: improve docs and agent discovery metadata (#5243)
clockwork-labs-bot Jun 13, 2026
11276aa
Nest CLA Assistant retry command (#5313)
clockwork-labs-bot Jun 14, 2026
d93b381
Add CLA gate status wrapper (#5299)
clockwork-labs-bot Jun 14, 2026
0306826
Announce GitHub releases in Discord (#5314)
clockwork-labs-bot Jun 14, 2026
b0a8070
Simplify CLA gate workflow (#5316)
clockwork-labs-bot Jun 15, 2026
2fd8a87
Compilation guard && `tokio::sync` re-export from `runtime` crate. (#…
Shubham8287 Jun 15, 2026
7dfb1c8
Fix automigration bug
aasoni Jun 15, 2026
eb5b287
Restore CLA Gate status publishing (#5329)
clockwork-labs-bot Jun 15, 2026
315afc9
Parameterized query plans (#5287)
joshua-spacetime Jun 15, 2026
4ae01ae
Update docs for view primary keys (#5327)
joshua-spacetime Jun 15, 2026
31fd1c8
Version bump `2.6.0` (#5326)
rekhoff Jun 16, 2026
0f7615f
Add stub release workflow (#5334)
bfops Jun 16, 2026
a2ca083
Add args column to view backing tables (#5300)
joshua-spacetime Jun 16, 2026
f264511
Don't preallocate based on bsatn length prefix (#5343)
joshua-spacetime Jun 16, 2026
934158a
Fix TypeScript optional row keys (#4940)
clockwork-labs-bot Jun 16, 2026
77ffdbb
Move `RelationalDB` to `spacetimedb-engine` crate. (#5113)
Shubham8287 Jun 16, 2026
ab28022
Remove spacetimedb-update test on aarch64 (#5348)
jdetter Jun 16, 2026
fc2f761
Remove unused docker workflow (#5349)
jdetter Jun 16, 2026
59b5d49
Fix Internal Tests paths filter checkout (#5295)
clockwork-labs-bot Jun 16, 2026
b85f778
Use non-deprecated databaseIdentity accessor in docs reference tables…
krisajenkins Jun 16, 2026
fc47257
Use `SpacetimeDBGuard` for SDK test suite (#5340)
joshua-spacetime Jun 17, 2026
f8ccbbe
Re-land `spacetime lock/unlock` to prevent accidental database deleti…
clockwork-labs-bot Jun 17, 2026
b929eb5
Skip bsatn decode proptest (#5361)
joshua-spacetime Jun 17, 2026
5ea558e
Drop tps threshold in keynote bench (#5360)
joshua-spacetime Jun 17, 2026
3ec168d
[Procedures] Fix `Identity`and `ConnectionId` Regression (#5323)
kistz Jun 17, 2026
695b978
spacetime init --template without arg prints template list and link t…
clockwork-tien Jun 17, 2026
1747ca6
Use the normal shutdown path for the standalone integration tests (#5…
joshua-spacetime Jun 17, 2026
f24e961
Refactor smoketest publish and subscribe helpers to builder pattern (…
clockwork-labs-bot Jun 17, 2026
1e51e32
Fast-path no-op merge queue CI (#5381)
clockwork-labs-bot Jun 18, 2026
48361bf
Add a submodule to module-test-ts
aasoni Jun 17, 2026
a63c87b
Merge remote-tracking branch 'origin/master' into alessandro/handle-m…
aasoni Jun 18, 2026
f140722
Use RawIdentifier for view_name.
aasoni Jun 19, 2026
dbf337c
revert reducer call fix
aasoni Jun 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1 change: 0 additions & 1 deletion .cargo/config.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
rustflags = ["--cfg", "tokio_unstable"]

[alias]
bump-versions = "run -p upgrade-version --"
llm = "run --package xtask-llm-benchmark --bin llm_benchmark --"
ci = "run -p ci --"
regen = "run -p regen --"
Expand Down
203 changes: 167 additions & 36 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,57 @@ permissions:
pull-requests: read

jobs:
merge_queue_noop:
name: Detect merge queue no-op
runs-on: ubuntu-latest
outputs:
skip: ${{ steps.compare.outputs.skip }}
steps:
- name: Checkout merge queue commit
uses: actions/checkout@v4

- name: Compare merge queue commit to PR head
id: compare
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
HEAD_REF: ${{ github.event.merge_group.head_ref }}
shell: bash
run: |
set -euo pipefail

echo "skip=false" >>"$GITHUB_OUTPUT"

if [[ "${GITHUB_EVENT_NAME}" != "merge_group" ]]; then
echo "Not a merge_group event; running CI normally."
exit 0
fi

if [[ ! "${HEAD_REF}" =~ /pr-([0-9]+)- ]]; then
echo "Could not parse PR number from merge group head ref: ${HEAD_REF}"
exit 0
fi

pr_number="${BASH_REMATCH[1]}"
pr_head_sha="$(gh api "repos/${GITHUB_REPOSITORY}/pulls/${pr_number}" --jq '.head.sha')"
pr_head_repo="$(gh api "repos/${GITHUB_REPOSITORY}/pulls/${pr_number}" --jq '.head.repo.full_name')"

if [[ -z "${pr_head_sha}" || "${pr_head_sha}" == "null" || -z "${pr_head_repo}" || "${pr_head_repo}" == "null" ]]; then
echo "Could not resolve PR head SHA for PR #${pr_number}; running CI normally."
exit 0
fi

git fetch --no-tags --depth=1 "https://github.com/${pr_head_repo}.git" "${pr_head_sha}"

if git diff --quiet "${pr_head_sha}" "${GITHUB_SHA}" --; then
echo "Merge queue commit ${GITHUB_SHA} has the same tree as PR #${pr_number} head ${pr_head_sha}; skipping duplicate CI."
echo "skip=true" >>"$GITHUB_OUTPUT"
else
echo "Merge queue commit ${GITHUB_SHA} differs from PR #${pr_number} head ${pr_head_sha}; running CI normally."
fi

smoketests:
needs: [lints]
needs: [merge_queue_noop, lints]
if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }}
name: Smoketests (${{ matrix.name }})
strategy:
matrix:
Expand Down Expand Up @@ -176,8 +225,26 @@ jobs:
}
cargo ci smoketests -- --test-threads=1

# this is a no-op version of the above check with a trivially-passing body.
# we can't just let the check be entirely skipped because each matrix target is a required check,
# and skipping this check means that the matrix isn't "populated" so the required checks wouldn't be met.
smoketests_noop:
needs: [merge_queue_noop]
if: ${{ needs.merge_queue_noop.outputs.skip == 'true' }}
name: Smoketests (${{ matrix.name }})
strategy:
matrix:
include:
- name: Linux
- name: Windows
runs-on: ubuntu-latest
steps:
- name: Skip duplicate merge queue smoketest
run: echo "Merge queue commit has the same tree as the PR head; smoketest already ran for the PR."

test:
needs: [lints]
needs: [merge_queue_noop, lints]
if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }}
name: Test Suite
runs-on: spacetimedb-new-runner-2

Expand Down Expand Up @@ -261,16 +328,23 @@ jobs:

wasm-bindgen --version

- name: Check engine simulation build
run: cargo check -p spacetimedb-engine --no-default-features --features simulation

# Source emsdk environment to make emcc (Emscripten compiler) available in PATH.
- name: Run tests
run: |
source ~/emsdk/emsdk_env.sh
cargo ci test

keynote_bench:
needs: [lints]
needs: [merge_queue_noop, lints]
if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }}
name: Keynote Bench
runs-on: spacetimedb-benchmark-runner
concurrency:
group: ci-benchmark-runner
queue: max
timeout-minutes: 60
env:
CARGO_TARGET_DIR: ${{ github.workspace }}/target
Expand Down Expand Up @@ -325,7 +399,54 @@ jobs:
- name: Run keynote-2 benchmark regression check
run: cargo ci keynote-bench

index_scan_bench:
needs: [merge_queue_noop, lints]
if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }}
name: Index Scan Bench
runs-on: spacetimedb-benchmark-runner
concurrency:
group: ci-benchmark-runner
queue: max
timeout-minutes: 60
env:
CARGO_TARGET_DIR: ${{ github.workspace }}/target
RUST_BACKTRACE: full
steps:
- name: Find Git ref
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
PR_NUMBER="${{ github.event.inputs.pr_number || null }}"
if test -n "${PR_NUMBER}"; then
GIT_REF="$( gh pr view --repo clockworklabs/SpacetimeDB $PR_NUMBER --json headRefName --jq .headRefName )"
else
GIT_REF="${{ github.ref }}"
fi
echo "GIT_REF=${GIT_REF}" >>"$GITHUB_ENV"

- name: Checkout sources
uses: actions/checkout@v4
with:
ref: ${{ env.GIT_REF }}

- uses: dsherret/rust-toolchain-file@v1
- name: Set default rust toolchain
run: rustup default $(rustup show active-toolchain | cut -d' ' -f1)

- name: Cache Rust dependencies
uses: Swatinem/rust-cache@v2
with:
workspaces: ${{ github.workspace }}
shared-key: spacetimedb
save-if: false
prefix-key: v1

- name: Run index scan benchmark regression check
run: cargo bench -p spacetimedb-bench --bench index_scan_gate

lints:
needs: [merge_queue_noop]
if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }}
name: Lints
runs-on: spacetimedb-new-runner-2
env:
Expand Down Expand Up @@ -366,6 +487,8 @@ jobs:
run: cargo ci lint

wasm_bindings:
needs: [merge_queue_noop]
if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }}
name: Build and test wasm bindings
runs-on: spacetimedb-new-runner-2
env:
Expand All @@ -392,6 +515,8 @@ jobs:
run: cargo ci wasm-bindings

publish_checks:
needs: [merge_queue_noop]
if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }}
name: Check that packages are publishable
runs-on: spacetimedb-new-runner-2
permissions: read-all
Expand All @@ -406,13 +531,14 @@ jobs:
run: cargo ci publish-checks

update:
needs: [merge_queue_noop]
if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }}
name: Test spacetimedb-update flow (${{ matrix.target }})
permissions: read-all
strategy:
matrix:
include:
- { target: x86_64-unknown-linux-gnu, runner: spacetimedb-new-runner-2 }
- { target: aarch64-unknown-linux-gnu, runner: arm-runner }
- { target: aarch64-apple-darwin, runner: macos-latest }
- { target: x86_64-pc-windows-msvc, runner: windows-latest }
runs-on: ${{ matrix.runner }}
Expand All @@ -430,16 +556,30 @@ jobs:
- name: Install rust target
run: rustup target add ${{ matrix.target }}

- name: Install packages
if: ${{ matrix.runner == 'arm-runner' }}
shell: bash
run: sudo apt install -y libssl-dev

- name: Test spacetimedb-update
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: cargo ci update-flow --target=${{ matrix.target }} --github-token-auth

# this is a no-op version of the above check with a trivially-passing body.
# we can't just let the check be entirely skipped because each matrix target is a required check,
# and skipping this check means that the matrix isn't "populated" so the required checks wouldn't be met.
update_noop:
needs: [merge_queue_noop]
if: ${{ needs.merge_queue_noop.outputs.skip == 'true' }}
name: Test spacetimedb-update flow (${{ matrix.target }})
permissions: read-all
strategy:
matrix:
include:
- { target: x86_64-unknown-linux-gnu }
- { target: aarch64-apple-darwin }
- { target: x86_64-pc-windows-msvc }
runs-on: ubuntu-latest
steps:
- name: Skip duplicate merge queue update test
run: echo "Merge queue commit has the same tree as the PR head; update-flow already ran for the PR."

unreal_engine_tests:
name: Unreal Engine Tests
# This can't go on e.g. ubuntu-latest because that runner runs out of disk space. ChatGPT suggested that the general solution tends to be to use
Expand Down Expand Up @@ -534,6 +674,8 @@ jobs:
'

ci_command_docs:
needs: [merge_queue_noop]
if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }}
name: Check CI command docs
runs-on: spacetimedb-new-runner-2
env:
Expand Down Expand Up @@ -565,6 +707,8 @@ jobs:
run: cargo ci self-docs --check

cli_docs:
needs: [merge_queue_noop]
if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }}
name: Check CLI docs
permissions: read-all
runs-on: spacetimedb-new-runner-2
Expand Down Expand Up @@ -630,10 +774,10 @@ jobs:
cargo ci cli-docs

unity-testsuite:
needs: [lints]
needs: [merge_queue_noop, lints]
# Skip if this is an external contribution.
# The license secrets will be empty, so the step would fail anyway.
if: ${{ github.event_name != 'pull_request' || !github.event.pull_request.head.repo.fork }}
if: ${{ needs.merge_queue_noop.outputs.skip != 'true' && (github.event_name != 'pull_request' || !github.event.pull_request.head.repo.fork) }}
permissions:
contents: read
checks: write
Expand Down Expand Up @@ -776,7 +920,8 @@ jobs:
UNITY_SERIAL: ${{ secrets.UNITY_SERIAL }}

godot-testsuite:
needs: [lints]
needs: [merge_queue_noop, lints]
if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }}
permissions:
contents: read
runs-on: spacetimedb-new-runner-2
Expand Down Expand Up @@ -901,7 +1046,8 @@ jobs:
run: godot --headless --path demo/Blackholio/client-godot --scene res://tests/GodotPlayModeTests.tscn

csharp-testsuite:
needs: [lints]
needs: [merge_queue_noop, lints]
if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }}
runs-on: spacetimedb-new-runner-2
timeout-minutes: 30
env:
Expand Down Expand Up @@ -1018,6 +1164,8 @@ jobs:
}

global_json_policy:
needs: [merge_queue_noop]
if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }}
name: Verify global.json files are symlinks
runs-on: ubuntu-latest
permissions:
Expand Down Expand Up @@ -1057,6 +1205,8 @@ jobs:
run: cargo ci global-json-policy

smoketests_mod_rs_complete:
needs: [merge_queue_noop]
if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }}
name: Check smoketests/mod.rs is complete
runs-on: ubuntu-latest
permissions:
Expand Down Expand Up @@ -1114,6 +1264,8 @@ jobs:
cargo ci smoketests check-mod-list

docs-build:
needs: [merge_queue_noop]
if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }}
name: Docs build
runs-on: spacetimedb-new-runner-2
env:
Expand Down Expand Up @@ -1153,6 +1305,8 @@ jobs:
run: cargo ci docs

typescript-test:
needs: [merge_queue_noop]
if: ${{ needs.merge_queue_noop.outputs.skip != 'true' }}
name: TypeScript - Tests
runs-on: spacetimedb-new-runner-2
env:
Expand Down Expand Up @@ -1264,26 +1418,3 @@ jobs:
# - name: Print rows in the user table
# if: always()
# run: spacetime sql quickstart-chat "SELECT * FROM user"

version_upgrade_check:
runs-on: spacetimedb-new-runner-2
env:
RUST_BACKTRACE: full
steps:
- name: Checkout
uses: actions/checkout@v3
- uses: dsherret/rust-toolchain-file@v1
- name: Set default rust toolchain
run: rustup default $(rustup show active-toolchain | cut -d' ' -f1)
# pnpm is required for regenerating the typescript bindings
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: 20
- uses: ./.github/actions/setup-pnpm
with:
run_install: true
- name: Verify that upgrade-version still works
run: cargo ci version-upgrade-check
- name: Show diff
run: git diff HEAD
Loading
Loading