TypeScript-based CI configuration for Rust projects. Replaces static YAML configs with type-safe builders.
bun install --global @dougefresh/ci@latest- User defines config in
.github/rust-ci.tsusingcreateRustWorkflow()builder - Action generates JSON via
dougefresh/ci@main(runsscripts/generate-rust.ts) - Workflow consumes JSON using
fromJSON()to populate job matrices and conditionals
dougefresh/ci@main (this repo's action.yml)
- Copies
.github/rust-ci.tsfrom calling repo - Executes
scripts/generate-rust.tswith Bun - Outputs JSON config string
.github/actions/rust-config/action.yml
- Wraps
dougefresh/ci@main - Replaces runner placeholders (
vars.RUNNER_ARM64,vars.RUNNER_AMD64) with actual runner names - Used by workflows to get final config with resolved runners
.github/actions/rust-init/action.yml
- Checks out code
- Sets up Rust toolchains (stable + nightly)
- Installs OS-specific packages from config
- Configures caching
.github/workflows/rust.yml demonstrates the pattern:
- config job: Calls
rust-configaction → outputs JSON - downstream jobs: Use
fromJSON(needs.config.outputs.config)to:- Control job execution (
ifconditions) - Populate matrices (toolchains, features, OS)
- Extract run commands and flags
- Control job execution (
Each job checks fromJSON(needs.config.outputs.config).jobs.<job_name>.if before running.
See .github/rust-ci.ts:
import { createRustWorkflow } from '@dougefresh/ci';
export default function () {
return createRustWorkflow()
.enableMdBook()
.extra('test-extra', 'echo hello')
.semver(false)
.disableSanitizers()
.build();
}Generates JSON consumed by workflow jobs via fromJSON().