This commit is contained in:
Robin Appelman 2024-09-24 17:48:22 +02:00
commit bda220ba75
2 changed files with 141 additions and 37 deletions

65
README.md Normal file
View file

@ -0,0 +1,65 @@
# Mill Scale
Flakes of rust
## Features
Included checks:
- Verify MSRV (if specified in `Cargo.toml`)
- Test and clippy with default features
- Test and clippy with all features (if features are defined)
- Test and clippy with no default features (if default features are defined)
## Usage with GitHub Actions
### Single runner
```yaml
name: "CI"
on:
pull_request:
push:
jobs:
checks:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: cachix/install-nix-action@v26
# insert cache setup here
- run: nix flake check --keep-going
```
### Split over multiple runners
```yaml
name: "CI"
on:
pull_request:
push:
jobs:
matrix:
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.set-matrix.outputs.matrix }}
steps:
- uses: actions/checkout@v4
- uses: cachix/install-nix-action@v27
- id: set-matrix
run: echo "matrix={\"check\":$(nix eval --json '.#checks.x86_64-linux' --apply 'builtins.attrNames'}" | tee $GITHUB_OUTPUT
checks:
runs-on: ubuntu-latest
needs: [matrix]
strategy:
fail-fast: false
matrix: ${{fromJson(needs.miri-matrix.outputs.matrix)}}
name: ${{ matrix.check }}
steps:
- uses: actions/checkout@v4
- uses: cachix/install-nix-action@v26
# insert cache setup here
- run: nix build .#checks.x86_64-linux.${{ matrix.check }}
```

View file

