def test_urlcheck(self): good = [ "git://server/foo.git#bab0c73900241ef5c465d7e873e9d8b34c948e67", "git+ssh://server2/other/path#bab0c73900241ef5c465d7e873e9d8b34c948e67", "svn://server/path/to/code#bab0c73900241ef5c465d7e873e9d8b34c948e67", "svn+ssh://server/some/path#bab0c73900241ef5c465d7e873e9d8b34c948e67", "cvs://server/some/path#bab0c73900241ef5c465d7e873e9d8b34c948e67", "cvs+ssh://server/some/path#bab0c73900241ef5c465d7e873e9d8b34c948e67", ] bad = [ "http://localhost/foo.html", "foo-1.1-1.src.rpm", "https://server/foo-1.1-1.src.rpm", "git:foobar", "https:foo/bar", "https://", ] for url in good: self.assertTrue(SCM.is_scm_url(url)) for url in bad: self.assertFalse(SCM.is_scm_url(url))
def handler(self, src, target, opts=None): jsonschema.validate([src, target, opts], self.PARAMS_SCHEMA) self.opts = opts component = None if not opts.get('git_branch'): raise koji.BuildError("Git branch must be specified") if opts.get('scratch') and opts.get('isolated'): raise koji.BuildError("Build cannot be both isolated and scratch") self.event_id = self.session.getLastEvent()['id'] target_info = self.session.getBuildTarget(target, event=self.event_id) if not target_info: raise koji.BuildError("Target `%s` not found" % target) build_tag = target_info['build_tag'] archlist = self.getArchList(build_tag) flatpak = opts.get('flatpak', False) if flatpak: if not osbs_flatpak_support: raise koji.BuildError("osbs-client on koji builder doesn't have Flatpak support") release_overwrite = None else: label_overwrites = {} release_overwrite = opts.get('release') if release_overwrite: label_overwrites = {LABEL_NAME_MAP['RELEASE'][0]: release_overwrite} component, expected_nvr = self.checkLabels(src, label_overwrites=label_overwrites, build_tag=build_tag) # scratch builds do not get imported, and consequently not tagged if not self.opts.get('scratch') and not flatpak: self.check_whitelist(component, target_info) if flatpak: expected_nvr = None if not SCM.is_scm_url(src): raise koji.BuildError('Invalid source specification: %s' % src) # don't check build nvr for autorebuild (has triggered_after_koji_task) # as they might be using add_timestamp_to_release # and don't check it for skipped build, which might be enabling/disabling # autorebuilds which use add_timestamp_to_release triggered_after_koji_task = opts.get('triggered_after_koji_task', None) skip_build = opts.get('skip_build', False) if triggered_after_koji_task or skip_build: expected_nvr = None # Scratch and auto release builds shouldn't be checked for nvr if not self.opts.get('scratch') and expected_nvr: try: build = self.session.getBuild(expected_nvr) build_id = build['id'] except Exception: self.logger.info("No build for %s found", expected_nvr, exc_info=True) else: if build['state'] in (koji.BUILD_STATES['FAILED'], koji.BUILD_STATES['CANCELED']): self.logger.info("Build for %s found, but with reusable state %s", expected_nvr, build['state'], exc_info=True) else: raise koji.BuildError("Build for %s already exists, id %s" % (expected_nvr, build_id)) self.logger.debug("Spawning jobs for arches: %r", archlist) kwargs = dict( src=src, target_info=target_info, scratch=opts.get('scratch', False), isolated=opts.get('isolated', False), dependency_replacements=opts.get('dependency_replacements', None), yum_repourls=opts.get('yum_repourls', None), branch=opts.get('git_branch', None), push_url=opts.get('push_url', None), arches=archlist, koji_parent_build=opts.get('koji_parent_build'), release=release_overwrite, flatpak=flatpak, signing_intent=opts.get('signing_intent', None), compose_ids=opts.get('compose_ids', None), skip_build=skip_build, triggered_after_koji_task=triggered_after_koji_task, ) results = [] semi_results = self.createContainer(**kwargs) if semi_results is not None: results = [semi_results] self.logger.debug("Results: %r", results) all_repositories = [] all_koji_builds = [] if not results: return { 'repositories': all_repositories, 'koji_builds': all_koji_builds, 'build': 'skipped', } for result in results: try: repository = result.get('repositories') all_repositories.extend(repository) except Exception as error: self.logger.error("Failed to merge list of repositories " "%r. Reason (%s): %s", repository, type(error), error) koji_build_id = result.get('koji_build_id') if koji_build_id: all_koji_builds.append(koji_build_id) return { 'repositories': all_repositories, 'koji_builds': all_koji_builds, }
def handler(self, src, target, opts=None): if not opts: opts = {} self.opts = opts data = {} self.event_id = self.session.getLastEvent()['id'] target_info = self.session.getBuildTarget(target, event=self.event_id) build_tag = target_info['build_tag'] archlist = self.getArchList(build_tag) flatpak = opts.get('flatpak', False) if flatpak: if not osbs_flatpak_support: raise koji.BuildError( "osbs-client on koji builder doesn't have Flatpak support") module = opts.get('module', None) if not module: raise koji.BuildError( "Module must be specified for a Flatpak build") module_name, module_stream, module_version = split_module_spec( module) data = { 'name': module_name, 'version': module_stream, } if module_version is not None: data['release'] = module_version release_overwrite = None else: label_overwrites = {} release_overwrite = opts.get('release') if release_overwrite: label_overwrites = { LABEL_DATA_MAP['RELEASE']: release_overwrite } data, expected_nvr = self.checkLabels( src, label_overwrites=label_overwrites, build_tag=build_tag) admin_opts = self._get_admin_opts(opts) data.update(admin_opts) # scratch builds do not get imported, and consequently not tagged if not self.opts.get('scratch'): self.check_whitelist(data[LABEL_DATA_MAP['COMPONENT']], target_info) try: # Flatpak builds append .<N> to the release generated from module version if flatpak: auto_release = True else: auto_release = (data[LABEL_DATA_MAP['RELEASE']] == LABEL_DEFAULT_VALUES['RELEASE']) if auto_release: # Do not expose default release value del data[LABEL_DATA_MAP['RELEASE']] self.extra_information = { "src": src, "data": data, "target": target } if not SCM.is_scm_url(src): raise koji.BuildError('Invalid source specification: %s' % src) # Scratch and auto release builds shouldn't be checked for nvr if not self.opts.get('scratch') and not auto_release: try: build_id = self.session.getBuild(expected_nvr)['id'] except: self.logger.info("No build for %s found", expected_nvr, exc_info=True) else: raise koji.BuildError( "Build for %s already exists, id %s" % (expected_nvr, build_id)) results = self.runBuilds( src, target_info, archlist, scratch=opts.get('scratch', False), isolated=opts.get('isolated', False), yum_repourls=opts.get('yum_repourls', None), branch=opts.get('git_branch', None), push_url=opts.get('push_url', None), koji_parent_build=opts.get('koji_parent_build'), release=release_overwrite, flatpak=flatpak, module=opts.get('module', None), compose_ids=opts.get('compose_ids', None), signing_intent=opts.get('signing_intent', None), ) all_repositories = [] all_koji_builds = [] for result in results: try: repository = result.get('repositories') all_repositories.extend(repository) except Exception, error: self.logger.error( "Failed to merge list of repositories " "%r. Reason (%s): %s", repository, type(error), error) koji_build_id = result.get('koji_build_id') if koji_build_id: all_koji_builds.append(koji_build_id) except (SystemExit, ServerExit, KeyboardInterrupt): # we do not trap these raise except: # reraise the exception raise return { 'repositories': all_repositories, 'koji_builds': all_koji_builds, }
def handler(self, src, target, opts=None): if not opts: opts = {} self.opts = opts data = {} self.event_id = self.session.getLastEvent()['id'] target_info = self.session.getBuildTarget(target, event=self.event_id) if not target_info: raise koji.BuildError("Target `%s` not found" % target) build_tag = target_info['build_tag'] archlist = self.getArchList(build_tag) flatpak = opts.get('flatpak', False) if flatpak: if not osbs_flatpak_support: raise koji.BuildError("osbs-client on koji builder doesn't have Flatpak support") release_overwrite = None else: label_overwrites = {} release_overwrite = opts.get('release') if release_overwrite: label_overwrites = {LABEL_DATA_MAP['RELEASE']: release_overwrite} data, expected_nvr = self.checkLabels(src, label_overwrites=label_overwrites, build_tag=build_tag) admin_opts = self._get_admin_opts(opts) data.update(admin_opts) # scratch builds do not get imported, and consequently not tagged if not self.opts.get('scratch') and not flatpak: self.check_whitelist(data[LABEL_DATA_MAP['COMPONENT']], target_info) try: # Flatpak builds append .<N> to the release generated from module version if flatpak: auto_release = True else: auto_release = (data[LABEL_DATA_MAP['RELEASE']] == LABEL_DEFAULT_VALUES['RELEASE']) if auto_release: # Do not expose default release value del data[LABEL_DATA_MAP['RELEASE']] self.extra_information = {"src": src, "data": data, "target": target} if not SCM.is_scm_url(src): raise koji.BuildError('Invalid source specification: %s' % src) # Scratch and auto release builds shouldn't be checked for nvr if not self.opts.get('scratch') and not auto_release: try: build_id = self.session.getBuild(expected_nvr)['id'] except: self.logger.info("No build for %s found", expected_nvr, exc_info=True) else: raise koji.BuildError( "Build for %s already exists, id %s" % (expected_nvr, build_id)) results = self.runBuilds(src, target_info, archlist, scratch=opts.get('scratch', False), isolated=opts.get('isolated', False), yum_repourls=opts.get('yum_repourls', None), branch=opts.get('git_branch', None), push_url=opts.get('push_url', None), koji_parent_build=opts.get('koji_parent_build'), release=release_overwrite, flatpak=flatpak, compose_ids=opts.get('compose_ids', None), signing_intent=opts.get('signing_intent', None), ) all_repositories = [] all_koji_builds = [] for result in results: try: repository = result.get('repositories') all_repositories.extend(repository) except Exception as error: self.logger.error("Failed to merge list of repositories " "%r. Reason (%s): %s", repository, type(error), error) koji_build_id = result.get('koji_build_id') if koji_build_id: all_koji_builds.append(koji_build_id) except (SystemExit, ServerExit, KeyboardInterrupt): # we do not trap these raise except: # reraise the exception raise return { 'repositories': all_repositories, 'koji_builds': all_koji_builds, }