diff --git a/buildbot_nix/__init__.py b/buildbot_nix/__init__.py index d86f31b..63a3748 100644 --- a/buildbot_nix/__init__.py +++ b/buildbot_nix/__init__.py @@ -8,6 +8,7 @@ from collections.abc import Generator from dataclasses import dataclass, field from pathlib import Path from typing import TYPE_CHECKING, Any +import tempfile import buildbot from buildbot.configurators import ConfiguratorBase @@ -453,13 +454,14 @@ 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_filename: str) -> NixEvalCommand: actual_command = [] if flake: actual_command += ["--flake", f".#{FLAKE_TARGET_ATTRIBUTE_FOR_JOBS}"] else: - actual_command += ["--expr", "import ./.ci/buildbot.nix"] + actual_command += ["--expr", + f"import ./.ci/buildbot.nix {{ incoming_ref_data = builtins.fromJSON (builtins.readFile {incoming_ref_filename}); }}"] return NixEvalCommand( env={}, @@ -514,7 +516,8 @@ class NixConfigure(buildstep.CommandMixin, steps.BuildStep): make_job_evaluator( "evaluate `.ci/buildbot.nix` jobs", self.evaluator_settings, - False + False, + "build/incoming-ref.json" ) ] ) @@ -527,7 +530,8 @@ class NixConfigure(buildstep.CommandMixin, steps.BuildStep): make_job_evaluator( "evaluate `flake.nix` jobs", self.evaluator_settings, - True + True, + "build/incoming-ref.json" ) ] ) @@ -616,6 +620,11 @@ def nix_eval_config( lock=eval_lock ) + # This information can be passed at job evaluation time + # to skip some jobs, e.g. expensive jobs, etc. + # Transfer incoming ref data to the target. + factory.addStep(steps.JSONPropertiesDownload(workerdest="incoming-ref.json")) + # NixConfigure will choose # how to add a NixEvalCommand job # based on whether there's a flake.nix or