@ -4,8 +4,8 @@
{ lib, src, config, flakelight, inputs, ... }: { lib, src, config, flakelight, inputs, ... }:
let let
inherit (builtins) elem readFile pathExists isAttrs; inherit (builtins) elem readFile pathExists isAttrs attrNames;
inherit (lib) mkDefault mkIf mkMerge mkOption warnIf assertMsg optionalAttrs types mapCartesianProduct id optionals; inherit (lib) mkDefault mkIf mkMerge mkOption warnIf assertMsg optionalAttrs types optionalString;
inherit (lib.fileset) fileFilter toSource; inherit (lib.fileset) fileFilter toSource;
inherit (flakelight.types) fileset; inherit (flakelight.types) fileset;
@ -14,8 +14,10 @@ let
hasMsrv = tomlPackage ? rust-version; hasMsrv = tomlPackage ? rust-version;
hasWorkspace = tomlPackage ? workspace; hasWorkspace = tomlPackage ? workspace;
hasFeatures = cargoToml ? features && isAttrs cargoToml.features; hasFeatures = cargoToml ? features && isAttrs cargoToml.features;
hasDefaultFeatures = cargoToml ? features && cargoToml.features ? default;
msrv = assert assertMsg hasMsrv ''"rust-version" not set in Cargo.toml''; tomlPackage.rust-version; msrv = assert assertMsg hasMsrv ''"rust-version" not set in Cargo.toml''; tomlPackage.rust-version;
tools = pkgs: with pkgs; [ cargo-edit bacon ]; tools = pkgs: with pkgs; [ cargo-edit bacon ];
maybeWorkspace = optionalString hasWorkspace "--workspace";
in in
warnIf (! builtins ? readFileType) "Unsupported Nix version in use." warnIf (! builtins ? readFileType) "Unsupported Nix version in use."
{ {
@ -37,6 +39,7 @@ warnIf (! builtins ? readFileType) "Unsupported Nix version in use."
withOverlays = [ withOverlays = [
(import inputs.rust-overlay) (import inputs.rust-overlay)
(final: { inputs, rust-bin, writeShellApplication, stdenvNoCC, ... } @ prev: rec { (final: { inputs, rust-bin, writeShellApplication, stdenvNoCC, ... } @ prev: rec {
crateName = (craneLib.crateNameFromCargoToml { inherit src; }).pname;
craneLib = (inputs.crane.mkLib final).overrideToolchain (p: p.latestRustToolchain); craneLib = (inputs.crane.mkLib final).overrideToolchain (p: p.latestRustToolchain);
craneLibMsrv = (inputs.crane.mkLib final).overrideToolchain (p: p.msrvRustToolchain); craneLibMsrv = (inputs.crane.mkLib final).overrideToolchain (p: p.msrvRustToolchain);
cargoArtifacts = craneLib.buildDepsOnly cargoArtifacts = craneLib.buildDepsOnly
@ -49,12 +52,21 @@ warnIf (! builtins ? readFileType) "Unsupported Nix version in use."
inherit src; inherit src;
strictDeps = true; strictDeps = true;
cargoExtraArgs = "--locked --all-features"; cargoExtraArgs = "--locked --all-features";
pname = "${crateName}-all-features";
};
cargoArtifactsNoDefault = craneLib.buildDepsOnly
{
inherit src;
strictDeps = true;
cargoExtraArgs = "--locked --no-default-features";
pname = "${crateName}-no-default-features";
}; };
cargoArtifactsMsrv = craneLibMsrv.buildDepsOnly cargoArtifactsMsrv = craneLibMsrv.buildDepsOnly
{ {
inherit src; inherit src;
strictDeps = true; strictDeps = true;
pnameSuffix = "-deps-all-features"; cargoExtraArgs = "--locked --all-features";
pname = "${crateName}-msrv";
}; };
latestRustToolchain = rust-bin.stable.latest.default; latestRustToolchain = rust-bin.stable.latest.default;
msrvRustToolchain = rust-bin.stable.${msrv}.default; msrvRustToolchain = rust-bin.stable.${msrv}.default;
@ -97,7 +109,16 @@ warnIf (! builtins ? readFileType) "Unsupported Nix version in use."
}; };
}; };
checks = { craneLib, craneLibMsrv, cargoArtifacts, cargoArtifactsMsrv, cargoArtifactsAllFeatures, ... }: { checks =
{ craneLib
, craneLibMsrv
, cargoArtifacts
, cargoArtifactsMsrv
, cargoArtifactsAllFeatures
, cargoArtifactsNoDefault
, crateName
, ...
}: {
test = craneLib.cargoTest { test = craneLib.cargoTest {
inherit src cargoArtifacts; inherit src cargoArtifacts;
cargoExtraArgs = "--locked --all-targets --workspace"; cargoExtraArgs = "--locked --all-targets --workspace";
@ -105,30 +126,48 @@ warnIf (! builtins ? readFileType) "Unsupported Nix version in use."
clippy = craneLib.cargoClippy { clippy = craneLib.cargoClippy {
inherit src cargoArtifacts; inherit src cargoArtifacts;
strictDeps = true; strictDeps = true;
cargoClippyExtraArgs = "--all-targets -- --deny warnings"; cargoClippyExtraArgs = "--all-targets ${maybeWorkspace} -- --deny warnings";
}; };
} // (optionalAttrs hasMsrv { } // (optionalAttrs hasMsrv {
msrv = craneLibMsrv.buildPackage { msrv = craneLibMsrv.buildPackage {
inherit src; inherit src;
pname = "${crateName}-msrv";
cargoArtifacts = cargoArtifactsMsrv; cargoArtifacts = cargoArtifactsMsrv;
strictDeps = true; strictDeps = true;
doCheck = false; doCheck = false;
cargoBuildCommand = "cargo check"; cargoBuildCommand = "cargo check";
cargoExtraArgs = "--all-targets"; cargoExtraArgs = "--release --locked --all-targets --all-features ${maybeWorkspace}";
installPhaseCommand = "mkdir $out"; installPhaseCommand = "mkdir $out";
}; };
}) // (optionalAttrs hasFeatures { }) // (optionalAttrs hasFeatures {
test-all-features = craneLib.cargoTest { test-all-features = craneLib.cargoTest {
inherit src; inherit src;
pname = "${crateName}-all-features";
strictDeps = true; strictDeps = true;
cargoArtifacts = cargoArtifactsAllFeatures; cargoArtifacts = cargoArtifactsAllFeatures;
cargoExtraArgs = "--locked --all-targets --all-features --workspace"; cargoExtraArgs = "--locked --all-targets --all-features ${maybeWorkspace}";
}; };
clippy-all-features = craneLib.cargoClippy { clippy-all-features = craneLib.cargoClippy {
inherit src; inherit src;
pname = "${crateName}-all-features";
strictDeps = true; strictDeps = true;
cargoArtifacts = cargoArtifactsAllFeatures; cargoArtifacts = cargoArtifactsAllFeatures;
cargoClippyExtraArgs = "--all-targets --all-features -- --deny warnings"; cargoClippyExtraArgs = "--all-targets ${maybeWorkspace} --all-features -- --deny warnings";
};
}) // (optionalAttrs hasDefaultFeatures {
test-no-default-features = craneLib.cargoTest {
inherit src;
pname = "${crateName}-no-default-features";
strictDeps = true;
cargoArtifacts = cargoArtifactsNoDefault;
cargoExtraArgs = "--locked --all-targets --no-default-features ${maybeWorkspace}";
};
clippy-no-default-features = craneLib.cargoClippy {
inherit src;
pname = "${crateName}-no-default-features";
strictDeps = true;
cargoArtifacts = cargoArtifactsNoDefault;
cargoClippyExtraArgs = "--all-targets ${maybeWorkspace} --no-default-features -- --deny warnings";
}; };
}); });