예제 #1
0
    def upload_packages(self):

        if not self.upload:
            return

        st_channel = self.stable_channel or "stable"
        if self.upload_only_when_stable and self.channel != st_channel:
            print("Skipping upload, not stable channel")
            return

        if not self.reference or not self.password or not self.channel or not self.username:
            print("Upload not possible, some parameter (reference, password or channel) is missing!")
            return

        command = "conan upload %s@%s/%s --retry %s --all --force -r=upload_repo" % (self.reference, self.username,
                                                                                     self.channel, self.upload_retry)
        user_command = 'conan user %s -p="%s" -r=upload_repo' % (self.login_username, self.password)

        logger.info("******** RUNNING UPLOAD COMMAND ********** \n%s" % command)
        if self._platform_info.system() == "Linux" and self.use_docker:
            self.runner("sudo chmod -R 777 ~/.conan/data")
            # self.runner("ls -la ~/.conan")

        ret = self.runner(user_command)
        if ret != 0:
            raise Exception("Error with user credentials")

        ret = self.runner(command)
        if ret != 0:
            raise Exception("Error uploading")
예제 #2
0
    def upload_packages(self):
        if not self._upload_enabled():
            return

        self.login("upload_repo")

        all_refs = set([ref for _, _, _, _, ref in self.builds_in_current_page])

        if not all_refs:
            all_refs = [self.reference]

        if not all_refs:
            logger.error("******** NOT REFERENCES TO UPLOAD!! ********** \n")

        if self._platform_info.system() == "Linux" and self.use_docker:
            data_dir = os.path.expanduser(self.data_home)
            self.runner("%s chmod -R 777 %s" % (self.sudo_command, data_dir))

        for ref in all_refs:
            command = "conan upload %s --retry %s --all --force --confirm -r=upload_repo" % (
                    str(ref), self.upload_retry)

            logger.info("******** RUNNING UPLOAD COMMAND ********** \n%s" % command)
            ret = self.runner(command)
            if ret != 0:
                raise Exception("Error uploading")
예제 #3
0
    def _run_test_package(self, pre_command=None):
        settings = collections.OrderedDict(sorted(self.settings.items()))
        if not self._detected_compiler_override(
        ) and platform.system() != "Windows":
            if settings.get("compiler", None) and settings.get(
                    "compiler.version", None):
                conan_compiler, conan_compiler_version = self.conan_compiler_info(
                )
                if conan_compiler != settings.get("compiler", None) or \
                   conan_compiler_version != settings.get("compiler.version", None):
                    logger.debug("- Skipped build, compiler mismatch: %s" %
                                 str(dict(settings)))
                    return  # Skip this build, it's not for this machine

        # Save the profile in a tmp file
        abs_profile_path = os.path.abspath(
            os.path.join(
                tempfile.mkdtemp(suffix='conan_package_tools_profiles'),
                "profile"))
        profile_txt = self._profile.dumps()
        save(abs_profile_path, profile_txt)
        command = "conan test_package . --profile %s %s" % (abs_profile_path,
                                                            self._args)
        if pre_command:
            command = '%s && %s' % (pre_command, command)

        logger.info("******** RUNNING BUILD ********** \n%s\n\n%s" %
                    (command, profile_txt))
        retcode = self._runner(command)
        if retcode != 0:
            exit("Error while executing:\n\t %s" % command)
예제 #4
0
 def pull_image(self):
     datadir = os.path.expanduser("~/.conan/data")
     if not os.path.exists(datadir):
         mkdir(datadir)
         if platform.system() != "Windows":
             self._runner("chmod -R 777 %s" % datadir)
     logger.info("Pulling docker image %s" % self.docker_image)
     self._runner("sudo docker pull %s" % self.docker_image)
예제 #5
0
 def pull_image(self):
     datadir = os.path.expanduser(self.data_home)
     if not os.path.exists(datadir):
         mkdir(datadir)
         if platform.system() != "Windows":
             self._runner("chmod -R 777 %s" % datadir)
     logger.info("Pulling docker image %s" % self.docker_image)
     self._runner("%s docker pull %s" % (self.sudo_command, self.docker_image))
