2011-01-31 40 views
0

一些人在我的組織擁有來自Perforce公司名稱不同的電子郵件名稱,所以我需要創建一個IEmailLookup推導,它覆蓋的getAddress做我的惡招投標:buildbot不接受我的MailNotifier的IEMailLookup對象

(從我Master.cfg中)

class MyIEmailLookup: 
    from buildbot import interfaces 
    __implements__ = interfaces.IEmailLookup 

    def getAddresses(user): 
     address_dict = {"user1", "[email protected]_domain.com"} 
     try: 
      address = address_dict[user] 
     except KeyError: 
      address = user + "@our_domain.com" 
     return address 

maillookup = MyIEmailLookup() 

from buildbot.status import mail 

c['status'].append(mail.MailNotifier(.... 
            .... 
            lookup=maillookup 
            )) 

我已經試過任何數量的排列,但我要麼得到:

Traceback (most recent call last): 
    File "/Library/Python/2.6/site-packages/buildbot-0.8.3p1-py2.6.egg/buildbot/scripts/runner.py", line 1071, in doCheckConfig 
    ConfigLoader(configFileName=configFileName) 
    File "/Library/Python/2.6/site-packages/buildbot-0.8.3p1-py2.6.egg/buildbot/scripts/checkconfig.py", line 46, in __init__ 
    self.loadConfig(configFile, check_synchronously_only=True) 
    File "/Library/Python/2.6/site-packages/buildbot-0.8.3p1-py2.6.egg/buildbot/master.py", line 727, in loadConfig 
    exec f in localDict 
    File "/Users/playbuilder/buildbot/master.cfg", line 207, in <module> 
    lookup=maillookup 
    File "/Library/Python/2.6/site-packages/buildbot-0.8.3p1-py2.6.egg/buildbot/status/mail.py", line 293, in __init__ 
    assert interfaces.IEmailLookup.providedBy(lookup) 
AssertionError 

...或任何其他一些問題,依賴新生因爲我試圖實現IEmailLookup接口。

我使用buildbot 0.8.3p1和python 2.6.1。

我看到如何做到這一點的珍貴的幾個例子,其中每一個例子都在我的上下文中失敗。我在這裏錯過了什麼?

回答

2

我剛剛自己解決了這個問題。

首先,你需要添加(在文件的頂部某處)

from zope.interface import implements 

,然後改變

__implements__ = interfaces.IEmailLookup 

if implements: 
    implements(interfaces.IEmailLookup) 
else: 
    __implements__ = interfaces.IEmailLookup 
+0

+1的輸入,但我早就放棄了在buildbot上並切換到Jenkins。我對這個決定感到無比高興。 – Sniggerfardimungus 2011-03-23 19:04:20

1

如果你想從獲取電子郵件perforce用戶,您可以使用此類:

# .-----------------------. 
# | Perforce Email Lookup | 
# `-----------------------' 

from twisted.internet import defer, utils 
from buildbot.util import ComparableMixin 
from buildbot.interfaces import IEmailLookup 
from zope.interface import implements 
import os 
import re 

class PerforceEmailLookup(ComparableMixin): 
    implements(IEmailLookup) 

    compare_attrs = ["p4port", "p4user", "p4passwd", "p4bin"] 

    env_vars = ["P4CLIENT", "P4PORT", "P4PASSWD", "P4USER", 
       "P4CHARSET"] 

    def __init__(self, 
       p4port = None, 
       p4user = None, 
       p4passwd = None, 
       p4bin = 'p4'): 
     self.p4port = p4port 
     self.p4user = p4user 
     self.p4passwd = p4passwd 
     self.p4bin = p4bin 
     self.email_re = re.compile(r"Email:\s+(?P<email>\[email protected]\S+)\s*$") 

    def _get_process_output(self, args): 
     env = dict([(e, os.environ.get(e)) for e in self.env_vars if os.environ.get(e)]) 
     d = utils.getProcessOutput(self.p4bin, args, env) 
     return d 

    @defer.deferredGenerator  
    def getAddress(self, name): 

     if '@' in name: 
      yield name 
      return 

     args = [] 
     if self.p4port: 
      args.extend(['-p', self.p4port]) 
     if self.p4user: 
      args.extend(['-u', self.p4user]) 
     if self.p4passwd: 
      args.extend(['-P', self.p4passwd]) 
     args.extend(['user', '-o', name]) 

     wfd = defer.waitForDeferred(self._get_process_output(args)) 
     yield wfd 
     result = wfd.getResult() 

     for line in result.split('\n'): 
      line = line.strip() 
      if not line: continue 
      m = self.email_re.match(line) 
      if m: 
       yield m.group('email') 
       return 

     yield name 

使用看起來像:

c['status'].append(
    MailNotifier(
     sendToInterestedUsers = True, 
     mode     = 'failing', 
     lookup     = PerforceEmailLookup(
             p4port = "perforce:1666", 
             p4user = "buildbot", 
             p4passwd = "buildbot"))) 
0

試試這個:

from buildbot.interfaces import IEmailLookup 
    from buildbot.util import ComparableMixin 
    from zope.interface import implements 
    class lookup_example_email(ComparableMixin): 
     implements(IEmailLookup) 
     def getAddress(self,user): 
      return "%[email protected]"%(user) 

...

mn = MailNotifier(..., lookup=lookup_example_email(), extraRecipients=m) 
相關問題