Exemple #1
0
def validate(windows_host, image_tag, nupkg_path):
    """ Spin up a fresh docker image, and make sure that the nupkg installs and runs """
    DOCKERFILE = r"""\
FROM  microsoft/windowsservercore:1803
SHELL ["powershell", "-command"]
ARG version=
ARG timestamp=
ARG repository=facebook/buck

# Install chocolatey
RUN Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))

RUN mkdir c:/choco_temp
WORKDIR c:/choco_temp
ADD {nupkg_filename} c:/choco_temp/{nupkg_filename}
RUN choco install -y -s '.;https://chocolatey.org/api/v2/' buck
RUN Write-Host "" -NoNewLine > .buckconfig
RUN buck --help
"""
    build_dir = os.path.dirname(nupkg_path)
    nupkg_filename = os.path.basename(nupkg_path)
    dockerfile_temp_path = os.path.join(build_dir, "Dockerfile")
    dockerfile = DOCKERFILE.format(nupkg_filename=nupkg_filename)

    with temp_file_with_contents(dockerfile_temp_path, dockerfile):
        docker(
            windows_host,
            ["build", "-m", "2g", "-t", image_tag + "-validate", build_dir],
        )
        docker(windows_host, ["rmi", image_tag + "-validate"])
Exemple #2
0
def validate(windows_host, image_tag, nupkg_path):
    """ Spin up a fresh docker image, and make sure that the nupkg installs and runs """
    DOCKERFILE = r"""\
FROM  microsoft/windowsservercore:1803
SHELL ["powershell", "-command"]
ARG version=
ARG timestamp=
ARG repository=facebook/buck

# Install chocolatey
RUN Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))

RUN mkdir c:/choco_temp
WORKDIR c:/choco_temp
ADD {nupkg_filename} c:/choco_temp/{nupkg_filename}
RUN choco install -y -s '.;https://chocolatey.org/api/v2/' buck
RUN Write-Host "" -NoNewLine > .buckconfig
RUN buck --help
"""
    build_dir = os.path.dirname(nupkg_path)
    nupkg_filename = os.path.basename(nupkg_path)
    dockerfile_temp_path = os.path.join(build_dir, "Dockerfile")
    dockerfile = DOCKERFILE.format(nupkg_filename=nupkg_filename)

    with temp_file_with_contents(dockerfile_temp_path, dockerfile):
        docker(
            windows_host,
            ["build", "-m", "2g", "-t", image_tag + "-validate", build_dir],
        )
        docker(windows_host, ["rmi", image_tag + "-validate"])
Exemple #3
0
def build_deb(repository, release, user, all_releases, linux_host, output_dir):
    """
    Builds a .deb package in docker, and copies it to the host.

    Args:
        repository: The github repository to use. username/repo
        release: The release object from github
        user: The github user information. Required for changelog information
        all_releases: All releases from github. Used for generating a changelog
        linux_host: If set, the docker host ot use that can run linux containers
                    If not None, this should be a format that would work with
                    docker -H
        output_dir: The directory to place artifacts in after the build

    Returns:
        The path to the artifact
    """

    release_version, release_timestamp = get_version_and_timestamp_from_release(release)
    release_datetime = dateutil.parser.parse(release["created_at"])
    image_tag = "buck:" + release_version
    deb_name = "buck.{}_all.deb".format(release_version)
    deb_path = os.path.join(output_dir, deb_name)
    logging.info("Building debian docker image...")

    # Move the in-repo changelog out of the way for the moment. We keep the file in
    # repo so that the build rules evaluate properly and don't complain about missing
    # srcs.
    changelog_path = os.path.join(
        "tools", "release", "platforms", "debian", "Changelog"
    )
    changelog = create_changelog(user, all_releases, release_datetime)
    with temp_move_file(changelog_path), temp_file_with_contents(
        changelog_path, changelog
    ):
        docker(
            linux_host,
            [
                "build",
                "-t",
                image_tag,
                "--build-arg",
                "version=" + release_version,
                "--build-arg",
                "timestamp=" + str(release_timestamp),
                "--build-arg",
                "repository=" + repository,
                "tools/release/platforms/debian",
            ],
        )

    logging.info("Copying deb out of docker container")
    copy_from_docker_linux(linux_host, image_tag, "/src/buck.deb", deb_path)

    logging.info("Validating that .deb installs...")
    validate(linux_host, image_tag, deb_path)

    logging.info("Built .deb file at {}".format(deb_path))
    return deb_path