예제 #6
0
    def add_remote_safe(self, name, url, insert=False):
        # FIXME: Use conan api when prepared to call
        """Add a remove previoulsy removing if needed an already configured repository with the same URL"""
        existing_name = self.get_remote_name(url)
        if existing_name:
            self.runner("conan remote remove %s" % existing_name)

        if insert:
            if self.runner("conan remote add %s %s --insert" % (name, url)) != 0:
                logger.info("Remote add with insert failed... trying to add at the end")
            else:
                return 0
        self.runner("conan remote add %s %s" % (name, url))  # Retrocompatibility
예제 #7
0
    def login(self, remote_name, user=None, password=None, force=False):
        if force or not self._logged_user_in_remote[remote_name]:
            user_command = 'conan user %s -p="%s" -r=%s' % (user or self.login_username,
                                                            password or self.password,
                                                            remote_name)

            logger.info("******** VERIFYING YOUR CREDENTIALS **********\n")
            if self._platform_info.system() == "Linux" and self.use_docker:
                data_dir = os.path.expanduser(self.data_home)
                self.runner("%s chmod -R 777 %s" % (self.sudo_command, data_dir))

            ret = self.runner(user_command)
            if ret != 0:
                raise Exception("Error with user credentials for remote %s" % remote_name)

        self._logged_user_in_remote[remote_name] = True
def run():
    the_json = os.getenv("CONAN_RUNNER_ENCODED", None)
    runner = DockerTestPackageRunner.deserialize(the_json)
    logger.info("Running test_package in a Docker image: %s" % the_json)
    runner.run()
예제 #9
0
 def clear_system_requirements(self):
     if self._reference:
         the_path = self.client_cache.system_reqs(self._reference)
         if os.path.exists(the_path):
             logger.info("Removing system_requirements: %s" % the_path)
             shutil.rmtree(os.path.dirname(the_path), ignore_errors=True)
