Странное поведение buildbot python
РЕДАКТИРОВАТЬ для некоторых объяснений: buildbot - это система непрерывной интеграции в Python, которой можно управлять через веб-интерфейс. В этом веб-интерфейсе у вас есть страница "Водопад", где вы можете выбрать конкретного строителя и запустить сборку с помощью кнопки "Форсировать сборку".
URL: http://trac.buildbot.net/
Предыстория: у нас есть группа строителей, которые непрерывны (проверяйте каждые несколько минут, если произошли изменения, и если да, перестраивайте) или каждую ночь (собирайте каждую ночь). В нашей системе пока есть только один конкретный корпоративный компоновщик для каждого проекта. Это было сделано путем обеспечения того, чтобы каждый проект находился под постоянным URL, например
https://myrepositioryurl/{$projectname}.
Затем, когда проекту требуется корпоративная сборка, вам нужно выбрать один проект XYZ, и сборочный бот предполагает, что проект должен быть извлечен в соответствии с
https://myrepositioryurl/{$projectname}.
Это очень жестко, и я хотел перенастроить buildbot, чтобы проекты могли находиться под разными URL. Во время настройки сборщиков, запускаемой "buildbot start master", файл конфигурации наших проектов читается и сохраняется в объекте ConfigParser. В следующем исходном коде это clzoptions var и мой URL, который я хочу использовать
https://mytesturl/XYZ.
для проекта XYZ. Теперь я добавил свои разные URL-адреса в запись "svnBaseURL" для тестового проекта. Теперь я столкнулся с чем-то, что я не совсем понимаю в своем классе Python, который создает конструкторы. Первый источник:
import os
import logging
from xcodebuild import xcodebuild
from projects import Projects
from buildbot.config import BuilderConfig
from buildbot.process.factory import BuildFactory
from buildbot.steps.source import SVN
from buildbot.steps.shell import ShellCommand, WithProperties
from buildbot.process.properties import Property
class builders(object):
clzoptions = Projects().options
def __init__(self):
aProject = Projects()
self.options = aProject.options
def enterprise_checkout_url(self, curProjectName):
return curProjectName
def create_enterprise_builder(self):
factory = BuildFactory()
factory.addStep(ShellCommand(name='svn checkout',
haltOnFailure=True,
description='svn checkout',
descriptionDone='svn checkout done',
command=['svn', 'checkout', '--username', 'admin', self.enterprise_checkout_url(WithProperties('%(project)s')), '.']))
builderConfig = BuilderConfig(name="foobuilder",
category="OnDemand",
slavenames=[ "buildslave01" ],
factory=factory)
return builderConfig
def get_all_builders(self):
builders = []
builders.append(self.create_enterprise_builder())
return builders
Я перепутал это с основной проблемой, внутри гораздо больше строителей. Ключевой функцией является self.enterprise_checkout_url(WithProperties('%(project)s')).
Если я назову этого строителя с именем проекта "XYZ" в Водопаде, я получу результат
svn checkout --username admin XYZ .
для ShellCommand. Хотя это бессмысленно, потому что это не URL, я вижу, что параметр curProjectName оценивается как "XYZ". Пока все просто, правда? Давайте теперь изменим эту функцию...
def enterprise_checkout_url(self, curProjectName):
return builders.clzoptions.get("XYZ", "svnBaseURL"))
и получить
svn checkout --username admin https://mytesturl/XYZ .
Это почти то, что мне нужно,
https://mytesturl/XYZ
это правильный путь. Но ключ постоянен, мне нужно, чтобы он был переменным. Но, по крайней мере, я знаю, что словарь существует и имеет правильную запись для XYZ.
Сейчас проблему я просто не понимаю.
Давайте попробуем сейчас
def enterprise_checkout_url(self, curProjectName):
return builders.clzoptions.get(curProjectName, "svnBaseURL"))
и ой, он не строит
ConfigParser.NoSectionError: No section: <buildbot.process.properties.WithProperties instance at 0x1073739e0>
Хорошо, на этапе компиляции curProjectName не может быть установлен, как насчет:
def enterprise_checkout_url(self, curProjectName):
projects = builders.clzoptions.sections()
for project in projects:
if project == curProjectName:
return builders.clzoptions.get(project, "svnBaseURL" )
который компилируется. Я получаю все свои проекты, проверяю правильность curProjectName и затем возвращаю svnBaseURL с ключом проекта, который должен быть равен curProjectName. Но я получаю:
<type 'exceptions.TypeError'>: 'NoneType' object is not iterable
Твой ход. Я пытался использовать str(), repr(), eval() на curProjectName, но безрезультатно. Я не могу получить доступ как к существующему словарю, так и к curProjectName.
1 ответ
Вам это поможет?
class builders(object):
builders = []
print 'id of buiders just created ==',id(builders)
def __init__(self,x):
self.the = x
def enterprise_checkout_url(self, curProjectName):
return curProjectName
def create_enterprise_builder(self,yy):
builderConfig = dict(descriptionDone='-SVN-',
command=yy)
return builderConfig
def get_all_builders(self):
print 'id of builders inside get_all_builders ==',id(builders)
print 'id of builders.builders inside get_all_builders ==',id(builders.builders)
builders.builders.append(self.create_enterprise_builder((self.the)))
return builders.builders
print 'id of class builders ==',id(builders)
print '\n################################\n'
b = builders('BOF')
print b.get_all_builders()
print '\n=================================\n'
b2 = builders('MOTO')
print b2.get_all_builders()
результат
id of buiders just created == 18709040
id of class builders == 13819408
################################
id of builders inside get_all_builders == 13819408
id of builders.builders inside get_all_builders == 18709040
[{'descriptionDone': '-SVN-', 'command': 'BOF'}]
=================================
id of builders inside get_all_builders == 13819408
id of builders.builders inside get_all_builders == 18709040
[{'descriptionDone': '-SVN-', 'command': 'BOF'}, {'descriptionDone': '-SVN-', 'command': 'MOTO'}]
РЕДАКТИРОВАТЬ
Проблема с моим кодом.
Если инструкция print b2.get_all_builders()
выполняется два раза, результат
id of buiders just created == 18709040
id of class builders == 13819408
################################
id of builders inside get_all_builders == 13819408
id of builders.builders inside get_all_builders == 18709040
[{'descriptionDone': '-SVN-', 'command': 'BOF'}]
=================================
id of builders inside get_all_builders == 13819408
id of builders.builders inside get_all_builders == 18709040
[{'descriptionDone': '-SVN-', 'command': 'BOF'}, {'descriptionDone': '-SVN-', 'command': 'MOTO'}]
id of builders inside get_all_builders == 13819408
id of builders.builders inside get_all_builders == 18709040
[{'descriptionDone': '-SVN-', 'command': 'BOF'}, {'descriptionDone': '-SVN-', 'command': 'MOTO'}, {'descriptionDone': '-SVN-', 'command': 'MOTO'}]
Один из словарей появляется два раза.
Поскольку я не очень хорошо понимаю вашу проблему и не уверен, чего именно вы хотите, я не знаю, как ее исправить