编辑一些说明:buildbot是python中的连续集成系统,可以通过Web界面进行控制。在此Web界面中,您具有“瀑布”页面,您可以在其中选择特定的构建器并使用“强制构建”按钮触发构建。
网址: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。
我现在在测试项目的“ svnBaseURL”条目下添加了不同的URL。现在,我在创建构建器的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。尽管这不是网址,这很荒谬,但我发现
参数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
轮到你了。我试图在curProjectName上使用str(),repr(),eval(),但无济于事。我无法同时访问现有字典和curProjectName。
最佳答案
这对您有帮助吗?
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'}]
其中一本字典出现两次。
由于我不太清楚您的问题,也不确定您要的是什么,所以我不知道如何解决
关于python - 奇怪的buildbot Python行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13706654/