Ejemplo n.º 1
0
        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'],
        ))
Ejemplo n.º 2
0
        "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))
Ejemplo n.º 4
0
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
Ejemplo n.º 5
0
def gcc_version():
    gcc_version = os.environ.get("GCC_VERSION")
    if not gcc_version:
        gcc_version = "5"
    return gcc_version


if __name__ == "__main__":
    from utils import read_fbcode_builder_config, build_fbcode_builder_config

    install_dir = install_dir()
    projects_dir = projects_dir()

    config_file = os.path.join(os.path.dirname(__file__),
                               "debian_system_fbcode_builder_config.py")
    config = read_fbcode_builder_config(config_file)
    builder = DebianSystemFBCodeBuilder()

    builder.add_option("projects_dir", projects_dir)
    if distutils.spawn.find_executable("ccache"):
        ccache_dir = ccache_dir()
        builder.add_option("ccache_dir", ccache_dir)
    # Option is required by fbcode_builder_spec
    builder.add_option("prefix", install_dir)
    builder.add_option("make_parallelism", 4)
    gcc_version = gcc_version()
    builder.add_option("gcc_version", gcc_version)
    make_steps = build_fbcode_builder_config(config)
    steps = make_steps(builder)
    print(builder.render(steps))