Merge branch 'fix-job-patch' into 'main'

fix: weird jobs patching

See merge request TECHNOFAB/nix-gitlab-ci!15
This commit is contained in:
Skryta Istota 2025-11-30 18:00:07 +01:00
commit 8de4594629
5 changed files with 195 additions and 61 deletions

View file

@ -55,3 +55,5 @@ stages:
- build-images
- build
- trigger
variables:
NIX_CI_IMAGE: $CI_REGISTRY_IMAGE/nix-ci:$CI_COMMIT_SHORT_SHA

View file

@ -50,7 +50,7 @@ in rec {
filterJobVariables = shouldContain: job:
concatMapAttrs (
name: value:
optionalAttrs ((hasInfix "/nix/store/" value) == shouldContain) {
optionalAttrs ((hasInfix builtins.storeDir value) == shouldContain) {
${name} = value;
}
)

View file

@ -3,7 +3,7 @@
helpers,
}: let
inherit (lib) toList optionalAttrs optional;
inherit (helpers) prependToBeforeScript appendToAfterScript filterJobVariables;
inherit (helpers) prependToBeforeScript appendToAfterScript;
in
{
key,
@ -11,16 +11,13 @@ in
pipelineName,
nixConfig,
}:
if ! nixConfig.enable then job else
(builtins.removeAttrs job [ "variables" "cache" ])
// (optionalAttrs nixConfig.enable (
(prependToBeforeScript ["source setup_nix_ci \"gitlab-ci:pipeline:${pipelineName}:job-deps:${key}\""] job)
// (prependToBeforeScript [ "source setup_nix_ci \"gitlab-ci:pipeline:${pipelineName}:job-deps:${key}\"" ] job)
// (appendToAfterScript [ "finalize_nix_ci" ] job)
))
// optionalAttrs nixConfig.enable (
(let
variables =
(filterJobVariables false job)
// optionalAttrs nixConfig.enableRunnerCache {
// (let
variables = job.variables or {} //
optionalAttrs nixConfig.enableRunnerCache {
NIX_CI_CACHE_STRATEGY = "runner";
};
in
@ -29,9 +26,8 @@ in
inherit variables;
})
// (let
cache =
(toList (job.cache or []))
++ (optional nixConfig.enableRunnerCache {
cache = (toList (job.cache or [])) ++
(optional nixConfig.enableRunnerCache {
key = nixConfig.runnerCacheKey;
paths = [ ".nix-cache/" ];
});
@ -40,4 +36,3 @@ in
optionalAttrs (cache != []) {
inherit cache;
})
)

View file

