Пример #1
0
 def _clone_downstream(self, component, branch):
     """Clones downstream dist-git repo"""
     # Do not set up downstream repo if it already exists
     if os.path.isdir(component):
         self.logger.info("Using existing downstream repo: " + component)
         repo = Repo(component)
     else:
         ccomponent = "container/" + component
         self.logger.info("Cloning into: " + ccomponent)
         packager = u._get_packager(self.conf)
         ret = subprocess.run([packager, "clone", ccomponent],
                              stdout=subprocess.DEVNULL,
                              stderr=subprocess.DEVNULL)
         # If the clone failed, try once again with the containers prefix
         if ret.returncode != 0:
             ccomponent = "containers/" + component
             ret = subprocess.run([packager, "clone", ccomponent],
                                  stdout=subprocess.DEVNULL,
                                  stderr=subprocess.DEVNULL)
             if ret.returncode != 0:
                 template = "{} failed to clone {} with return value {}."
                 raise RebuilderError(template.format(packager, component,
                                                      ret.returncode))
         repo = Repo(component)
         repo.git.checkout(branch)
     return repo
Пример #2
0
    def _clone_downstream(self, component, branch):
        """Clones downstream dist-git repo"""
        # Do not set up downstream repo if it already exists
        if os.path.isdir(component):
            self.logger.info("Using existing downstream repo: " + component)
            repo = Repo(component)
        else:
            hostname_url = u._get_hostname_url(self.conf)
            packager = u._get_packager(self.conf)
            # if packager is fedpkg then namespace is `container` else `containers`
            namespace = "container" if packager == "fedpkg" else "containers"
            component_path = f"{namespace}/{component}"
            # If hostname_url is specified use `git` otherwise `packager` command.
            if hostname_url:
                cmd = "git"
                ccomponent = f"{hostname_url}/{component_path}.git"
            else:
                cmd = packager
                ccomponent = component_path

            self.logger.info("Cloning into: " + ccomponent)
            ret = subprocess.run([cmd, "clone", ccomponent],
                                 stdout=subprocess.DEVNULL,
                                 stderr=subprocess.DEVNULL)
            # If the clone failed, try once again with the containers prefix
            if ret.returncode != 0:
                template = "{} failed to clone {} with return value {}."
                raise RebuilderError(template.format(cmd, component,
                                                     ret.returncode))

            repo = Repo(component)
            repo.git.checkout(branch)
        return repo
Пример #3
0
    def _build_images(self, image_set, custom_args=[], branches=[]):
        if not image_set:
            # Nothing to build
            self.logger.warn("No images to build, exiting.")
            return
        if not branches:
            # Fill defaults from config if not provided
            for release in self.conf.releases:
                branches += [self.conf.releases[release]["current"]]
        self._prebuild_check(image_set, branches)

        procs = []
        tmp = self._get_tmp_workdir(setup_dir=False)
        for image in image_set:
            component = image["component"]
            cwd = os.path.join(tmp, component)
            self.logger.info("Building image {} ...".format(component))
            args = [u._get_packager(self.conf), 'container-build']
            if custom_args:
                args.extend(custom_args)
            proc = subprocess.Popen(args,
                                    cwd=cwd,
                                    stdout=subprocess.PIPE,
                                    stderr=subprocess.PIPE,
                                    universal_newlines=True)
            # Append the process and component information for later use
            procs.append((proc, component))

        self.logger.info("Fetching tasks...")
        for proc, component in procs:
            self.logger.debug("Query component: {}".format(component))
            # Iterate until a taskID is found
            for stdout in iter(proc.stdout.readline, ""):
                if "taskID" in stdout:
                    self.logger.info("{} - {}".format(component,
                                                      stdout.strip()))
                    break
            else:
                # If we get here the command must have failed
                # The error will get printed out later when getting all builds
                temp = "Could not find task for {}!"
                self.logger.warning(temp.format(component))

        self.logger.info("Waiting for builds...")
        timeout = 30
        while procs:
            self.logger.debug("Looping over all running builds")
            for proc, image in procs:
                out = err = None
                try:
                    self.logger.debug("Waiting {} seconds for {}".format(
                        timeout, image))
                    out, err = proc.communicate(timeout=timeout)
                except subprocess.TimeoutExpired:
                    msg = "{} not yet finished, checking next build"
                    self.logger.debug(msg.format(image))
                    continue

                self.logger.info("{} build has finished".format(image))
                if err:
                    # Write out stderr if we encounter an error
                    err = u._4sp(err)
                    self.logger.error(err)
                procs.remove((proc, image))