diff --git a/buildbot_nix/__init__.py b/buildbot_nix/__init__.py index d86f31b..ab16883 100644 --- a/buildbot_nix/__init__.py +++ b/buildbot_nix/__init__.py @@ -453,13 +453,21 @@ class NixEvalCommand(buildstep.ShellMixin, steps.BuildStep): return result -def make_job_evaluator(name: str, settings: EvaluatorSettings, flake: bool) -> NixEvalCommand: +def make_job_evaluator(name: str, settings: EvaluatorSettings, flake: bool, incoming_ref_data: dict[str, Any]) -> NixEvalCommand: actual_command = [] + try: + eval_parameter_json_repr = json.dumps(incoming_ref_data) + except ValueError as e: + msg = f"Failed to serialize incoming ref data for {name}" + raise BuildbotNixError(msg) from e + if flake: actual_command += ["--flake", f".#{FLAKE_TARGET_ATTRIBUTE_FOR_JOBS}"] else: - actual_command += ["--expr", "import ./.ci/buildbot.nix"] + # TODO: escape for Nix the JSON… + actual_command += ["--expr", + f"import ./.ci/buildbot.nix {{ incoming_ref_data = ''{eval_parameter_json_repr}''; }}"] return NixEvalCommand( env={}, @@ -504,6 +512,14 @@ class NixConfigure(buildstep.CommandMixin, steps.BuildStep): except Exception: configure_log: Log = yield self.addLog("stdio") + # This information can be passed at job evaluation time + # to skip some jobs, e.g. expensive jobs, etc. + incoming_ref_data = { + # TODO: please just denormalize it properly. + 'event': { + key: value for key, (value, _) in self.getProperties().asDict() if key.startswith('event.') + } + } # Takes precedence. configure_log.addStdout("checking if there's a .ci/buildbot.nix...\n") ci_buildbot_defn_exists = yield self.pathExists('build/.ci/buildbot.nix') @@ -514,7 +530,8 @@ class NixConfigure(buildstep.CommandMixin, steps.BuildStep): make_job_evaluator( "evaluate `.ci/buildbot.nix` jobs", self.evaluator_settings, - False + False, + incoming_ref_data ) ] ) @@ -527,7 +544,8 @@ class NixConfigure(buildstep.CommandMixin, steps.BuildStep): make_job_evaluator( "evaluate `flake.nix` jobs", self.evaluator_settings, - True + True, + incoming_ref_data ) ] )