@@ -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,100 @@ 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 resolved = if let Some ( guard) = step_info. step . get_drv ( ) {
372+ let drv_ref = guard. as_ref ( ) . unwrap ( ) ;
373+ if let Some ( basic_drv) =
374+ StepInfo :: try_resolve ( self . store . store_dir ( ) , & self . db , drv_ref) . await
375+ {
376+ let resolved_path = self . store . write_derivation ( & basic_drv) . await ?;
377+ ( & resolved_path != drv) . then_some ( resolved_path)
378+ } else {
379+ None
380+ }
381+ } else {
382+ None
383+ } ;
384+
385+ let effective_drv = if let Some ( resolved_path) = resolved {
386+ tracing:: info!( "resolved CA derivation {drv} -> {resolved_path}" ) ;
387+
388+ // Finish original step as "resolved".
389+ let mut resolved_result = RemoteBuild :: new ( ) ;
390+ resolved_result. step_status = BuildStatus :: Resolved ;
391+ resolved_result. set_start_time_now ( ) ;
392+ resolved_result. set_stop_time_now ( ) ;
393+ resolved_result. log_file . clone_from ( & job. result . log_file ) ;
394+ finish_build_step (
395+ & self . db ,
396+ & self . store ,
397+ build_id,
398+ step_nr,
399+ & resolved_result,
400+ Some ( & machine. hostname ) ,
401+ None ,
402+ )
403+ . await ?;
404+
405+ // Create DB step for the resolved drv under the same build.
406+ let resolved_step_nr = {
407+ let mut tx = db. begin_transaction ( ) . await ?;
408+ let nr = tx
409+ . create_build_step (
410+ Some ( job. result . get_start_time_as_i32 ( ) ?) ,
411+ build_id,
412+ & self . store . print_store_path ( & resolved_path) ,
413+ step_info. step . get_system ( ) . as_deref ( ) ,
414+ machine. hostname . clone ( ) ,
415+ BuildStatus :: Busy ,
416+ None ,
417+ None ,
418+ vec ! [ ] ,
419+ )
420+ . await ?;
421+
422+ tx. set_resolved_to ( build_id, step_nr, build_id, nr) . await ?;
423+ tx. commit ( ) . await ?;
424+ nr
425+ } ;
426+ job. step_nr = resolved_step_nr;
427+ resolved_path
428+ } else {
429+ drv. to_owned ( )
430+ } ;
431+
371432 {
372433 let mut tx = db. begin_transaction ( ) . await ?;
373434 tx. notify_build_started ( build_id) . await ?;
374435 tx. commit ( ) . await ?;
375436 }
376437 tracing:: info!(
377- "Submitting build drv={drv } on machine={} hostname={} build_id={build_id} step_nr={step_nr }" ,
438+ "Submitting build drv={effective_drv } on machine={} hostname={} build_id={build_id} step_nr={}" ,
378439 machine. id,
379- machine. hostname
440+ machine. hostname,
441+ job. step_nr,
380442 ) ;
381443 self . db
382444 . get ( )
383445 . await ?
384446 . update_build_step ( db:: models:: UpdateBuildStep {
385447 build_id,
386- step_nr,
448+ step_nr : job . step_nr ,
387449 status : db:: models:: StepStatus :: Connecting ,
388450 } )
389451 . await ?;
390452 machine
391453 . build_drv (
392454 job,
455+ effective_drv,
393456 & build_options,
394457 // TODO: cleanup
395458 if self . config . use_presigned_uploads ( ) {
@@ -962,7 +1025,7 @@ impl State {
9621025 if r. atomic_state . tries . load ( Ordering :: Relaxed ) > 0 {
9631026 continue ;
9641027 }
965- let step_info = StepInfo :: new ( & self . store , & self . db , r. clone ( ) ) . await ;
1028+ let step_info = StepInfo :: new ( r. clone ( ) ) ;
9661029
9671030 new_queues
9681031 . entry ( system)
@@ -2090,7 +2153,7 @@ impl State {
20902153 continue ;
20912154 } ;
20922155
2093- let mut job = machine:: Job :: new ( build. id , drv. to_owned ( ) , None ) ;
2156+ let mut job = machine:: Job :: new ( build. id , drv. to_owned ( ) ) ;
20942157 job. result . set_start_and_stop ( now) ;
20952158 job. result . step_status = BuildStatus :: Unsupported ;
20962159 job. result . error_msg = Some ( format ! (
0 commit comments