build-fail-notification: Mail to -factory after 4, dr after 6 weeks

Let's further automate the process of failed packages. Keeping them around serves nobody.

So now, we do:
* Mail to maintainer after 1 week of failre
* Reminder mail after another week
* Send a mail to -factory after 2 more weeks (so, total 4 weeks failed)
* File a delete request after 6 weeks failed

The delete request will then go into the regular delete process, being blocked by potentially
other packages depending on it.
This commit is contained in:
Dominique Leuenberger 2019-04-10 14:03:27 +02:00 committed by Stephan Kulow
parent 72c1e9b445
commit 1eb5d07c09

View File

@ -8,6 +8,7 @@ import osc.conf
import xml.etree.ElementTree as ET import xml.etree.ElementTree as ET
import smtplib import smtplib
from email.mime.text import MIMEText from email.mime.text import MIMEText
import cgi
import email.utils import email.utils
import logging import logging
import argparse import argparse
@ -72,11 +73,51 @@ broken builds in Tumbleweed. You receive this mail because you are
marked as maintainer for the above mentioned package (or project marked as maintainer for the above mentioned package (or project
maintainer if the package has no explicit maintainer assigned) maintainer if the package has no explicit maintainer assigned)
Kind regards,
%(sender)s
""",
u"""Dear Package maintainers and hackers.
Below package(s) in %(project)s have been failing to build for at
least 4 weeks. We tried to send out notifications to the
configured bugowner/maintainers of the package(s), but so far no
fix has been submitted. This probably means that the
maintainer/bugowner did not yet find the time to look into the
matter and he/she would certainly appreciate help to get this
sorted.
""",
u"""
Unless somebody is stepping up and submitting fixes, the listed
package(s) are going to be removed from %(project)s.
Kind regards, Kind regards,
%(sender)s %(sender)s
""" """
) )
def SendMail(logger, project, sender, to, fullname, subject, text):
msg = MIMEText(text, _charset='UTF-8')
msg['Subject'] = subject
msg['To'] = email.utils.formataddr((to, fullname))
msg['From'] = sender
msg['Date'] = email.utils.formatdate()
msg['Message-ID'] = email.utils.make_msgid()
msg.add_header('Precedence', 'bulk')
msg.add_header('X-Mailer', '%s - Failure Notification' % project)
logger.info("%s: %s", msg['To'], msg['Subject'])
if args.dry:
logger.debug(msg.as_string())
else:
try:
s = smtplib.SMTP(args.relay)
s.sendmail(msg['From'], {msg['To'], sender }, msg.as_string())
s.quit()
except:
logger.error("Failed to send an email to %s (%s)" % (fullname, to))
pass
def main(args): def main(args):
# do some work here # do some work here
@ -112,6 +153,7 @@ def main(args):
Reminded = {} Reminded = {}
Person = {} Person = {}
ProjectComplainList = []
# Go through all the failed packages and update the reminder # Go through all the failed packages and update the reminder
for package in data: for package in data:
@ -157,6 +199,7 @@ def main(args):
for userid in maintainers: for userid in maintainers:
to = Person[userid][1] to = Person[userid][1]
fullname = Person[userid][2] fullname = Person[userid][2]
subject = '%s - %s - Build fail notification' % (project, package)
text = MAIL_TEMPLATES[Reminded[package].remindCount-1] % { text = MAIL_TEMPLATES[Reminded[package].remindCount-1] % {
'recepient': to, 'recepient': to,
'sender': sender, 'sender': sender,
@ -164,30 +207,32 @@ def main(args):
'package' : package, 'package' : package,
'date': time.ctime(Reminded[package].firstfail), 'date': time.ctime(Reminded[package].firstfail),
} }
msg = MIMEText(text, _charset='UTF-8') SendMail(logger, project, sender, to, fullname, subject, text)
msg['Subject'] = '%s - %s - Build fail notification' % (project, package) elif Reminded[package].remindCount == 4:
msg['To'] = email.utils.formataddr((to, fullname)) # Package has failed for 4 weeks - Collect packages to send a mail to openSUSE-factory@ (one mail per day max)
msg['From'] = sender ProjectComplainList.append(package)
msg['Date'] = email.utils.formatdate() elif Reminded[package].remindCount == 6:
msg['Message-ID'] = email.utils.make_msgid() # Package failed to build for 6 weeks - file a delete request
msg.add_header('Precedence', 'bulk') r = osc.core.Request()
msg.add_header('X-Mailer', '%s - Failure Notification' % project) r.add_action('delete', tgt_project=project, tgt_package=package)
logger.info("%s: %s", msg['To'], msg['Subject']) r.description = cgi.escape("[botdel] Package has failed to build for >= 6 weeks")
if args.dry: r.create(apiurl)
logger.debug(msg.as_string())
else:
try:
s = smtplib.SMTP(args.relay)
s.sendmail(msg['From'], {msg['To'], sender }, msg.as_string())
s.quit()
except:
logger.error("Failed to send an email to %s (%s)" % (fullname, to))
pass
elif Reminded[package].remindCount == 3: if (len(ProjectComplainList)):
logger.warning( "Package '%s' has been failing for three weeks - let's create a bug report" % package) # At least to report to the project for not building - send a mail to openSUSE-Factory
else: ProjectComplainList.sort()
logger.warning( "Package '%s' is no longer maintained - send a mail to factory maintainers..." % package) to = 'openSUSE-Factory@opensuse.org'
fullname = "openSUSE Factory - Mailing List"
subject = "%(project)s - Build fail notification" % {'project': project}
text = MAIL_TEMPLATES[2] % {
'project': project,
'packagelist': ProjectComplainList,
'sender': sender,
}
for pkg in ProjectComplainList:
text += "- %s\n" % pkg
text += MAIL_TEMPLATE[3]
SendMail(logger, project, sender, to, fullname, subject, text)
if __name__ == '__main__': if __name__ == '__main__':
parser = argparse.ArgumentParser(description='boilerplate python commmand line program') parser = argparse.ArgumentParser(description='boilerplate python commmand line program')
@ -213,4 +258,3 @@ if __name__ == '__main__':
logging.basicConfig(level = level) logging.basicConfig(level = level)
sys.exit(main(args)) sys.exit(main(args))