예제 #10
0
    def __init__(self, args=None, username=None, channel=None, runner=None,
                 gcc_versions=None, visual_versions=None, visual_runtimes=None,
                 apple_clang_versions=None, archs=None,
                 use_docker=None, curpage=None, total_pages=None,
                 docker_image=None, reference=None, password=None, remote=None,
                 remotes=None,
                 upload=None, stable_branch_pattern=None,
                 vs10_x86_64_enabled=False,
                 mingw_configurations=None,
                 stable_channel=None,
                 platform_info=None,
                 upload_retry=None,
                 clang_versions=None,
                 login_username=None,
                 upload_only_when_stable=False):

        self._builds = []
        self._named_builds = {}
        self._platform_info = platform_info or PlatformInfo()
        self.runner = runner or os.system
        self.output_runner = ConanOutputRunner()
        self.args = args or " ".join(sys.argv[1:])
        self.username = username or os.getenv("CONAN_USERNAME", None)
        self.login_username = login_username or os.getenv("CONAN_LOGIN_USERNAME", None) or self.username
        if not self.username:
            raise Exception("Instance ConanMultiPackage with 'username' "
                            "parameter or use CONAN_USERNAME env variable")

        # Upload related variables
        self.upload_retry = upload_retry or os.getenv("CONAN_UPLOAD_RETRY", 3)
        self.reference = reference or os.getenv("CONAN_REFERENCE", None)
        self.password = password or os.getenv("CONAN_PASSWORD", None)
        self.remote = remote or os.getenv("CONAN_REMOTE", None)

        if self.remote:
            raise Exception('''
'remote' argument is deprecated. Use:
        - 'upload' argument to specify the remote URL to upload your packages (or None to disable upload)
        - 'remotes' argument to specify additional remote URLs, for example, different user repositories.
''')

        self.remotes = remotes or os.getenv("CONAN_REMOTES", None)
        self.upload = upload or os.getenv("CONAN_UPLOAD", None)

        self.stable_branch_pattern = stable_branch_pattern or os.getenv("CONAN_STABLE_BRANCH_PATTERN", None)
        default_channel = channel or os.getenv("CONAN_CHANNEL", "testing")
        self.stable_channel = stable_channel or os.getenv("CONAN_STABLE_CHANNEL", "stable")
        self.channel = self._get_channel(default_channel, self.stable_channel)

        self.upload_only_when_stable = upload_only_when_stable or os.getenv("CONAN_UPLOAD_ONLY_WHEN_STABLE", False)

        if self.upload:
            if self.upload in ("0", "None", "False"):
                self.upload = None
            elif self.upload == "1":
                raise Exception("WARNING! 'upload' argument has changed. Use 'upload' argument or CONAN_UPLOAD "
                                "environment variable to specify a remote URL to upload your packages. e.j: "
                                "upload='https://api.bintray.com/conan/myuser/myconanrepo'")

        os.environ["CONAN_CHANNEL"] = self.channel

        self.clang_versions = clang_versions or list(filter(None, os.getenv("CONAN_CLANG_VERSIONS", "").split(",")))\

        # If there are some GCC versions declared in the environment then we don't default the clang versions
        if not self.clang_versions and not os.getenv("CONAN_GCC_VERSIONS", False):
            self.clang_versions = self.default_clang_versions

        self.gcc_versions = gcc_versions or list(filter(None, os.getenv("CONAN_GCC_VERSIONS", "").split(",")))

        # If there are some CLANG versions declared in the environment then we don't default the gcc versions
        if not self.gcc_versions and not os.getenv("CONAN_CLANG_VERSIONS", False):
            self.gcc_versions = self.default_gcc_versions

        if visual_versions is not None:
            self.visual_versions = visual_versions
        else:
            self.visual_versions = list(filter(None, os.getenv("CONAN_VISUAL_VERSIONS", "").split(",")))
            if not self.visual_versions and not mingw_configurations and not get_mingw_config_from_env():
                self.visual_versions = self.default_visual_versions
            elif mingw_configurations or get_mingw_config_from_env():
                self.visual_versions = []

        self.visual_runtimes = visual_runtimes or \
            list(filter(None, os.getenv("CONAN_VISUAL_RUNTIMES", "").split(","))) or \
            self.default_visual_runtimes

        self.apple_clang_versions = apple_clang_versions or \
            list(filter(None, os.getenv("CONAN_APPLE_CLANG_VERSIONS", "").split(","))) or \
            self.default_apple_clang_versions

        self.mingw_configurations = mingw_configurations or get_mingw_config_from_env()
        self.mingw_installer_reference = ConanFileReference.loads(os.getenv("CONAN_MINGW_INSTALLER_REFERENCE") or
                                                                  "mingw_installer/0.1@lasote/testing")

        self.archs = archs or \
            list(filter(None, os.getenv("CONAN_ARCHS", "").split(","))) or \
            self.default_archs

        # If CONAN_DOCKER_IMAGE is speified, then use docker is True
        self.use_docker = use_docker or os.getenv("CONAN_USE_DOCKER", False) or (os.getenv("CONAN_DOCKER_IMAGE", None) is not None)

        self.curpage = curpage or os.getenv("CONAN_CURRENT_PAGE", 1)
        self.total_pages = total_pages or os.getenv("CONAN_TOTAL_PAGES", 1)
        self.docker_image = docker_image or os.getenv("CONAN_DOCKER_IMAGE", None)

        if self.password:
            self.password = self.password.replace('"', '\\"')

        self.conan_pip_package = os.getenv("CONAN_PIP_PACKAGE", None)
        self.vs10_x86_64_enabled = vs10_x86_64_enabled

        if self.upload:
            self.add_remote_safe("upload_repo", self.upload, insert=False)

        # Set the remotes
        if self.remotes:
            if not isinstance(self.remotes, list):
                remotes = [r.strip() for r in self.remotes.split(",") if r.strip()]

            for counter, remote in enumerate(reversed(remotes)):
                if remote == self.upload:  # Already added
                    continue
                remote_name = "remote%s" % counter
                self.add_remote_safe(remote_name, remote, insert=True)
            self.runner("conan remote list")
        else:
            logger.info("Not additional remotes declared...")
