aboutsummaryrefslogtreecommitdiffhomepage
path: root/infra/travis/travis_build.py
diff options
context:
space:
mode:
authorGravatar jonathanmetzman <31354670+jonathanmetzman@users.noreply.github.com>2019-05-15 11:01:53 -0700
committerGravatar GitHub <noreply@github.com>2019-05-15 11:01:53 -0700
commit898fc435c6c090bde214e75bed62464246b9cd2b (patch)
treeef60b55c51a3eb90d7582e84ba514b88743689c7 /infra/travis/travis_build.py
parent95dd538c60703b0d90f7ad33fe63c22b50fd68f7 (diff)
[travis] Use job matrix to split up builds to avoid timeout (#2423)
Diffstat (limited to 'infra/travis/travis_build.py')
-rwxr-xr-xinfra/travis/travis_build.py56
1 files changed, 31 insertions, 25 deletions
diff --git a/infra/travis/travis_build.py b/infra/travis/travis_build.py
index eb190ea6..32b2358f 100755
--- a/infra/travis/travis_build.py
+++ b/infra/travis/travis_build.py
@@ -23,7 +23,8 @@ import re
import subprocess
import yaml
-DEFAULT_FUZZING_ENGINES = ['afl', 'libfuzzer']
+DEFAULT_ARCHITECTURES = ['x86_64']
+DEFAULT_ENGINES = ['afl', 'libfuzzer']
DEFAULT_SANITIZERS = ['address', 'undefined']
@@ -53,57 +54,62 @@ def execute_helper_command(helper_command):
subprocess.check_call(command)
-def build_fuzzers(project, sanitizer, engine, architecture='x86_64'):
+def build_fuzzers(project, engine, sanitizer, architecture):
"""Execute helper.py's build_fuzzers command on |project|. Build the fuzzers
- with |sanitizer| and |engine|."""
+ with |engine| and |sanitizer| for |architecture|."""
execute_helper_command([
'build_fuzzers', project, '--engine', engine, '--sanitizer', sanitizer,
'--architecture', architecture
])
-def check_build(project, sanitizer, engine, architecture='x86_64'):
+def check_build(project, engine, sanitizer, architecture):
"""Execute helper.py's check_build command on |project|, assuming it was most
- recently built with |sanitizer| and |engine|."""
+ recently built with |engine| and |sanitizer| for |architecture|."""
execute_helper_command([
'check_build', project, '--engine', engine, '--sanitizer', sanitizer,
'--architecture', architecture
])
+def should_build(project_yaml):
+ """Is the build specified by travis enabled in the |project_yaml|?"""
+ def is_enabled(env_var, yaml_name, defaults):
+ """Is the value of |env_var| enabled in |project_yaml| (in the |yaml_name|
+ section)? Uses |defaults| if |yaml_name| section is unspecified."""
+ return os.getenv(env_var) in project_yaml.get(yaml_name, defaults)
+
+ return (is_enabled('TRAVIS_ENGINE', 'fuzzing_engines', DEFAULT_ENGINES) and
+ is_enabled('TRAVIS_SANITIZER', 'sanitizers', DEFAULT_SANITIZERS) and
+ is_enabled(
+ 'TRAVIS_ARCHITECTURE', 'architectures', DEFAULT_ARCHITECTURES))
+
def build_project(project):
- """Do all build of |project|."""
- print('Building project', project)
+ """Do the build of |project| that is specified by the TRAVIS_* environment
+ variables (TRAVIS_SANITIZER, TRAVIS_ENGINE, and TRAVIS_ARCHITECTURE)."""
root = get_oss_fuzz_root()
project_yaml_path = os.path.join(root, 'projects', project, 'project.yaml')
with open(project_yaml_path) as fp:
project_yaml = yaml.safe_load(fp)
if project_yaml.get('disabled', False):
+ print('Project {0} is disabled, not building.'.format(project))
return
- fuzzing_engines = project_yaml.get('fuzzing_engines', DEFAULT_FUZZING_ENGINES)
- if 'none' in fuzzing_engines:
- # no engine builds always use ASAN.
- build_fuzzers(project, 'address', 'none')
- return
+ engine = os.getenv('TRAVIS_ENGINE')
+ sanitizer = os.getenv('TRAVIS_SANITIZER')
+ architecture = os.getenv('TRAVIS_ARCHITECTURE')
- if 'afl' in fuzzing_engines:
- # AFL builds always use ASAN.
- build_fuzzers(project, 'address', 'afl')
- check_build(project, 'address', 'afl')
+ if not should_build(project_yaml):
+ print(('Specified build: engine: {0}, sanitizer: {1}, architecture: {2} '
+ 'not enabled for this project: {3}. Not building.').format(
+ engine, sanitizer, architecture, project))
- if 'libfuzzer' not in fuzzing_engines:
return
- for sanitizer in project_yaml.get('sanitizers', DEFAULT_SANITIZERS):
- build_fuzzers(project, sanitizer, 'libfuzzer')
- check_build(project, sanitizer, 'libfuzzer')
-
- if 'i386' in project_yaml.get('architectures', []):
- # i386 builds always use libFuzzer and ASAN.
- build_fuzzers(project, 'address', 'libfuzzer', 'i386')
- check_build(project, 'address', 'libfuzzer', 'i386')
+ print('Building project', project)
+ build_fuzzers(project, engine, sanitizer, architecture)
+ check_build(project, engine, sanitizer, architecture)
def main():