Exemple #4
0
def build_deb(repository, release, user, all_releases, linux_host, output_dir):
    """
    Builds a .deb package in docker, and copies it to the host.

    Args:
        repository: The github repository to use. username/repo
        release: The release object from github
        user: The github user information. Required for changelog information
        all_releases: All releases from github. Used for generating a changelog
        linux_host: If set, the docker host ot use that can run linux containers
                    If not None, this should be a format that would work with
                    docker -H
        output_dir: The directory to place artifacts in after the build

    Returns:
        The path to the artifact
    """

    release_version, release_timestamp = get_version_and_timestamp_from_release(release)
    release_datetime = dateutil.parser.parse(release["created_at"])
    image_tag = "buck:" + release_version
    deb_name = "buck.{}_all.deb".format(release_version)
    deb_path = os.path.join(output_dir, deb_name)
    logging.info("Building debian docker image...")

    # Move the in-repo changelog out of the way for the moment. We keep the file in
    # repo so that the build rules evaluate properly and don't complain about missing
    # srcs.
    changelog_path = os.path.join(
        "tools", "release", "platforms", "debian", "Changelog"
    )
    changelog = create_changelog(user, all_releases, release_datetime)
    with temp_move_file(changelog_path), temp_file_with_contents(
        changelog_path, changelog
    ):
        docker(
            linux_host,
            [
                "build",
                "-t",
                image_tag,
                "--build-arg",
                "version=" + release_version,
                "--build-arg",
                "timestamp=" + str(release_timestamp),
                "--build-arg",
                "repository=" + repository,
                "tools/release/platforms/debian",
            ],
        )

    logging.info("Copying deb out of docker container")
    copy_from_docker_linux(linux_host, image_tag, "/src/buck.deb", deb_path)

    logging.info("Validating that .deb installs...")
    validate(linux_host, image_tag, deb_path)

    logging.info("Built .deb file at {}".format(deb_path))
    return deb_path
Exemple #5
0
def build_chocolatey(repository, release, windows_host, docker_memory,
                     docker_isolation, output_dir):
    """
    Builds a .nupkg package in docker, and copies it to the host.

    Args:
        repository: The github repository to use. username/repo
        release: The release object from github
        windows_host: If set, the docker host ot use that can run windows containers
                      If not None, this should be a format that would work with
                      docker -H
        output_dir: The directory to place artifacts in after the build

    Returns:
        The path to the artifact
    """
    release_version, release_timestamp = get_version_and_timestamp_from_release(
        release)
    image_tag = "buck:" + release_version
    nupkg_name = "buck.{}.nupkg".format(release_version)
    nupkg_path = os.path.join(output_dir, nupkg_name)

    # Get the changelog from github rather than locally
    changelog_path = os.path.join("tools", "release", "platforms",
                                  "chocolatey", "Changelog.md.new")
    changelog = release["body"].strip() or "Periodic release"

    with temp_file_with_contents(changelog_path, changelog):
        logging.info("Building windows docker image...")
        docker(
            windows_host,
            [
                "build",
                "--isolation=" + docker_isolation,
                "-m",
                docker_memory,  # Default memory is 1G
                "-t",
                image_tag,
                "--build-arg",
                "version=" + release_version,
                "--build-arg",
                "timestamp=" + str(release_timestamp),
                "--build-arg",
                "repository=" + repository,
                "tools/release/platforms/chocolatey",
            ],
        )

    logging.info("Copying nupkg out of docker container")
    copy_from_docker_windows(windows_host, image_tag, "/src/buck.nupkg",
                             nupkg_path)

    logging.info("Validating that .nupkg installs...")
    validate(windows_host, docker_memory, docker_isolation, image_tag,
             nupkg_path)

    logging.info("Built .nupkg file at {}".format(nupkg_path))
    return nupkg_path
