Skip to content

Commit a6d0c93

Browse files
Reapply "Save docker images for C/C++" (#12876) (#12937)
This reverts commit be6c929.
1 parent 14335c0 commit a6d0c93

7 files changed

+60
-22
lines changed

infra/build/functions/build_and_run_coverage_test.py

+3
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ class TestRequestCoverageBuilds(fake_filesystem_unittest.TestCase):
3939
def setUp(self):
4040
self.maxDiff = None # pylint: disable=invalid-name
4141
self.setUpPyfakefs()
42+
self.patcher = mock.patch('build_lib.get_unique_build_step_image_id',
43+
return_value='UNIQUE_ID')
44+
self.mock_function = self.patcher.start()
4245

4346
@mock.patch('build_lib.get_signed_url', return_value='test_url')
4447
@mock.patch('build_lib.download_corpora_steps',

infra/build/functions/build_lib.py

+31-10
Original file line numberDiff line numberDiff line change
@@ -385,6 +385,10 @@ def _make_image_name_architecture_specific(image_name, architecture):
385385
return f'{image_name}-{architecture.lower()}'
386386

387387

388+
def get_unique_build_step_image_id():
389+
return uuid.uuid4()
390+
391+
388392
def get_docker_build_step(image_names,
389393
directory,
390394
use_buildkit_cache=False,
@@ -410,13 +414,14 @@ def get_docker_build_step(image_names,
410414
if cache_image:
411415
args.extend(['--build-arg', f'CACHE_IMAGE={cache_image}'])
412416

413-
for image_name in image_names:
417+
for image_name in sorted(image_names):
414418
args.extend(['--tag', image_name])
415419

416420
step = {
417421
'name': DOCKER_TOOL_IMAGE,
418422
'args': args,
419423
'dir': directory,
424+
'id': f'build-{get_unique_build_step_image_id()}',
420425
}
421426
# Handle buildkit args
422427
# 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
462467
steps.extend(get_pull_test_images_steps(config.test_image_suffix))
463468
src_root = 'oss-fuzz' if not experiment else '.'
464469

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)
469475
steps.append(docker_build_step)
470476
if srcmap:
471477
srcmap_step_id = get_srcmap_step_id()
@@ -477,7 +483,7 @@ def get_project_image_steps( # pylint: disable=too-many-arguments
477483
],
478484
'env': [
479485
'OSSFUZZ_REVISION=$REVISION_ID',
480-
'FUZZING_LANGUAGE=%s' % language,
486+
f'FUZZING_LANGUAGE={language}',
481487
],
482488
'id': srcmap_step_id
483489
}])
@@ -498,15 +504,30 @@ def get_project_image_steps( # pylint: disable=too-many-arguments
498504
'args': ['buildx', 'use', builder_name]
499505
},
500506
])
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)
505511
steps.append(docker_build_arm_step)
506512

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+
507524
return steps
508525

509526

