8000 allow passing user-specified Docker args during create step by Artalus · Pull Request #343 · conan-io/conan-package-tools · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

allow passing user-specified Docker args during create step #343

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 11 commits into from
Mar 25, 2019
Merged
15 changes: 14 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -430,6 +430,17 @@ But if you prefer to use environment variables:

export CONAN_PIP_INSTALL="bincrafters-package-tools==0.17.0,conan-promote=0.1.2"

### Passing additional Docker parameters during build
When running `conan create` step in Docker, you might want to run the container with a different Docker network. For this you can use `docker_run_options` parameter (or `CONAN_DOCKER_RUN_OPTIONS` envvar)

builder = ConanMultiPackager(
docker_run_options='--network bridge --privileged',
...

When run, this will translate to something like this:

sudo -E docker run ... --network bridge --privileged conanio/gcc6 /bin/sh -c "cd project && run_create_in_docker"


### Installing custom Conan config

Expand All @@ -445,7 +456,7 @@ If you need to run `conan config install <url>` before to build there is the arg
builder.add_common_builds()
builder.run()

But if are not interested to update your build.py script, it's possible to use environment variables instead:
But if you are not interested to update your build.py script, it's possible to use environment variables instead:

export CONAN_CONFIG_URL=https://github.com/bincrafters/conan-config.git

Expand Down Expand Up @@ -1028,6 +1039,7 @@ Using **CONAN_CLANG_VERSIONS** env variable in Travis ci or Appveyor:
- **mingw_configurations**: Configurations for MinGW
- **archs**: List containing specific architectures to build for. Default ["x86", "x86_64"]
- **use_docker**: Use docker for package creation in Linux systems.
- **docker_run_options**: Pass additional parameters for docker when running the create step.
- **docker_conan_home**: Location where package source files will be copied to inside the Docker container
- **docker_image_skip_update**: If defined, it will skip the initialization update of "conan package tools" and "conan" in the docker image. By default is False.
- **docker_image_skip_pull**: If defined, it will skip the "docker pull" command, enabling a local image to be used, and without being overwritten.
Expand Down Expand Up @@ -1163,6 +1175,7 @@ This is especially useful for CI integration.
- **CONAN_TOTAL_PAGES**: Total number of pages
- **CONAN_DOCKER_IMAGE**: If defined and docker is being used, it will use this dockerimage instead of the default images, e.g. "conanio/gcc63"
- **CONAN_DOCKER_HOME**: Location where package source files will be copied to inside the Docker container
- **CONAN_DOCKER_RUN_OPTIONS**: Pass additional parameters for docker when running the create step
- **CONAN_DOCKER_IMAGE_SKIP_UPDATE**: If defined, it will skip the initialization update of "conan package tools" and "conan" in the docker image. By default is False.
- **CONAN_DOCKER_IMAGE_SKIP_PULL**: If defined, it will skip the "docker pull" command, enabling a local image to be used, and without being overwritten.
- **CONAN_ALWAYS_UPDATE_CONAN_DOCKER**: If defined, "conan package tools" and "conan" will be installed and upgraded in the docker image in every build execution
Expand Down
9 changes: 8 additions & 1 deletion cpt/packager.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ def __init__(self, username=None, channel=None, runner=None,
skip_check_credentials=False,
allow_gcc_minors=False,
exclude_vcvars_precommand=False,
docker_run_options=None,
docker_image_skip_update=False,
docker_image_skip_pull=False,
docker_entry_script=None,
Expand Down Expand Up @@ -253,6 +254,10 @@ def __init__(self, username=None, channel=None, runner=None,
self.runner = runner or os.system
self.output_runner = ConanOutputRunner()

self.docker_run_options = docker_run_options or split_colon_env("CONAN_DOCKER_RUN_OPTIONS")
if isinstance(self.docker_run_options, list):
self.docker_run_options = " ".join(self.docker_run_options)

self.docker_entry_script = docker_entry_script or os.getenv("CONAN_DOCKER_ENTRY_SCRIPT")

self.pip_install = pip_install or split_colon_env("CONAN_PIP_INSTALL")
Expand All @@ -275,7 +280,7 @@ def __init__(self, username=None, channel=None, runner=None,

self.conan_pip_package = os.getenv("CONAN_PIP_PACKAGE", "conan==%s" % client_version)
if self.conan_pip_package in ("0", "False"):
self.conan_pip_package = False
self.conan_pip_package = ""
self.vs10_x86_64_enabled = vs10_x86_64_enabled

self.builds_in_current_page = []
Expand Down Expand Up @@ -563,10 +568,12 @@ def run_builds(self, curpage=None, total_pages=None, base_profile_name=None):
docker_shell=self.docker_shell,
docker_conan_home=self.docker_conan_home,
docker_platform_param=self.docker_platform_param,
docker_run_options=self.docker_run_options,
lcow_user_workaround=self.lcow_user_workaround,
test_folder=self.test_folder,
pip_install=self.pip_install,
config_url=self.config_url,
printer=self.printer,
upload_dependencies=self.upload_dependencies,
conanfile=self.conanfile)

Expand Down
13 changes: 9 additions & 4 deletions cpt/runner.py
8000
Original file line number Diff line number Diff line change
Expand Up @@ -134,14 +134,16 @@ def __init__(self, profile_text, base_profile_text, base_profile_name, reference
upload=False, upload_retry=None,
runner=None,
docker_shell="", docker_conan_home="",
docker_platform_param="", lcow_user_workaround="",
docker_platform_param="", docker_run_options="",
lcow_user_workaround="",
test_folder=None,
pip_install=None,
config_url=None,
printer=None,
upload_dependencies=None,
conanfile=None):

self.printer = Printer()
self.printer = printer or Printer()
self._upload = upload
self._upload_retry = upload_retry
self._reference = reference
Expand All @@ -159,6 +161,7 @@ def __init__(self, profile_text, base_profile_text, base_profile_name, reference
self._docker_shell = docker_shell
self._docker_conan_home = docker_conan_home
self._docker_platform_param = docker_platform_param
self._docker_run_options = docker_run_options or ""
self._lcow_user_workaround = lcow_user_workaround
self._runner = PrintRunner(runner, self.printer)
self._test_folder = test_folder
Expand Down Expand Up @@ -201,8 +204,9 @@ def run(self, pull_image=True, docker_entry_script=None):
with self.printer.foldable_output("update conan"):
try:
command = '%s docker run %s --name conan_runner ' \
' %s %s "%s"' % (self._sudo_docker_command,
' %s %s %s "%s"' % (self._sudo_docker_command,
env_vars_text,
self._docker_run_options,
self._docker_image,
self._docker_shell,
self._pip_update_conan_command())
Expand All @@ -228,12 +232,13 @@ def run(self, pull_image=True, docker_entry_script=None):
else:
update_command = ""

command = ('%s docker run --rm -v "%s:%s/project" %s %s %s %s '
command = ('%s docker run --rm -v "%s:%s/project" %s %s %s %s %s '
'"%s cd project && '
'%s run_create_in_docker "' % (self._sudo_docker_command,
os.getcwd(),
self._docker_conan_home,
env_vars_text,
self._docker_run_options,
self._docker_platform_param,
self._docker_image,
self._docker_shell,
Expand Down
51 changes: 49 additions & 2 deletions cpt/test/integration/docker_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import unittest

from conans import __version__ as client_version
from conans.client import tools
from conans import tools
from conans.model.ref import ConanFileReference
from conans.model.version import Version

Expand All @@ -15,9 +15,13 @@
from cpt.test.unit.utils import MockCIManager


def is_linux_and_have_docker():
return tools.os_info.is_linux and tools.which("docker")


class DockerTest(BaseTest):

@unittest.skipUnless(sys.platform.startswith("linux"), "Requires Linux")
@unittest.skipUnless(is_linux_and_have_docker(), "Requires Linux and Docker")
def test_docker(self):
if not os.getenv("PYPI_PASSWORD", None):
return
Expand Down Expand Up @@ -104,3 +108,46 @@ class Pkg(ConanFile):
self.assertEquals(len(results), 0)
self.api.remove(search_pattern, remote_name="upload_repo", force=True)


@unittest.skipUnless(is_linux_and_have_docker(), "Requires Linux and Docker")
def test_docker_run_options(self):
conanfile = """from conans import ConanFile
import os

class Pkg(ConanFile):
settings = "os", "compiler", "build_type", "arch"

def build(self):
pass
"""
self.save_conanfile(conanfile)
# Validate by Environemnt Variable
with tools.environment_append({"CONAN_USERNAME": "bar",
"CONAN_DOCKER_IMAGE": "conanio/gcc8",
"CONAN_DOCKER_USE_SUDO": "0",
"CONAN_REFERENCE": "foo/0.0.1@bar/testing",
"CONAN_DOCKER_RUN_OPTIONS": "--network=host, --add-host=google.com:8.8.8.8"
}):
self.packager = ConanMultiPackager(gcc_versions=["8"],
archs=["x86_64"],
build_types=["Release"],
out=self.output.write)
self.packager.add({})
self.packager.run()
self.assertIn("--network=host --add-host=google.com:8.8.8.8 conanio/gcc8", self.output)

# Validate by parameter
with tools.environment_append({"CONAN_USERNAME": "bar",
"CONAN_DOCKER_IMAGE": "conanio/gcc8",
"CONAN_DOCKER_USE_SUDO": "0",
"CONAN_REFERENCE": "foo/0.0.1@bar/testing"
}):

self.packager = ConanMultiPackager(gcc_versions=["8"],
archs=["x86_64"],
build_types=["Release"],
docker_run_options="--cpus=1",
out=self.output.write)
self.packager.add({})
self.packager.run()
self.assertIn("--cpus=1 conanio/gcc8", self.output)
0