Exemple #6
0
def validate_environment(args):
    """ Make sure we can build """

    validate_repo_upstream(args)
    if args.build_deb:
        ret = docker(
            args.docker_linux_host,
            ["info", "-f", "{{.OSType}}"],
            check=False,
            capture_output=True,
        )
        host = args.docker_linux_host or "localhost"
        if ret.returncode != 0:
            raise ReleaseException(
                "docker info on linux host {} failed. debs cannot be built", host
            )
        host_os = ret.stdout.decode("utf-8").strip()
        if host_os != "linux":
            raise ReleaseException(
                "docker info on host {} returned type '{}' not 'linux'. debs cannot be built",
                host,
                host_os,
            )
    if args.build_chocolatey:
        ret = docker(
            args.docker_windows_host,
            ["info", "-f", "{{.OSType}}"],
            check=False,
            capture_output=True,
        )
        host = args.docker_windows_host or "localhost"
        if ret.returncode != 0:
            raise ReleaseException(
                "docker info on windows host {} failed. chocolatey nupkgs cannot be built",
                host,
            )
        host_os = ret.stdout.decode("utf-8").strip()
        if host_os != "windows":
            raise ReleaseException(
                "docker info on host {} returned type '{}' not 'windows'. chocolatey nupkgs cannot be built",
                host,
                host_os,
            )
    if args.build_homebrew:
        if args.homebrew_dir:
            if not os.path.exists(args.homebrew_dir):
                raise ReleaseException(
                    "Specified homebrew path, {}, does not exist", args.homebrew_dir
                )
            brew_path = os.path.join(args.homebrew_dir, "bin", "brew")
            try:
                ret = run([brew_path, "--version"])
            except Exception:
                raise ReleaseException(
                    "{} --version failed. bottles cannot be created", brew_path
                )
Exemple #7
0
def validate_environment(args):
    """ Make sure we can build """

    validate_repo_upstream(args)
    if args.build_deb:
        ret = docker(
            args.docker_linux_host,
            ["info", "-f", "{{.OSType}}"],
            check=False,
            capture_output=True,
        )
        host = args.docker_linux_host or "localhost"
        if ret.returncode != 0:
            raise ReleaseException(
                "docker info on linux host {} failed. debs cannot be built",
                host)
        host_os = ret.stdout.decode("utf-8").strip()
        if host_os != "linux":
            raise ReleaseException(
                "docker info on host {} returned type '{}' not 'linux'. debs cannot be built",
                host,
                host_os,
            )
    if args.build_chocolatey:
        ret = docker(
            args.docker_windows_host,
            ["info", "-f", "{{.OSType}}"],
            check=False,
            capture_output=True,
        )
        host = args.docker_windows_host or "localhost"
        if ret.returncode != 0:
            raise ReleaseException(
                "docker info on windows host {} failed. chocolatey nupkgs cannot be built",
                host,
            )
        host_os = ret.stdout.decode("utf-8").strip()
        if host_os != "windows":
            raise ReleaseException(
                "docker info on host {} returned type '{}' not 'windows'. chocolatey nupkgs cannot be built",
                host,
                host_os,
            )
    if args.build_homebrew:
        if args.homebrew_dir:
            if not os.path.exists(args.homebrew_dir):
                raise ReleaseException(
                    "Specified homebrew path, {}, does not exist",
                    args.homebrew_dir)
            brew_path = os.path.join(args.homebrew_dir, "bin", "brew")
            try:
                ret = run([brew_path, "--version"])
            except Exception:
                raise ReleaseException(
                    "{} --version failed. bottles cannot be created",
                    brew_path)
