Как получить доступ к XML-версии CruiseContol.СЕТЕВЫЕ отчеты веб-панели мониторинга (по HTTP)?

StackOverflow https://stackoverflow.com/questions/239587

Вопрос

Мне нужно определить состояние последней сборки (успех / неудача), и я делаю это следующим образом:

report_url = 'http://.../ViewLatestBuildReport.aspx'
success_marker = '<td class="header-title" colspan="2">BUILD SUCCESSFUL</td>'
page = urllib.urlopen(report_url)
if all(success_marker not in line for line in page):
  # build is not good, do something
  ...

Но это расточительно (загружает всю HTML-страницу целиком), подвержено ошибкам (я уже столкнулся с ошибкой bytes / unicode) и хрупко.

Это было полезно?

Решение

Ладно, я вроде как разобрался в этом.CCTray отслеживает статус сборки путем опроса XmlServerReport.aspx, который представляет собой (сюрприз!) XML.

Итак, мое текущее решение выглядит следующим образом:

import sys, urllib, xml.sax, xml.sax.handler

report_url = 'http://.../CCNET/XmlServerReport.aspx'

class FoundBuildStatus(Exception):
  def __init__(self, status):
    self.build_status = status

class Handler(xml.sax.handler.ContentHandler):
  def startElement(self, name, attrs):
    if name == 'Project' and attrs.get('name') == '...':
      status = attrs.get('lastBuildStatus')
      if status:
        raise FoundBuildStatus(status)

page = urllib.urlopen(report_url)
try:
  xml.sax.parse(page, Handler())
except FoundBuildStatus, ex:
  if ex.build_status == 'Failure':
    # build is not good, do something
    ...

В моей среде это примерно в 8 раз быстрее, чем исходное решение на основе HTML.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top