ci: fold the imported workflows into this repo's set - #4256
ci: fold the imported workflows into this repo's set#4256bgm-malbeclabs wants to merge 1 commit into
Conversation
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Want reviews to match your repository better? Bugbot Learning can learn team-specific rules from PR activity. A team admin can enable Learning in the Cursor dashboard.
Comment @cursor review or bugbot run to trigger another review on this PR
Reviewed by Cursor Bugbot for commit 2c34df3. Configure here.
| dir: offchain/scheduler | ||
| - cmd: mix release | ||
| dir: scheduler | ||
| dir: offchain/scheduler |
There was a problem hiding this comment.
Stale scheduler release binary path
High Severity
Issue
The scheduler release looks for the prebuilt binary under ./scheduler/_build, but the mix hooks now write that tree under offchain/scheduler/_build. GoReleaser fails when it cannot find the artifact.
Context
An operator pushes an offchain-scheduler/v*.*.* tag, or runs release-rc.sh for this config, from the repository root. The four mix hooks and the package src already name offchain/scheduler.
Proposed Fix
Point the prebuilt path at ./offchain/scheduler/_build/prod/rel/scheduler/bin/scheduler.
Reviewed by Cursor Bugbot for commit 2c34df3. Configure here.
090eac9 to
aabc99c
Compare
740238c to
1f3f148
Compare
825db3b to
cd063da
Compare
1f3f148 to
71accae
Compare
Step 5 of the monorepo migration. The 11 workflows that came with doublezero-offchain and doublezero-solana are folded in and the imported `.github` directories are deleted. GitHub reads workflows only at the repository root, so nothing in those directories ever ran here. Five release workflows come across, one per component, matching the shape this repo already uses. They run goreleaser from the repository root rather than from `offchain/`: the merged workspace writes to the root `target/`, which is where goreleaser's rust builder looks for the binary it packages. The five goreleaser configs get their relative paths rewritten to match, and `release.github.name` moves from `doublezero-offchain` to `doublezero` so the releases land here. This repo already holds the three secrets they need. Two workflows are new rather than ported. `solana` runs that tree's own lint, library tests, docs and SBF tests plus the checksum gate, because the tree is excluded from the root workspace and `rust.yml` never reaches it, so it would otherwise have no CI here at all. `elixir` runs the scheduler's format check, compile, credo and tests on the pull request that changes it; upstream those ran on a release tag alone, so a pull request that broke the scheduler passed. Offchain's `ci.yml` is dropped, since `make rust-build`, `make rust-lint` and `make rust-test` now cover those crates. Two things it carried are kept elsewhere: `rust-cli-static` grows from the client alone to all five released CLIs, and the per-crate changelog check moves into this repo's `changelog-reminder`. One thing is not kept: the `just ci` coverage floor, whose workspace no longer exists. `offchain/Justfile` keeps its Elixir recipes and loses its Rust ones, which would otherwise run cargo over the whole workspace with a different fmt and clippy line than CI uses. `offchain/scripts/release-rc.sh` resolves the repository root two levels up, so local release candidates build against the merged workspace.
71accae to
59a56a9
Compare


Step 5 of the monorepo migration, per
docs/superpowers/specs/2026-08-27-monorepo-migration-design.md. Stacked on #4255 and based on that branch, so the diff shown here is step 5 alone.The 11 workflows that came with the two source repos are folded into this repo's set, and the imported
.githubdirectories are deleted. GitHub reads workflows only at the repository root, so nothing in those directories has ever run here.Where each imported workflow went
release.contributor-rewards.ymlrelease.contributor-rewards.ymlrelease.doublezero-solana-cli.ymlrelease.doublezero-solana-cli.ymlrelease.sentinel.ymlrelease.offchain-sentinel.ymlrelease.solana-validator-debt.ymlrelease.solana-validator-debt.ymlrelease.scheduler.ymlrelease.offchain-scheduler.ymllocal-validator.ymloffchain.local-validator.yml, two live jobs of fourci.ymlmake rust-build/rust-lint/rust-testcover those crates nowchangelog-reminder.ymlchangelog-reminder.ymlrust.yml+verify-build.ymlsolana.ymllocal-validator.ymlif: falseupstreamelixir.yml, which had no upstream equivalent in CISummary
offchain/. The merged workspace writes to the roottarget/, which is where goreleaser's rust builder looks for the binary it packages; running it fromoffchain/would send it looking inoffchain/target/. Every relative path inside the five configs is rewritten to match, including the scheduler's fourmixhooks and its_buildsource.release.github.namemoves fromdoublezero-offchaintodoublezeroin all five configs, so the releases land on this repository. Theownerwas already corrected during the org move. This repo already holdsCLOUDSMITH_TOKEN,GORELEASER_KEYandSLACK_BOTS_WEBHOOK, so the spec's "copy three secrets" step is already done.solanaworkflow, and it matters more than a port. Thesolana/tree is an excluded nested workspace, sorust.ymlnever reaches it: without this, the two Solana L1 programs would sit in this repo with no CI at all. It runs that tree's own lint, library tests, docs and SBF tests for both networks, plus the checksum gate that rebuilds the artifacts and verifies them againstsolana/programs/sha256sums_*.txt. Path-scoped tosolana/**.elixirworkflow, path-scoped tooffchain/scheduler/**: format check, compile with warnings as errors, credo, tests. Upstream these ran on a release tag only, so a pull request that broke the scheduler passed and the tag failed later.offchain-local-validatorruns from the repository root, because the fork scripts resolve their binaries astarget/debug/<name>and create their keypairs andtest-ledger/in the working directory, so all of it has to agree on one. Path-scoped tooffchain/**,solana/**and the root manifests rather than running on every pull request as it did in a quieter repo.rust-cli-staticcovers all five released CLIs instead of the client alone, which is what offchain'srust-musl-staticjob did for its four. Each package is built on its own so feature unification matches the release. The job keeps its name, since it is a required status check.changelog-reminderkeeps offchain's per-crate check, paths moved underoffchain/. This is a union, not a dedupe: a change to one of those 13 subprojects now needs both the rootCHANGELOG.mdand that subproject's own.What is deliberately not carried over
just cicoverage floor (cargo llvm-cov nextest --fail-under-lines 25). It measured a workspace that no longer exists, and running it over the merged workspace would both mean something different and cost a full instrumented build of 37 crates on every run.if: false, one commented out with a note about bringing it back. Both are in the imported history if wanted.offchain/Justfile's Rust recipes. Fromoffchain/they would now run cargo over the whole workspace, and with a different fmt line (group_imports=StdExternalCrate) and clippy line than CI uses. The Elixir recipes stay, plus two fork-test recipes that cd to the root.Testing Verification
actionlintover every new and changed workflow: no errors. The only output is SC2086 info notes on$SOLANA_CLIand$GITHUB_PATH, the same pattern the existingrust.ymljobs already carry.changelog-remindercheck parses underbash -n, andoffchain/scripts/release-rc.shstill parses after the path changes.just -linoffchain/lists the trimmed recipe set.cd solana && make lintpasses, which is the jobsolana.ymlruns first. Worth stating because step 4 reformatted three files in that tree with the root'simports_granularity=Crate: plain rustfmt preserves existing import grouping, so solana's owncargo fmt --checkstill agrees.NETWORKis passed asmainnet-betaordevelopmentexplicitly, never empty:solana/Makefilevalidates it and errors on anything else.