@@ -385,6 +385,10 @@ def _make_image_name_architecture_specific(image_name, architecture):
385
385
return f'{ image_name } -{ architecture .lower ()} '
386
386
387
387
388
+ def get_unique_build_step_image_id ():
389
+ return uuid .uuid4 ()
390
+
391
+
388
392
def get_docker_build_step (image_names ,
389
393
directory ,
390
394
use_buildkit_cache = False ,
@@ -410,13 +414,14 @@ def get_docker_build_step(image_names,
410
414
if cache_image :
411
415
args .extend (['--build-arg' , f'CACHE_IMAGE={ cache_image } ' ])
412
416
413
- for image_name in image_names :
417
+ for image_name in sorted ( image_names ) :
414
418
args .extend (['--tag' , image_name ])
415
419
416
420
step = {
417
421
'name' : DOCKER_TOOL_IMAGE ,
418
422
'args' : args ,
419
423
'dir' : directory ,
424
+ 'id' : f'build-{ get_unique_build_step_image_id ()} ' ,
420
425
}
421
426
# Handle buildkit args
422
427
# Note that we mutate "args" after making it a value in step.
@@ -462,10 +467,11 @@ def get_project_image_steps( # pylint: disable=too-many-arguments
462
467
steps .extend (get_pull_test_images_steps (config .test_image_suffix ))
463
468
src_root = 'oss-fuzz' if not experiment else '.'
464
469
465
- docker_build_step = get_docker_build_step ([image ],
466
- os .path .join ('projects' , name ),
467
- src_root = src_root ,
468
- cache_image = cache_image )
470
+ docker_build_step = get_docker_build_step (
471
+ [image , _get_unsafe_name (name )],
472
+ os .path .join ('projects' , name ),
473
+ src_root = src_root ,
474
+ cache_image = cache_image )
469
475
steps .append (docker_build_step )
470
476
if srcmap :
471
477
srcmap_step_id = get_srcmap_step_id ()
@@ -477,7 +483,7 @@ def get_project_image_steps( # pylint: disable=too-many-arguments
477
483
],
478
484
'env' : [
479
485
'OSSFUZZ_REVISION=$REVISION_ID' ,
480
- 'FUZZING_LANGUAGE=%s' % language ,
486
+ f 'FUZZING_LANGUAGE={ language } ' ,
481
487
],
482
488
'id' : srcmap_step_id
483
489
}])
@@ -498,15 +504,30 @@ def get_project_image_steps( # pylint: disable=too-many-arguments
498
504
'args' : ['buildx' , 'use' , builder_name ]
499
505
},
500
506
])
501
- docker_build_arm_step = get_docker_build_step ([ image ],
502
- os . path . join (
503
- 'projects' , name ),
504
- architecture = _ARM64 )
507
+ docker_build_arm_step = get_docker_build_step (
508
+ [ image , _get_unsafe_name ( name )],
509
+ os . path . join ( 'projects' , name ),
510
+ architecture = _ARM64 )
505
511
steps .append (docker_build_arm_step )
506
512
513
+ if (config .build_type == 'fuzzing' and language in ('c' , 'c++' )):
514
+ # Push so that historical bugs are reproducible.
515
+ push_step = {
516
+ 'name' : 'gcr.io/cloud-builders/docker' ,
517
+ 'args' : ['push' , _get_unsafe_name (name )],
518
+ 'id' : 'push-image' ,
519
+ 'waitFor' : [docker_build_step ['id' ]],
520
+ 'allowFailure' : True
521
+ }
522
+ steps .append (push_step )
523
+
507
524
return steps
508
525
509
526
527
+ def _get_unsafe_name (name ):
528
+ return f'us-central1-docker.pkg.dev/oss-fuzz/unsafe/{ name } '
529
+
530
+
510
531
def get_logs_url (build_id ):
511
532
"""Returns url that displays the build logs."""
512
533
return (
0 commit comments