[CIFuzz] Fix build uploading. (#6096)

Previously, the downloaded build was uploaded instead of the new build.
This regression was introduced when the big workspace change was made.
Also, add more logging.
This commit is contained in:
jonathanmetzman 2021-07-22 12:52:07 -07:00 committed by GitHub
parent 24eb7e6668
commit c67d5b8626
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 30 additions and 12 deletions

View File

@ -109,8 +109,10 @@ class ClusterFuzzLite(BaseClusterFuzzDeployment):
build_name = self._get_build_name()
try:
logging.info('Downloading latest build.')
if self.filestore.download_latest_build(build_name,
self.workspace.clusterfuzz_build):
logging.info('Done downloading latest build.')
return self.workspace.clusterfuzz_build
except Exception as err: # pylint: disable=broad-except
logging.error('Could not download latest build because of: %s', err)
@ -119,11 +121,12 @@ class ClusterFuzzLite(BaseClusterFuzzDeployment):
def download_corpus(self, target_name):
corpus_dir = self.make_empty_corpus_dir(target_name)
logging.debug('ClusterFuzzLite: downloading corpus for %s to %s.',
target_name, corpus_dir)
logging.info('Downloading corpus for %s to %s.', target_name, corpus_dir)
corpus_name = self._get_corpus_name(target_name)
try:
self.filestore.download_corpus(corpus_name, corpus_dir)
logging.info('Done downloading corpus. Contains %d elements.',
len(os.listdir(corpus_dir)))
except Exception as err: # pylint: disable=broad-except
logging.error('Failed to download corpus for target: %s. Error: %s',
target_name, str(err))
@ -141,38 +144,42 @@ class ClusterFuzzLite(BaseClusterFuzzDeployment):
return 'crashes'
def upload_corpus(self, target_name):
"""Upload the corpus produced by |target_name| in |corpus_dir|."""
"""Upload the corpus produced by |target_name|."""
corpus_dir = self.get_target_corpus_dir(target_name)
logging.info('Uploading corpus in %s for %s.', corpus_dir, target_name)
name = self._get_corpus_name(target_name)
try:
self.filestore.upload_directory(name, corpus_dir)
logging.info('Done uploading corpus.')
except Exception as error: # pylint: disable=broad-except
logging.error('Failed to upload corpus for target: %s. Error: %s.',
target_name, error)
def upload_latest_build(self):
logging.info('Uploading latest build in %s.',
self.workspace.clusterfuzz_build)
"""Upload the build produced by CIFuzz as the latest build."""
logging.info('Uploading latest build in %s.', self.workspace.out)
build_name = self._get_build_name()
try:
return self.filestore.upload_directory(build_name,
self.workspace.clusterfuzz_build)
result = self.filestore.upload_directory(build_name, self.workspace.out)
logging.info('Done uploading latest build.')
return result
except Exception as error: # pylint: disable=broad-except
logging.error('Failed to upload latest build: %s. Error: %s',
self.workspace.clusterfuzz_build, error)
self.workspace.out, error)
def upload_crashes(self):
"""Uploads crashes."""
if not os.listdir(self.workspace.artifacts):
logging.info('No crashes in %s. Not uploading.', self.workspace.artifacts)
return
crashes_artifact_name = self._get_crashes_artifact_name()
logging.info('Uploading crashes in %s', self.workspace.artifacts)
logging.info('Uploading crashes in %s.', self.workspace.artifacts)
try:
self.filestore.upload_directory(crashes_artifact_name,
self.workspace.artifacts)
logging.info('Done uploading crashes.')
except Exception as error: # pylint: disable=broad-except
logging.error('Failed to upload crashes. Error: %s', error)
@ -239,12 +246,14 @@ class OSSFuzz(BaseClusterFuzzDeployment):
if not latest_build_name:
return None
logging.info('Downloading latest build.')
oss_fuzz_build_url = utils.url_join(utils.GCS_BASE_URL,
self.CLUSTERFUZZ_BUILDS,
self.config.oss_fuzz_project_name,
latest_build_name)
if http_utils.download_and_unpack_zip(oss_fuzz_build_url,
self.workspace.clusterfuzz_build):
logging.info('Done downloading latest build.')
return self.workspace.clusterfuzz_build
return None

View File

@ -176,6 +176,14 @@ class ClusterFuzzLiteTest(fake_filesystem_unittest.TestCase):
build."""
self.assertIsNone(self.deployment.download_latest_build())
@mock.patch('filestore.github_actions.GithubActionsFilestore.'
'upload_directory')
def test_upload_latest_build(self, mocked_upload_directory):
"""Tests that upload_latest_build works as intended."""
self.deployment.upload_latest_build()
mocked_upload_directory.assert_called_with('build-address',
'/workspace/build-out')
class NoClusterFuzzDeploymentTest(fake_filesystem_unittest.TestCase):
"""Tests for NoClusterFuzzDeployment."""

View File

@ -75,7 +75,7 @@ class GithubActionsFilestore(filestore.BaseFilestore):
def _find_artifact(self, name):
"""Finds an artifact using the GitHub API and returns it."""
logging.debug('listing artifact')
logging.debug('Listing artifacts.')
artifacts = self._list_artifacts()
artifact = github_api.find_artifact(name, artifacts)
logging.debug('Artifact: %s.', artifact)

View File

@ -187,6 +187,7 @@ class FuzzTarget: # pylint: disable=too-many-instance-attributes
ReproduceError if we can't attempt to reproduce the crash.
"""
if not os.path.exists(target_path):
logging.info('Target: %s does not exist.', target_path)
raise ReproduceError(f'Target {target_path} not found.')
os.chmod(target_path, stat.S_IRWXO)
@ -278,7 +279,7 @@ class FuzzTarget: # pylint: disable=too-many-instance-attributes
logging.info('The crash is reproducible on previous build. '
'Code change (pr/commit) did not introduce crash.')
return False
logging.info('The crash doesn\'t reproduce on previous build. '
logging.info('The crash is not reproducible on previous build. '
'Code change (pr/commit) introduced crash.')
return True

View File

@ -195,7 +195,7 @@ class IsCrashReportableTest(fake_filesystem_unittest.TestCase):
self.test_target.out_dir = tmp_dir
self.assertTrue(self.test_target.is_crash_reportable(self.testcase_path))
mocked_info.assert_called_with(
'The crash doesn\'t reproduce on previous build. '
'The crash is not reproducible on previous build. '
'Code change (pr/commit) introduced crash.')
# yapf: disable