527+
def _get_unsafe_name(name):
528+
return f'us-central1-docker.pkg.dev/oss-fuzz/unsafe/{name}'
529+
530+
510531
def get_logs_url(build_id):
511532
"""Returns url that displays the build logs."""
512533
return (

infra/build/functions/build_project.py

+5-6
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,6 @@
1919
Usage: build_project.py <project_dir>
2020
"""
2121

22-
from __future__ import print_function
23-
2422
import argparse
2523
from dataclasses import dataclass
2624
import datetime
@@ -77,6 +75,7 @@ class Config:
7775
experiment: bool = False
7876
# TODO(ochang): This should be different per engine+sanitizer combination.
7977
upload_build_logs: str = None
78+
build_type: str = None
8079

8180

8281
WORKDIR_REGEX = re.compile(r'\s*WORKDIR\s*([^\s]+)')
@@ -476,7 +475,6 @@ def get_build_steps_for_project(project,
476475
upload_steps = get_upload_steps(project, build, timestamp,
477476
config.testing)
478477
build_steps.extend(upload_steps)
479-
480478
return build_steps
481479

482480

@@ -629,15 +627,16 @@ def get_args(description):
629627
return parser.parse_args()
630628

631629

632-
def create_config_from_commandline(args):
630+
def create_config(args, build_type):
633631
"""Create a Config object from parsed command line |args|."""
634632
upload = not args.experiment
635633
return Config(testing=args.testing,
636634
test_image_suffix=args.test_image_suffix,
637635
branch=args.branch,
638636
parallel=args.parallel,
639637
upload=upload,
640-
experiment=args.experiment)
638+
experiment=args.experiment,
639+
build_type=build_type)
641640

642641

643642
def build_script_main(script_description, get_build_steps_func, build_type):
@@ -650,7 +649,7 @@ def build_script_main(script_description, get_build_steps_func, build_type):
650649

651650
credentials = oauth2client.client.GoogleCredentials.get_application_default()
652651
error = False
653-
config = create_config_from_commandline(args)
652+
config = create_config(args, build_type)
654653
for project_name in args.projects:
655654
logging.info('Getting steps for: "%s".', project_name)
656655
try:

infra/build/functions/test_data/expected_build_steps.json

+8-2
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,12 @@
1414
"build",
1515
"--tag",
1616
"gcr.io/oss-fuzz/test-project",
17+
"--tag",
18+
"us-central1-docker.pkg.dev/oss-fuzz/unsafe/test-project",
1719
"."
1820
],
19-
"dir": "oss-fuzz/projects/test-project"
21+
"dir": "oss-fuzz/projects/test-project",
22+
"id": "build-UNIQUE_ID"
2023
},
2124
{
2225
"name": "gcr.io/oss-fuzz/test-project",
@@ -68,9 +71,12 @@
6871
"--load",
6972
"--tag",
7073
"gcr.io/oss-fuzz/test-project-aarch64",
74+
"--tag",
75+
"us-central1-docker.pkg.dev/oss-fuzz/unsafe/test-project-aarch64",
7176
"."
7277
],
73-
"dir": "oss-fuzz/projects/test-project"
78+
"dir": "oss-fuzz/projects/test-project",
79+
"id": "build-UNIQUE_ID"
7480
},
7581
{
7682
"name": "gcr.io/cloud-builders/docker",

infra/build/functions/test_data/expected_centipede_build_steps.json

+5-2
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,13 @@
1313
"args": [
1414
"build",
1515
"--tag",
16-
"gcr.io/oss-fuzz/test-project",
16+
"gcr.io/oss-fuzz/test-project",
17+
"--tag",
18+
"us-central1-docker.pkg.dev/oss-fuzz/unsafe/test-project",
1719
"."
1820
],
19-
"dir": "oss-fuzz/projects/test-project"
21+
"dir": "oss-fuzz/projects/test-project",
22+
"id": "build-UNIQUE_ID"
2023
},
2124
{
2225
"name": "gcr.io/oss-fuzz/test-project",

infra/build/functions/test_data/expected_coverage_build_steps.json

+4-1
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,12 @@
1414
"build",
1515
"--tag",
1616
"gcr.io/oss-fuzz/test-project",
17+
"--tag",
18+
"us-central1-docker.pkg.dev/oss-fuzz/unsafe/test-project",
1719
"."
1820
],
19-
"dir": "oss-fuzz/projects/test-project"
21+
"dir": "oss-fuzz/projects/test-project",
22+
"id": "build-UNIQUE_ID"
2023
},
2124
{
2225
"name": "gcr.io/oss-fuzz/test-project",

infra/build/functions/test_data/expected_trial_build_steps.json

+4-1
Original file line numberDiff line numberDiff line change
@@ -167,9 +167,12 @@
167167
"build",
168168
"--tag",
169169
"gcr.io/oss-fuzz/skcms",
170+
"--tag",
171+
"us-central1-docker.pkg.dev/oss-fuzz/unsafe/skcms",
170172
"."
171173
],
172-
"dir": "oss-fuzz/projects/skcms"
174+
"dir": "oss-fuzz/projects/skcms",
175+
"id": "build-UNIQUE_ID"
173176
},
174177
{
175178
"name": "gcr.io/oss-fuzz/skcms",

0 commit comments

Comments
 (0)