def test_sendnotifymail(self, smtp_mock): self.config.smtpserver = 'foo.example.com' notifications.sendnotifymail(self.packages, self.commit) self.assertEqual(smtp_mock.call_count, 1)
def test_sendnotifymail_nomail(self, smtp_mock): notifications.sendnotifymail(self.packages, self.commit) # By default there is no smtpserver, so no calls self.assertEqual(smtp_mock.call_count, 0)
def process_build_result_rpm( status, packages, session, packages_to_process, dev_mode=False, run_cmd=False, stop=False, build_env=None, head_only=False, consistent=False, failures=0): config_options = getConfigOptions() commit = status[0] built_rpms = status[1] notes = status[2] exception = status[3] commit_hash = commit.commit_hash project = commit.project_name project_info = session.query(Project).filter( Project.project_name == project).first() if not project_info: project_info = Project(project_name=project, last_email=0) exit_code = 0 if run_cmd: if exception is not None: exit_code = 1 if stop: return exit_code return exit_code if exception is None: commit.status = "SUCCESS" commit.notes = notes commit.artifacts = ",".join(built_rpms) else: logger.error("Received exception %s" % exception) datadir = os.path.realpath(config_options.datadir) yumrepodir = os.path.join(datadir, "repos", commit.getshardedcommitdir()) logfile = os.path.join(yumrepodir, "rpmbuild.log") if (isknownerror(logfile) and (timesretried(project, session, commit_hash, commit.distro_hash) < config_options.maxretries)): logger.exception("Known error building packages for %s," " will retry later" % project) commit.status = "RETRY" commit.notes = str(exception) # do not switch from an error exit code to a retry # exit code if exit_code != 1: exit_code = 2 else: exit_code = 1 # If the log file hasn't been created we add what we have # This happens if the rpm build script didn't run. if not os.path.exists(yumrepodir): os.makedirs(yumrepodir) if not os.path.exists(logfile): with open(logfile, "w") as fp: fp.write(str(exception)) if not project_info.suppress_email(): sendnotifymail(packages, commit) project_info.sent_email() session.add(project_info) # allow to submit a gerrit review only if the last build # was successful or non existent to avoid creating a gerrit # review for the same problem multiple times. if config_options.gerrit is not None: if build_env: env_vars = list(build_env) else: env_vars = [] last_build = getLastProcessedCommit(session, project) if not last_build or last_build.status == 'SUCCESS': try: submit_review(commit, packages, env_vars) except Exception: logger.error('Unable to create review ' 'see review.log') else: logger.info('Last build not successful ' 'for %s' % project) commit.status = "FAILED" commit.notes = str(exception) if stop: return exit_code # Add commit to the session session.add(commit) genreports(packages, head_only, session, packages_to_process) # Export YAML file containing commit metadata export_commit_yaml(commit) try: sync_repo(commit) except Exception as e: logger.error('Repo sync failed for project %s' % project) consistent = False # If we were consistent before, we are not anymore if exit_code == 0: # The commit was ok, so marking as failed exit_code = 1 # We need to make the commit status be "failed" commit.status = "FAILED" commit.notes = str(e) session.add(commit) # And open a review if needed if config_options.gerrit is not None: if build_env: env_vars = list(build_env) else: env_vars = [] try: submit_review(commit, packages, env_vars) except Exception: logger.error('Unable to create review ' 'see review.log') session.commit() # Generate the current and consistent symlinks if exception is None: dirnames = ['current'] datadir = os.path.realpath(config_options.datadir) yumrepodir = os.path.join(datadir, "repos", commit.getshardedcommitdir()) yumrepodir_abs = os.path.join(datadir, yumrepodir) if consistent: dirnames.append('consistent') else: logger.info('%d packages not built correctly: not updating' ' the consistent symlink' % failures) for dirname in dirnames: target_repo_dir = os.path.join(datadir, "repos", dirname) os.symlink(os.path.relpath(yumrepodir_abs, os.path.join(datadir, "repos")), target_repo_dir + "_") os.rename(target_repo_dir + "_", target_repo_dir) # And synchronize them sync_symlinks(commit) if dev_mode is False: if consistent: # We have a consistent repo. Let's create a CIVote entry in the DB vote = CIVote(commit_id=commit.id, ci_name='consistent', ci_url='', ci_vote=True, ci_in_progress=False, timestamp=int(commit.dt_build), notes='') session.add(vote) session.commit() return exit_code
def process_build_result_rpm(status, packages, session, packages_to_process, dev_mode=False, run_cmd=False, stop=False, build_env=None, head_only=False, consistent=False, failures=0): config_options = getConfigOptions() commit = status[0] built_rpms = status[1] notes = status[2] exception = status[3] commit_hash = commit.commit_hash project = commit.project_name project_info = session.query(Project).filter( Project.project_name == project).first() if not project_info: project_info = Project(project_name=project, last_email=0) exit_code = 0 if run_cmd: if exception is not None: exit_code = 1 if stop: return exit_code return exit_code if exception is None: commit.status = "SUCCESS" commit.notes = notes commit.artifacts = ",".join(built_rpms) else: logger.error("Received exception %s" % exception) datadir = os.path.realpath(config_options.datadir) yumrepodir = os.path.join(datadir, "repos", commit.getshardedcommitdir()) logfile = os.path.join(yumrepodir, "rpmbuild.log") # If the log file hasn't been created we add what we have # This happens if the rpm build script didn't run. if not os.path.exists(yumrepodir): os.makedirs(yumrepodir) if not os.path.exists(logfile): with open(logfile, "w") as fp: fp.write(str(exception)) if (isknownerror(logfile) and (timesretried(project, session, commit_hash, commit.distro_hash) < config_options.maxretries)): logger.exception("Known error building packages for %s," " will retry later" % project) commit.status = "RETRY" commit.notes = str(exception) # do not switch from an error exit code to a retry # exit code if exit_code != 1: exit_code = 2 else: exit_code = 1 if not project_info.suppress_email(): sendnotifymail(packages, commit) project_info.sent_email() session.add(project_info) # allow to submit a gerrit review only if the last build # was successful or non existent to avoid creating a gerrit # review for the same problem multiple times. if config_options.gerrit is not None: if build_env: env_vars = list(build_env) else: env_vars = [] last_build = getLastProcessedCommit(session, project) if not last_build or last_build.status == 'SUCCESS': try: submit_review(commit, packages, env_vars) except Exception: logger.error('Unable to create review ' 'see review.log') else: logger.info('Last build not successful ' 'for %s' % project) commit.status = "FAILED" commit.notes = str(exception) if stop: return exit_code # Add commit to the session session.add(commit) genreports(packages, head_only, session, packages_to_process) # Export YAML file containing commit metadata export_commit_yaml(commit) try: sync_repo(commit) except Exception as e: logger.error('Repo sync failed for project %s' % project) consistent = False # If we were consistent before, we are not anymore if exit_code == 0: # The commit was ok, so marking as failed exit_code = 1 # We need to make the commit status be "failed" commit.status = "FAILED" commit.notes = str(e) session.add(commit) # And open a review if needed if config_options.gerrit is not None: if build_env: env_vars = list(build_env) else: env_vars = [] try: submit_review(commit, packages, env_vars) except Exception: logger.error('Unable to create review ' 'see review.log') session.commit() # Generate the current and consistent symlinks if exception is None: dirnames = ['current'] datadir = os.path.realpath(config_options.datadir) yumrepodir = os.path.join(datadir, "repos", commit.getshardedcommitdir()) yumrepodir_abs = os.path.join(datadir, yumrepodir) if consistent: dirnames.append('consistent') else: if config_options.use_components: logger.info('%d packages not built correctly for component' ' %s: not updating the consistent symlink' % (failures, commit.component)) else: logger.info('%d packages not built correctly: not updating' ' the consistent symlink' % failures) for dirname in dirnames: if config_options.use_components: target_repo_dir = os.path.join(datadir, "repos/component", commit.component, dirname) source_repo_dir = os.path.join(datadir, "repos/component", commit.component) else: target_repo_dir = os.path.join(datadir, "repos", dirname) source_repo_dir = os.path.join(datadir, "repos") os.symlink(os.path.relpath(yumrepodir_abs, source_repo_dir), target_repo_dir + "_") os.rename(target_repo_dir + "_", target_repo_dir) # If using components, synchronize the upper-level repo files if config_options.use_components: for dirname in dirnames: aggregate_repo_files(dirname, datadir, session, config_options.reponame, hashed_dir=True) # And synchronize them sync_symlinks(commit) if dev_mode is False: if consistent: # We have a consistent repo. Let's create a CIVote entry in the DB vote = CIVote(commit_id=commit.id, ci_name='consistent', ci_url='', ci_vote=True, ci_in_progress=False, timestamp=int(commit.dt_build), notes='', component=commit.component) session.add(vote) session.commit() return exit_code