Exemple #8
0
def build_chocolatey(repository, release, windows_host, output_dir):
    """
    Builds a .nupkg package in docker, and copies it to the host.

    Args:
        repository: The github repository to use. username/repo
        release: The release object from github
        windows_host: If set, the docker host ot use that can run windows containers
                      If not None, this should be a format that would work with
                      docker -H
        output_dir: The directory to place artifacts in after the build

    Returns:
        The path to the artifact
    """
    release_version, release_timestamp = get_version_and_timestamp_from_release(release)
    image_tag = "buck:" + release_version
    nupkg_name = "buck.{}.nupkg".format(release_version)
    nupkg_path = os.path.join(output_dir, nupkg_name)

    # Get the changelog from github rather than locally
    changelog_path = os.path.join(
        "tools", "release", "platforms", "chocolatey", "Changelog.md"
    )
    changelog = release["body"].strip() or "Periodic release"

    with temp_move_file(changelog_path), temp_file_with_contents(
        changelog_path, changelog
    ):
        logging.info("Building windows docker image...")
        docker(
            windows_host,
            [
                "build",
                "-m",
                "2g",  # Default memory is 1G
                "-t",
                image_tag,
                "--build-arg",
                "version=" + release_version,
                "--build-arg",
                "timestamp=" + str(release_timestamp),
                "--build-arg",
                "repository=" + repository,
                "tools/release/platforms/chocolatey",
            ],
        )

    logging.info("Copying nupkg out of docker container")
    copy_from_docker_windows(windows_host, image_tag, "/src/buck.nupkg", nupkg_path)

    logging.info("Validating that .nupkg installs...")
    validate(windows_host, image_tag, nupkg_path)

    logging.info("Built .nupkg file at {}".format(nupkg_path))
    return nupkg_path
Exemple #9
0
def validate(linux_host, image_tag, deb_path):
    """ Spin up a fresh docker image, and make sure that the deb installs and runs """
    DOCKERFILE = r"""\
FROM azul/zulu-openjdk:8
RUN sed -i 's,archive\.canonical\.com,mirror\.facebook\.net,g' /etc/apt/sources.list
RUN apt-get update
ADD {deb_filename} /{deb_filename}
RUN apt install -y /{deb_filename}
RUN touch .buckconfig
RUN /usr/local/bin/buck --help
"""
    build_dir = os.path.dirname(deb_path)
    deb_filename = os.path.basename(deb_path)
    dockerfile_temp_path = os.path.join(build_dir, "Dockerfile")
    dockerfile = DOCKERFILE.format(deb_filename=deb_filename)

    with temp_file_with_contents(dockerfile_temp_path, dockerfile):
        docker(linux_host, ["build", "-t", image_tag + "-validate", build_dir])
        docker(linux_host, ["rmi", image_tag + "-validate"])
Exemple #10
0
def validate(linux_host, image_tag, deb_path):
    """ Spin up a fresh docker image, and make sure that the deb installs and runs """
    DOCKERFILE = r"""\
FROM azul/zulu-openjdk:8
RUN sed -i 's,archive\.canonical\.com,mirror\.facebook\.net,g' /etc/apt/sources.list
RUN apt-get update
ADD {deb_filename} /{deb_filename}
RUN apt install -y /{deb_filename}
RUN touch .buckconfig
RUN /usr/local/bin/buck --help
"""
    build_dir = os.path.dirname(deb_path)
    deb_filename = os.path.basename(deb_path)
    dockerfile_temp_path = os.path.join(build_dir, "Dockerfile")
    dockerfile = DOCKERFILE.format(deb_filename=deb_filename)

    with temp_file_with_contents(dockerfile_temp_path, dockerfile):
        docker(linux_host, ["build", "-t", image_tag + "-validate", build_dir])
        docker(linux_host, ["rmi", image_tag + "-validate"])