いくつかの説明を編集してください: buildbot は、Web インターフェイスで制御できる Python の継続的統合システムです。この Web インターフェイスには、特定のビルダーを選択し、[Force build] ボタンでビルドをトリガーできる "Waterfall" ページがあります。
URL: http://trac.buildbot.net/
背景: 継続的 (変更が発生したかどうかを数分ごとにチェックし、変更があった場合は再構築) または夜間 (毎晩ビルド) のビルダーのクラスターがあります。これまでのところ、私たちのシステムには、すべてのプロジェクトに対して特定のエンタープライズ ビルダーが1 つしかありません。これは、すべてのプロジェクトが次のような一定の URL の下にある必要があることを強制することによって行われました。
https://myrepositioryurl/{$projectname}.
次に、プロジェクトがエンタープライズ ビルドを必要とする場合、1 つのプロジェクト XYZ を選択する必要があります。buildbot は、プロジェクトを以下でチェックアウトする必要があると想定します。
https://myrepositioryurl/{$projectname}.
これは非常に厳格であり、プロジェクトが異なる 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 の場合。これは 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
あなたの番。curProjectName で str()、repr()、eval() を使用しようとしましたが、役に立ちませんでした。既存の辞書と curProjectName の両方にアクセスできません。