Skip to content

Commit eb1d610

Browse files
MagicRBMic92
authored andcommitted
Move derivation listing to BuildTrigger to avoid polluting logs
Signed-off-by: magic_rb <[email protected]>
1 parent 76fc856 commit eb1d610

File tree

1 file changed

+72
-41
lines changed

1 file changed

+72
-41
lines changed

buildbot_nix/__init__.py

Lines changed: 72 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@
1717
from buildbot.plugins import schedulers, steps, util, worker
1818
from buildbot.process import buildstep, logobserver, remotecommand
1919
from buildbot.process.buildstep import SUCCESS
20+
21+
# from buildbot.db.buildrequests import BuildRequestModel
22+
# from buildbot.db.builds import BuildModel
23+
from buildbot.process.log import Log
2024
from buildbot.process.project import Project
2125
from buildbot.process.properties import Properties
2226
from buildbot.process.results import ALL_RESULTS, statusToString, worst_status
@@ -27,10 +31,8 @@
2731
from buildbot.www.authz import Authz
2832
from buildbot.www.authz.endpointmatchers import EndpointMatcherBase, Match
2933

30-
# from buildbot.db.buildrequests import BuildRequestModel
31-
# from buildbot.db.builds import BuildModel
3234
if TYPE_CHECKING:
33-
from buildbot.process.log import Log, StreamLog
35+
from buildbot.process.log import StreamLog
3436
from buildbot.www.auth import AuthBase
3537

3638
from pydantic import TypeAdapter
@@ -67,7 +69,7 @@ class BuildbotNixError(Exception):
6769
pass
6870

6971

70-
class BuildTrigger(steps.BuildStep):
72+
class BuildTrigger(buildstep.ShellMixin, steps.BuildStep):
7173
"""Dynamic trigger that creates a build for every attribute."""
7274

7375
project: GitProject
@@ -118,14 +120,12 @@ def __init__(
118120
successful_jobs: list[NixEvalJobSuccess],
119121
failed_jobs: list[NixEvalJobError],
120122
report_status: bool,
121-
all_derivations: dict[str, NixDerivation],
122123
**kwargs: Any,
123124
) -> None:
124125
self.project = project
125126
self.successful_jobs = successful_jobs
126127
self.failed_jobs = failed_jobs
127128
self.report_status = report_status
128-
self.all_derivations = all_derivations
129129
self.config = None
130130
self.builds_scheduler = builds_scheduler
131131
self.skipped_builds_scheduler = skipped_builds_scheduler
@@ -170,7 +170,10 @@ def get_scheduler_by_name(self, name: str) -> BaseScheduler:
170170

