nix-gitlab-ci/docs/usage.md
Jairo Llopis ab41bc24ec
feat: auto-generate CI jobs from flake checks
Add `checks` option and `config.autoChecks` to auto-generate a CI job
for each flake check derivation. Auto-generated jobs go through
`mkJobPatched` for proper Nix setup, cache, and environment handling.

The `checks` option is automatically wired to `config.checks` in
flake-parts. System is inferred from `pkgs.system` and set via the new
`system` option. User-defined jobs with the same name always take
precedence.

New tests cover both flake-parts and direct API entry points.

MT-14138
2026-05-11 08:02:44 +01:00

153 lines
3.9 KiB
Markdown

# Usage
## Usage (with flake-parts)
```nix
# flake.nix
{
...
inputs.nix-gitlab-ci.url = "gitlab:TECHNOFAB/nix-gitlab-ci/<version>?dir=lib"; # recommendation: pin to the latest release/version
outputs = {...}: flake-parts.lib.mkFlake {...} {
imports = [
inputs.nix-gitlab-ci.flakeModule
];
...
perSystem = {pkgs, ...}: {
ci = {
config = {
# configure Nix-GitLab-CI here, see docs for options
};
pipelines."default" = {
stages = ["test"];
jobs = {
"test" = {
stage = "test";
nix.deps = [pkgs.unixtools.ping];
script = [
"ping -c 5 8.8.8.8"
];
};
};
};
# runs on a merge request for example
pipelines."merge_request_event" = {
stages = ["some_stage"];
jobs = { ... };
};
};
...
}
}
}
```
Now either use this in your .gitlab-ci.yml or setup Soonix to auto generate this
file for you with the right version (see the [docs][docs-soonix] for more).
```yaml
# .gitlab-ci.yml
include:
- component: gitlab.com/TECHNOFAB/nix-gitlab-ci/nix-gitlab-ci@<version> # recommendation: pin to the latest release/version (don't use "main" etc.)
inputs:
version: <version> # docker image tag, use the same version as a above
```
## Usage (directly)
```nix
let
cilib = inputs.nix-gitlab-ci.lib {inherit pkgs;};
in
cilib.mkCI {
config = ...;
pipelines."default" = ...;
};
# exposes `soonix` for the soonix hook and `packages` which contain the configs, jobs etc.
```
## Auto-generate jobs from flake checks
You can auto-generate CI jobs from your flake checks with the `autoChecks` option.
Each check becomes a job that runs `nix build .#checks.<system>.<name>`.
Auto-generated jobs are skipped if a user-defined job with the same name exists.
### With flake-parts
```nix
{
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
flake-parts.url = "github:hercules-ci/flake-parts";
systems.url = "github:nix-systems/default-linux";
nix-gitlab-ci.url = "gitlab:TECHNOFAB/nix-gitlab-ci?dir=lib";
};
outputs =
{ flake-parts, systems, ... } @ inputs:
flake-parts.lib.mkFlake { inherit inputs; } {
imports = [ inputs.nix-gitlab-ci.flakeModule ];
systems = import systems;
perSystem = { pkgs, system, ... }: {
checks = {
lint = pkgs.runCommand "lint" { } ''
${pkgs.nodePackages.prettier}/bin/prettier --check .
touch $out
'';
test = pkgs.runCommand "test" { } ''
${pkgs.python3}/bin/python -m pytest
touch $out
'';
};
ci = {
config.autoChecks.enable = true;
pipelines.default.stages = [ "test" "build" ];
};
};
};
}
```
### Without flake-parts
```nix
{
inputs = {
nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
nix-gitlab-ci.url = "gitlab:TECHNOFAB/nix-gitlab-ci?dir=lib";
};
outputs =
{ self, nixpkgs, nix-gitlab-ci, ... }:
let
system = "x86_64-linux";
pkgs = import nixpkgs { inherit system; };
cilib = nix-gitlab-ci.lib { inherit pkgs; };
in
{
checks.${system} = {
lint = pkgs.runCommand "lint" { } ''
${pkgs.nodePackages.prettier}/bin/prettier --check .
touch $out
'';
test = pkgs.runCommand "test" { } ''
${pkgs.python3}/bin/python -m pytest
touch $out
'';
};
packages.${system} =
(cilib.mkCI {
checks = self.checks.${system};
config.autoChecks.enable = true;
pipelines.default.stages = [ "test" "build" ];
}).packages;
};
}
```
______________________________________________________________________
Since V2 multiple pipelines are supported.
See [Multiple Pipelines](./multi_pipeline.md) for more.