os.makedirs(opts.get('docker_context_dir')) builder = DockerFBCodeBuilder(**opts) context_dir = builder.option('docker_context_dir') # Mark option "in-use" # The renderer may also populate some files into the context_dir. dockerfile = builder.render(get_steps_fn(builder)) with os.fdopen( os.open( os.path.join(context_dir, 'Dockerfile'), os.O_RDWR | os.O_CREAT | os.O_EXCL, # Do not overwrite existing files 0o644, ), 'w') as f: f.write(dockerfile) return context_dir if __name__ == '__main__': from utils import read_fbcode_builder_config, build_fbcode_builder_config # Load a spec from the current directory config = read_fbcode_builder_config('fbcode_builder_config.py') print( make_docker_context( build_fbcode_builder_config(config), config['github_project'], ))
"build/fbcode_builder subdir of a git repo" ) def persistent_temp_dir(repo_root): escaped = repo_root.replace("/", "sZs").replace("\\", "sZs").replace(":", "") return os.path.join(os.path.expandvars("$HOME"), ".fbcode_builder-" + escaped) if __name__ == "__main__": from utils import read_fbcode_builder_config, build_fbcode_builder_config repo_root = find_project_root() temp = persistent_temp_dir(repo_root) config = read_fbcode_builder_config("fbcode_builder_config.py") builder = ShellFBCodeBuilder(projects_dir=temp) if distutils.spawn.find_executable("ccache"): builder.add_option( "ccache_dir", os.environ.get("CCACHE_DIR", os.path.join(temp, ".ccache")) ) builder.add_option("prefix", os.path.join(temp, "installed")) builder.add_option("make_parallelism", 4) builder.add_option( "{project}:local_repo_dir".format(project=config["github_project"]), repo_root ) make_steps = build_fbcode_builder_config(config) steps = make_steps(builder) print(builder.render(steps))
raise RuntimeError( "I expected shell_builder.py to be in the " "build/fbcode_builder subdir of a git repo") def persistent_temp_dir(repo_root): escaped = repo_root.replace('/', 'sZs').replace('\\', 'sZs').replace(':', '') return os.path.join(os.path.expandvars("$HOME"), '.fbcode_builder-' + escaped) if __name__ == '__main__': from utils import read_fbcode_builder_config, build_fbcode_builder_config repo_root = find_project_root() temp = persistent_temp_dir(repo_root) config = read_fbcode_builder_config('fbcode_builder_config.py') builder = ShellFBCodeBuilder() builder.add_option('projects_dir', temp) if distutils.spawn.find_executable('ccache'): builder.add_option('ccache_dir', os.environ.get('CCACHE_DIR', os.path.join(temp, '.ccache'))) builder.add_option('prefix', os.path.join(temp, 'installed')) builder.add_option('make_parallelism', 4) builder.add_option( '{project}:local_repo_dir'.format(project=config['github_project']), repo_root) make_steps = build_fbcode_builder_config(config) steps = make_steps(builder) print(builder.render(steps))
def make_lego_jobs(args, project_dirs): ''' Compute the lego job specifications. Returns a tuple of (shipit_projects, job_specs) ''' install_dir = ShellQuoted( # BOX_DIR is our fbcode path. '"$BOX_DIR/opensource/fbcode_builder/facebook_ci"') # The following project-specific options may be overridden from the # command-line options. If they are not specified on the command line or # in the project configuration file, then the following defaults are used. project_option_defaults = { 'prefix': install_dir, 'make_parallelism': 8, 'projects_dir': install_dir, } # Process all of the project configs all_shipit_projects = set() children_jobs = [] for project in project_dirs: logging.debug('Processing %s', project) config_path = os.path.join(project, 'facebook_fbcode_builder_config.py') config = read_fbcode_builder_config(config_path) for opts_key, lego_type in LEGO_OPTS_MAP.items(): config_opts = config.get(opts_key) if not config_opts: continue # Construct the options for this project. # Use everything listed in config_opts, unless the value is None. project_opts = { opt_name: value for opt_name, value in config_opts.items() if value is not None } # Allow options specified on the command line to override the # config's legocastle_opts data. # For options that weren't provided in either place, use the default # value from project_option_defaults. for opt_name, default_value in project_option_defaults.items(): cli_value = getattr(args, opt_name) if cli_value is not None: project_opts[opt_name] = cli_value elif opt_name not in config_opts: project_opts[opt_name] = default_value # The shipit_project_dir option cannot be overridden on a per-project # basis. We emit this data in a single location that must be consisten # across all of the projects we are building. project_opts['shipit_project_dir'] = args.shipit_project_dir builder = LegocastleFBCodeBuilder(**project_opts) steps = build_fbcode_builder_config(config)(builder) lego_spec = make_lego_spec(builder, type=lego_type) shipit_projects, lego_spec['args']['steps'] = builder.render(steps) all_shipit_projects.update(shipit_projects) children_jobs.append(lego_spec) return all_shipit_projects, children_jobs
if opts.get('docker_context_dir') is None: opts['docker_context_dir'] = tempfile.mkdtemp(prefix='docker-context-') elif not os.path.exists(opts.get('docker_context_dir')): os.makedirs(opts.get('docker_context_dir')) builder = DockerFBCodeBuilder(**opts) context_dir = builder.option('docker_context_dir') # Mark option "in-use" # The renderer may also populate some files into the context_dir. dockerfile = builder.render(get_steps_fn(builder)) with os.fdopen(os.open( os.path.join(context_dir, 'Dockerfile'), os.O_RDWR | os.O_CREAT | os.O_EXCL, # Do not overwrite existing files 0o644, ), 'w') as f: f.write(dockerfile) return context_dir if __name__ == '__main__': from utils import read_fbcode_builder_config, build_fbcode_builder_config # Load a spec from the current directory config = read_fbcode_builder_config('fbcode_builder_config.py') print(make_docker_context( build_fbcode_builder_config(config), config['github_project'], ))