171171
@staticmethod
172172
def set_common_properties(
173-
props: Properties, source: str, job: NixEvalJob, report_status: bool,
173+
props: Properties,
174+
source: str,
175+
job: NixEvalJob,
176+
report_status: bool,
174177
) -> Properties:
175178
props.setProperty("virtual_builder_name", f".#checks.{job.attr}", source)
176179
props.setProperty("status_name", f"nix-build .#checks.{job.attr}", source)
@@ -180,41 +183,59 @@ def set_common_properties(
180183

181184
return props
182185

183-
def schedule_eval_failure(self, job: NixEvalJobError, report_status: bool) -> tuple[str, Properties]:
186+
def schedule_eval_failure(
187+
self, job: NixEvalJobError, report_status: bool
188+
) -> tuple[str, Properties]:
184189
source = "nix-eval-nix"
185190

186-
props = BuildTrigger.set_common_properties(Properties(), source, job, report_status)
191+
props = BuildTrigger.set_common_properties(
192+
Properties(), source, job, report_status
193+
)
187194
props.setProperty("error", job.error, source)
188195

189196
return (self.failed_eval_scheduler, props)
190197

191-
def schedule_cached_failure(self, job: NixEvalJobSuccess, report_status: bool) -> tuple[str, Properties]:
198+
def schedule_cached_failure(
199+
self, job: NixEvalJobSuccess, report_status: bool
200+
) -> tuple[str, Properties]:
192201
source = "nix-eval-nix"
193202

194-
props = BuildTrigger.set_common_properties(Properties(), source, job, report_status)
203+
props = BuildTrigger.set_common_properties(
204+
Properties(), source, job, report_status
205+
)
195206

196207
return (self.cached_failure_scheduler, props)
197208

198209
def schedule_dependency_failed(
199-
self, job: NixEvalJobSuccess, dependency: NixEvalJobSuccess, report_status: bool,
210+
self,
211+
job: NixEvalJobSuccess,
212+
dependency: NixEvalJobSuccess,
213+
report_status: bool,
200214
) -> tuple[str, Properties]:
201215
source = "nix-eval-nix"
202216

203-
props = BuildTrigger.set_common_properties(Properties(), source, job, report_status)
217+
props = BuildTrigger.set_common_properties(
218+
Properties(), source, job, report_status
219+
)
204220
props.setProperty("dependency.attr", dependency.attr, source)
205221

206222
return (self.dependency_failed_scheduler, props)
207223

208224
def schedule_success(
209-
self, build_props: Properties, job: NixEvalJobSuccess, report_status: bool,
225+
self,
226+
build_props: Properties,
227+
job: NixEvalJobSuccess,
228+
report_status: bool,
210229
) -> tuple[str, Properties]:
211230
source = "nix-eval-nix"
212231

213232
drv_path = job.drvPath
214233
system = job.system
215234
out_path = job.outputs["out"] or None
216235

217-
props = BuildTrigger.set_common_properties(Properties(), source, job, report_status)
236+
props = BuildTrigger.set_common_properties(
237+
Properties(), source, job, report_status
238+
)
218239
props.setProperty("system", system, source)
219240
props.setProperty("drv_path", drv_path, source)
220241
props.setProperty("out_path", out_path, source)
@@ -350,26 +371,53 @@ def get_failed_dependents(
350371

351372
return removed
352373

374+
@defer.inlineCallbacks
375+
def get_all_derivations(
376+
self, log: Log
377+
) -> Generator[Any, Any, dict[str, NixDerivation]]:
378+
log.addStdout("getting derivation infos\n")
379+
cmd = yield self.makeRemoteShellCommand(
380+
stdioLogName=None,
381+
collectStdout=True,
382+
command=(
383+
["nix", "derivation", "show", "--recursive"]
384+
+ [job.drvPath for job in self.successful_jobs]
385+
),
386+
)
387+
yield self.runCommand(cmd)
388+
log.addStdout("done\n")
389+
390+
try:
391+
return TypeAdapter(dict[str, NixDerivation]).validate_json(cmd.stdout)
392+
except json.JSONDecodeError as e:
393+
msg = f"Failed to parse `nix derivation show` output for {cmd.command}"
394+
raise BuildbotNixError(msg) from e
395+
353396
@defer.inlineCallbacks
354397
def run(self) -> Generator[Any, Any, None]:
355398
self.running = True
356399
build_props = self.build.getProperties()
357400
ss_for_trigger = self.prepare_sourcestamp_list_for_trigger()
358401
scheduler_log: Log = yield self.addLog("scheduler")
359402

403+
all_derivations = yield self.get_all_derivations(scheduler_log)
404+
360405
# inject failed buildsteps for any failed eval jobs we got
361406
overall_result = SUCCESS if not self.failed_jobs else util.FAILURE
362407
if self.failed_jobs:
363408
scheduler_log.addStdout("The following jobs failed to evaluate:\n")
364409
for failed_job in self.failed_jobs:
365410
scheduler_log.addStdout(f"\t- {failed_job.attr} failed eval\n")
366-
brids, _ = yield self.schedule(ss_for_trigger, *self.schedule_eval_failure(failed_job, self.report_status))
411+
brids, _ = yield self.schedule(
412+
ss_for_trigger,
413+
*self.schedule_eval_failure(failed_job, self.report_status),
414+
)
367415
self.brids.extend(brids)
368416

369417
# get all input derivations for every job as a dictionary
370418
derivations_inputs: dict[str, set[str]] = {
371419
derivation: set(info.inputDrvs.keys())
372-
for derivation, info in self.all_derivations.items()
420+
for derivation, info in all_derivations.items()
373421
}
374422

375423
# get all job derivations
@@ -407,7 +455,8 @@ def run(self) -> Generator[Any, Any, None]:
407455
build_schedule_order.remove(build)
408456

409457
brids, results_deferred = yield self.schedule(
410-
ss_for_trigger, *self.schedule_cached_failure(build, self.report_status)
458+
ss_for_trigger,
459+
*self.schedule_cached_failure(build, self.report_status),
411460
)
412461
scheduled.append(
413462
BuildTrigger.ScheduledJob(build, brids, results_deferred)
@@ -434,7 +483,8 @@ def run(self) -> Generator[Any, Any, None]:
434483
for job in schedule_now:
435484
scheduler_log.addStdout(f"\t- {job.attr}\n")
436485
brids, results_deferred = yield self.schedule(
437-
ss_for_trigger, *self.schedule_success(build_props, job, self.report_status)
486+
ss_for_trigger,
487+
*self.schedule_success(build_props, job, self.report_status),
438488
)
439489

440490
scheduled.append(
@@ -472,7 +522,9 @@ def run(self) -> Generator[Any, Any, None]:
472522
job, build_schedule_order, job_closures
473523
)
474524
for removed_job in removed:
475-
scheduler, props = self.schedule_dependency_failed(removed_job, job, self.report_status)
525+
scheduler, props = self.schedule_dependency_failed(
526+
removed_job, job, self.report_status
527+
)
476528
brids, results_deferred = yield self.schedule(
477529
ss_for_trigger, scheduler, props
478530
)
@@ -577,26 +629,6 @@ def run(self) -> Generator[Any, object, Any]:
577629

578630
self.number_of_jobs = len(successful_jobs)
579631

580-
drv_show_log: Log = yield self.getLog("stdio")
581-
drv_show_log.addStdout("getting derivation infos\n")
582-
cmd = yield self.makeRemoteShellCommand(
583-
stdioLogName=None,
584-
collectStdout=True,
585-
command=(
586-
["nix", "derivation", "show", "--recursive"]
587-
+ [job.drvPath for job in successful_jobs]
588-
),
589-
)
590-
yield self.runCommand(cmd)
591-
drv_show_log.addStdout("done\n")
592-
try:
593-
all_derivations: dict[str, NixDerivation] = TypeAdapter(
594-
dict[str, NixDerivation]
595-
).validate_json(cmd.stdout)
596-
except json.JSONDecodeError as e:
597-
msg = f"Failed to parse `nix derivation show` output for {cmd.command}"
598-
raise BuildbotNixError(msg) from e
599-
600632
self.build.addStepsAfterCurrentStep(
601633
[
602634
BuildTrigger(
@@ -613,7 +645,6 @@ def run(self) -> Generator[Any, object, Any]:
613645
self.job_report_limit is None
614646
or self.number_of_jobs <= self.job_report_limit
615647
),
616-
all_derivations=all_derivations,
617648
),
618649
]
619650
+ (

0 commit comments

Comments
 (0)