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")
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")
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)
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)
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))
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
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()
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)
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...")
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 = []