예제 #11
0
    def __init__(self, args=None, username=None, channel=None, runner=None,
                 gcc_versions=None, visual_versions=None, visual_runtimes=None,
                 apple_clang_versions=None, archs=None,
                 use_docker=None, curpage=None, total_pages=None,
                 docker_image=None, reference=None, password=None, remote=None,
                 remotes=None,
                 upload=None, stable_branch_pattern=None,
                 vs10_x86_64_enabled=False,
                 mingw_configurations=None,
                 stable_channel=None,
                 platform_info=None,
                 upload_retry=None,
                 clang_versions=None,
                 login_username=None,
                 upload_only_when_stable=False,
                 build_types=None,
                 skip_check_credentials=False,
                 allow_gcc_minors=False,
                 exclude_vcvars_precommand=False,
                 docker_image_skip_update=False,
                 docker_entry_script=None,
                 docker_32_images=None):

        self.sudo_command = ""
        if "CONAN_DOCKER_USE_SUDO" in os.environ:
            if get_bool_from_env("CONAN_DOCKER_USE_SUDO"):
                self.sudo_command = "sudo"
        elif platform.system() == "Linux":
            self.sudo_command = "sudo"

        self.exclude_vcvars_precommand = exclude_vcvars_precommand or os.getenv("CONAN_EXCLUDE_VCVARS_PRECOMMAND", False)
        self.docker_image_skip_update = docker_image_skip_update or os.getenv("CONAN_DOCKER_IMAGE_SKIP_UPDATE", False)
        self.allow_gcc_minors = allow_gcc_minors or os.getenv("CONAN_ALLOW_GCC_MINORS", False)
        self._builds = []
        self._named_builds = {}
        self._platform_info = platform_info or PlatformInfo()
        self.runner = runner or os.system
        self.output_runner = ConanOutputRunner()
        self.args = args or " ".join(sys.argv[1:])
        self.username = username or os.getenv("CONAN_USERNAME", None)
        self.login_username = login_username or os.getenv("CONAN_LOGIN_USERNAME",
                                                          None) or self.username
        if not self.username:
            raise Exception("Instance ConanMultiPackage with 'username' "
                            "parameter or use CONAN_USERNAME env variable")

        # Upload related variables
        self.upload_retry = upload_retry or os.getenv("CONAN_UPLOAD_RETRY", 3)
        self.reference = reference or os.getenv("CONAN_REFERENCE", None)
        self.password = password or os.getenv("CONAN_PASSWORD", None)
        self.remote = remote or os.getenv("CONAN_REMOTE", None)

        # User is already logged
        self._logged_user_in_remote = defaultdict(lambda: False)

        if self.remote:
            raise Exception('''
'remote' argument is deprecated. Use:
        - 'upload' argument to specify the remote URL to upload your packages (or None to disable
        upload)
        - 'remotes' argument to specify additional remote URLs, for example, different user
        repositories.
''')

        self.remotes = remotes or os.getenv("CONAN_REMOTES", [])
        self.upload = upload if upload is not None else os.getenv("CONAN_UPLOAD", None)
        # The username portion of the remote URLs must be all lowercase to work
        if self.remotes:
            if isinstance(self.remotes,list):
                self.remotes = [remote.lower() for remote in self.remotes]
            else:
                self.remotes = self.remotes.lower()
        if self.upload:
            self.upload = self.upload.lower()

        self.stable_branch_pattern = stable_branch_pattern or \
                                     os.getenv("CONAN_STABLE_BRANCH_PATTERN", None)
        default_channel = channel or os.getenv("CONAN_CHANNEL", "testing")
        self.stable_channel = stable_channel or os.getenv("CONAN_STABLE_CHANNEL", "stable")
        self.channel = self._get_channel(default_channel, self.stable_channel)

        if self.reference:
            self.reference = ConanFileReference.loads("%s@%s/%s" % (self.reference,
                                                                    self.username, self.channel))
        self.upload_only_when_stable = upload_only_when_stable or \
                                       os.getenv("CONAN_UPLOAD_ONLY_WHEN_STABLE", False)
        self.skip_check_credentials = skip_check_credentials or \
                                      os.getenv("CONAN_SKIP_CHECK_CREDENTIALS", False)

        self.docker_entry_script = docker_entry_script or \
                                      os.getenv("CONAN_DOCKER_ENTRY_SCRIPT", None)

        if self.upload:
            if self.upload in ("0", "None", "False"):
                self.upload = None
            elif self.upload == "1":
                raise Exception("WARNING! 'upload' argument has changed. Use 'upload' argument or "
                                "CONAN_UPLOAD environment variable to specify a remote URL to "
                                "upload your packages. e.j: "
                                "upload='https://api.bintray.com/conan/myuser/myconanrepo'")

        os.environ["CONAN_CHANNEL"] = self.channel

        self.clang_versions = clang_versions or split_colon_env("CONAN_CLANG_VERSIONS")
        self.gcc_versions = gcc_versions or split_colon_env("CONAN_GCC_VERSIONS")

        # If there are some GCC versions declared then we don't default the clang
        # versions
        if not self.clang_versions and not self.gcc_versions:
            self.clang_versions = self.default_clang_versions

        # If there are some CLANG versions declared then we don't default the gcc
        # versions
        if not self.gcc_versions and self.clang_versions == self.default_clang_versions:
            self.gcc_versions = self.default_gcc_versions

        if self.gcc_versions and not self.allow_gcc_minors:
            for a_version in self.gcc_versions:
                if Version(a_version) >= Version("5") and "." in a_version:
                    raise Exception("""
******************* DEPRECATED GCC MINOR VERSIONS! ***************************************

- The use of gcc versions >= 5 and specifying the minor version (e.j "5.4") is deprecated.
- The ABI of gcc >= 5 (5, 6, and 7) is compatible between minor versions (e.j 5.3 is compatible with 5.4)
- Specify only the major in your script:
   - CONAN_GCC_VERSIONS="5,6,7" if you are using environment variables.
   - gcc_versions=["5", "6", "7"] if you are using the constructor parameter.

You can still keep using the same docker images, or use the new "lasote/conangcc5", "lasote/conangcc6", "lasote/conangcc7"

If you still want to keep the old behavior, set the environment var CONAN_ALLOW_GCC_MINORS or pass the
"allow_gcc_minors=True" parameter. But it is not recommended, if your packages are public most users
won't be able to use them.

******************************************************************************************

""")

        if visual_versions is not None:
            self.visual_versions = visual_versions
        else:
            self.visual_versions = split_colon_env("CONAN_VISUAL_VERSIONS")
            if not self.visual_versions and not mingw_configurations and not get_mingw_config_from_env():
                self.visual_versions = self.default_visual_versions
            elif mingw_configurations or get_mingw_config_from_env():
                self.visual_versions = []

        self.visual_runtimes = visual_runtimes or split_colon_env("CONAN_VISUAL_RUNTIMES") or \
                               self.default_visual_runtimes

        self.apple_clang_versions = apple_clang_versions or \
                                    split_colon_env("CONAN_APPLE_CLANG_VERSIONS") or \
                                    self.default_apple_clang_versions

        self.mingw_configurations = mingw_configurations or get_mingw_config_from_env()
        env_ref = os.getenv("CONAN_MINGW_INSTALLER_REFERENCE")
        self.mingw_installer_reference = ConanFileReference.loads(env_ref or
                                                                  "mingw_installer/1.0"
                                                                  "@conan/stable")

        if not archs and not os.getenv("CONAN_ARCHS") and platform.system() == "Darwin":
            self.default_archs = ["x86_64"]  # No longer supported (by default) x86 macos

        self.archs = archs or split_colon_env("CONAN_ARCHS") or self.default_archs

        self.build_types = build_types or split_colon_env("CONAN_BUILD_TYPES") or \
                           self.default_build_types

        # If CONAN_DOCKER_IMAGE is speified, then use docker is True
        self.use_docker = use_docker or os.getenv("CONAN_USE_DOCKER", False) or \
                          (os.getenv("CONAN_DOCKER_IMAGE", None) is not None)

        if docker_32_images is not None:
            self.docker_32_images = docker_32_images
        else:
            self.docker_32_images = os.getenv("CONAN_DOCKER_32_IMAGES", False)

        self.curpage = curpage or os.getenv("CONAN_CURRENT_PAGE", 1)
        self.total_pages = total_pages or os.getenv("CONAN_TOTAL_PAGES", 1)
        self.docker_image = docker_image or os.getenv("CONAN_DOCKER_IMAGE", None)

        if self.password:
            self.password = self.password.replace('"', '\\"')

        self.conan_pip_package = os.getenv("CONAN_PIP_PACKAGE", "conan==%s" % client_version)
        self.vs10_x86_64_enabled = vs10_x86_64_enabled

        # Set the remotes
        if self.remotes:
            if not isinstance(self.remotes, list):
                self.remotes = [r.strip() for r in self.remotes.split(",") if r.strip()]
            for counter, remote in enumerate(reversed(self.remotes)):
                remote_name = "remote%s" % counter if remote != self.upload else "upload_repo"
                self.add_remote_safe(remote_name, remote, insert=True)
            self.runner("conan remote list")
        else:
            logger.info("Not additional remotes declared...")

        if self.upload and self.upload not in self.remotes:
            # If you specify the upload as a remote, put it first
            # this way we can cover all the possibilities
            self.add_remote_safe("upload_repo", self.upload, insert=False)

        _, client_cache, _ = Conan.factory()
        self.data_home = client_cache.store
        self.builds_in_current_page = []