@ -10,6 +10,7 @@ in
# the child pipeline can then use the built images to test them
extraData = {
stages = ["build-images" "build" "trigger"];
variables.NIX_CI_IMAGE = "$CI_REGISTRY_IMAGE/nix-ci:$CI_COMMIT_SHORT_SHA";
"build:image" = {
stage = "build-images";
parallel.matrix = [

View file

@ -56,11 +56,29 @@
}
{
name = "jobPatched nix disabled";
expected = {};
expected = {
cache = {
name = "some";
paths = [ "this" ];
};
variables = {
BASH = toString pkgs.bash;
TEST = "work";
};
};
actual = mkJobPatched {
key = "test";
pipelineName = "test";
job = {};
job = {
cache = {
name = "some";
paths = [ "this" ];
};
variables = {
BASH = toString pkgs.bash;
TEST = "work";
};
};
nixConfig.enable = false;
};
}
@ -69,11 +87,28 @@
expected = {
after_script = [ "finalize_nix_ci" ];
before_script = [ "source setup_nix_ci \"gitlab-ci:pipeline:test:job-deps:test\"" ];
variables = {
BASH = toString pkgs.bash;
TEST = "work";
};
cache = [{
name = "some";
paths = [ "this" ];
}];
};
actual = mkJobPatched {
key = "test";
pipelineName = "test";
job = {};
job = {
cache = {
name = "some";
paths = [ "this" ];
};
variables = {
BASH = toString pkgs.bash;
TEST = "work";
};
};
nixConfig = {
enable = true;
enableRunnerCache = false;
@ -85,18 +120,32 @@
expected = {
after_script = [ "finalize_nix_ci" ];
before_script = [ "source setup_nix_ci \"gitlab-ci:pipeline:test:job-deps:test\"" ];
cache = [
{
cache = [{
name = "some";
paths = [ "this" ];
}{
key = "test";
paths = [ ".nix-cache/" ];
}
];
variables."NIX_CI_CACHE_STRATEGY" = "runner";
}];
variables = {
NIX_CI_CACHE_STRATEGY = "runner";
BASH = toString pkgs.bash;
TEST = "work";
};
};
actual = mkJobPatched {
key = "test";
pipelineName = "test";
job = {};
job = {
cache = {
name = "some";
paths = [ "this" ];
};
variables = {
BASH = toString pkgs.bash;
TEST = "work";
};
};
nixConfig = {
enable = true;
enableRunnerCache = true;
@ -129,7 +178,7 @@
# sh
''
set -euo pipefail
${ntlib.helpers.path [pkgs.jq pkgs.gnugrep pkgs.coreutils]}
${ntlib.helpers.path (with pkgs; [jq gnugrep coreutils])}
echo "two keys, one json one pretty"
jq 'keys | length == 2' "${pipeline}" | grep -q true
echo "key[0] is exactly 'gitlab-ci:pipeline:test'"
@ -145,20 +194,107 @@
'';
}
{
name = "handle store paths in variables";
name = "handle store paths in variables without nix config";
expected = {
stages = [ "test" ];
test.stage = "test";
variables = {
EXAMPLE = "empty";
CURL = toString pkgs.curl;
};
actual =
(mkPipeline {
test = {
stage = "test";
before_script = [ "./init" ];
script = [ "echo Hello World!" ];
after_script = [ "./clean" ];
cache = {
key = "simple";
paths = [ "~/random/" ];
};
variables = {
SAMPLE = "working";
HELLO = toString pkgs.hello;
};
};
};
actual = (mkPipeline {
name = "test";
nixConfig.enable = false;
pipeline = {
stages = [ "test" ];
variables = {
EXAMPLE = "empty";
CURL = toString pkgs.curl;
};
jobs.test = {
stage = "test";
variables."TEST" = "${pkgs.hello}";
before_script = [ "./init" ];
script = [ "echo Hello World!" ];
after_script = [ "./clean" ];
cache = {
key = "simple";
paths = [ "~/random/" ];
};
variables = {
SAMPLE = "working";
HELLO = toString pkgs.hello;
};
};
};
}).finalConfig;
}
{
name = "handle store paths in variables with nix config";
expected = {
stages = [ "test" ];
variables = {
EXAMPLE = "empty";
CURL = toString pkgs.curl;
};
test = {
stage = "test";
before_script = [ "source setup_nix_ci \"gitlab-ci:pipeline:test:job-deps:test\"" "./init" ];
script = [ "echo Hello World!" ];
after_script = [ "./clean" "finalize_nix_ci" ];
cache = [{
key = "simple";
paths = [ "~/random/" ];
}{
key = "random";
paths = [ ".nix-cache/" ];
}];
variables = {
SAMPLE = "working";
HELLO = toString pkgs.hello;
NIX_CI_CACHE_STRATEGY = "runner";
};
};
};
actual = (mkPipeline {
name = "test";
nixConfig = {
enable = true;
enableRunnerCache = true;
runnerCacheKey = "random";
};
pipeline = {
stages = [ "test" ];
variables = {
EXAMPLE = "empty";
CURL = toString pkgs.curl;
};
jobs.test = {
stage = "test";
before_script = [ "./init" ];
script = [ "echo Hello World!" ];
after_script = [ "./clean" ];
cache = {
key = "simple";
paths = [ "~/random/" ];
};
variables = {
SAMPLE = "working";
HELLO = toString pkgs.hello;
};
};
};
}).finalConfig;