@@ -317,11 +317,7 @@ impl State {
317317 build. id
318318 } ;
319319
320- let mut job = machine:: Job :: new (
321- build_id,
322- drv. to_owned ( ) ,
323- step_info. resolved_drv_path . clone ( ) ,
324- ) ;
320+ let mut job = machine:: Job :: new ( build_id, drv. to_owned ( ) ) ;
325321 job. result . set_start_time_now ( ) ;
326322 if self . check_cached_failure ( step_info. step . clone ( ) ) . await {
327323 job. result . step_status = BuildStatus :: CachedFailure ;
@@ -363,33 +359,99 @@ impl State {
363359 . collect ( ) ,
364360 )
365361 . await ?;
362+
366363 tx. commit ( ) . await ?;
367364 step_nr
368365 } ;
369366 job. step_nr = step_nr;
370367
368+ // Try to resolve CA derivation inputs. If resolution yields a
369+ // different drv, mark this step as Resolved in the DB and create a new
370+ // step for the resolved drv that the builder will actually build.
371+ let effective_drv = if let Some ( guard) = step_info. step . get_drv ( ) {
372+ let drv_ref = guard. as_ref ( ) . unwrap ( ) ;
373+ match StepInfo :: try_resolve ( self . store . store_dir ( ) , & self . db , drv_ref) . await {
374+ Some ( basic_drv) => {
375+ let resolved_path = self . store . write_derivation ( & basic_drv) . await ?;
376+ if & resolved_path != drv {
377+ tracing:: info!( "resolved CA derivation {drv} -> {resolved_path}" ) ;
378+
379+ // Finish original step as "resolved".
380+ let mut resolved_result = RemoteBuild :: new ( ) ;
381+ resolved_result. step_status = BuildStatus :: Resolved ;
382+ resolved_result. set_start_time_now ( ) ;
383+ resolved_result. set_stop_time_now ( ) ;
384+ resolved_result. log_file . clone_from ( & job. result . log_file ) ;
385+ finish_build_step (
386+ & self . db ,
387+ & self . store ,
388+ build_id,
389+ step_nr,
390+ & resolved_result,
391+ Some ( & machine. hostname ) ,
392+ None ,
393+ )
394+ . await ?;
395+
396+ // Create DB step for the resolved drv under the same build.
397+ let resolved_step_nr = {
398+ let mut tx = db. begin_transaction ( ) . await ?;
399+ let nr = tx
400+ . create_build_step (
401+ Some ( job. result . get_start_time_as_i32 ( ) ?) ,
402+ build_id,
403+ & self . store . print_store_path ( & resolved_path) ,
404+ step_info. step . get_system ( ) . as_deref ( ) ,
405+ machine. hostname . clone ( ) ,
406+ BuildStatus :: Busy ,
407+ None ,
408+ None ,
409+ vec ! [ ] ,
410+ )
411+ . await ?;
412+
413+ // Link the original step to the resolved step.
414+ tx. set_resolved_to ( build_id, step_nr, build_id, nr) . await ?;
415+
416+ tx. commit ( ) . await ?;
417+ nr
418+ } ;
419+ job. step_nr = resolved_step_nr;
420+ resolved_path
421+ } else {
422+ drv. to_owned ( )
423+ }
424+ }
425+ None => drv. to_owned ( ) ,
426+ }
427+ } else {
428+ drv. to_owned ( )
429+ } ;
430+
371431 {
372432 let mut tx = db. begin_transaction ( ) . await ?;
373433 tx. notify_build_started ( build_id) . await ?;
374434 tx. commit ( ) . await ?;
375435 }
376436 tracing:: info!(
377- "Submitting build drv={drv } on machine={} hostname={} build_id={build_id} step_nr={step_nr }" ,
437+ "Submitting build drv={effective_drv } on machine={} hostname={} build_id={build_id} step_nr={}" ,
378438 machine. id,
379- machine. hostname
439+ machine. hostname,
440+ job. step_nr,
380441 ) ;
381442 self . db
382443 . get ( )
383444 . await ?
384445 . update_build_step ( db:: models:: UpdateBuildStep {
385446 build_id,
386- step_nr,
447+ step_nr : job . step_nr ,
387448 status : db:: models:: StepStatus :: Connecting ,
388449 } )
389450 . await ?;
390451 machine
391452 . build_drv (
392453 job,
454+ effective_drv,
393455 & build_options,
394456 // TODO: cleanup
395457 if self . config . use_presigned_uploads ( ) {
@@ -962,7 +1024,7 @@ impl State {
9621024 if r. atomic_state . tries . load ( Ordering :: Relaxed ) > 0 {
9631025 continue ;
9641026 }
965- let step_info = StepInfo :: new ( & self . store , & self . db , r. clone ( ) ) . await ;
1027+ let step_info = StepInfo :: new ( r. clone ( ) ) ;
9661028
9671029 new_queues
9681030 . entry ( system)
@@ -2090,7 +2152,7 @@ impl State {
20902152 continue ;
20912153 } ;
20922154
2093- let mut job = machine:: Job :: new ( build. id , drv. to_owned ( ) , None ) ;
2155+ let mut job = machine:: Job :: new ( build. id , drv. to_owned ( ) ) ;
20942156 job. result . set_start_and_stop ( now) ;
20952157 job. result . step_status = BuildStatus :: Unsupported ;
20962158 job. result . error_msg = Some ( format ! (
0 commit comments