BUILDBOT:如何知道触发构建的分支?

时间:2015-07-27 16:26:07

标签: git buildbot

我尝试为多个项目,git存储库和git分支配置buildbot。

对于每个人,我添加了一个带branches=[master, develop, release]的GitPoller。  它的工作但我不知道我必须在steps.Git branch论证中加入什么。如何知道触发构建的分支?

generic_factory(package)功能(第13行)

def add_git_poller(c, package, pollinterval=-2):
    name = package.get_uid()
    build_data = package.get_build_data()
    # get branches
    try:
        branches = build_data['branches']
    except KeyError:
        branches = ['master']
    workdir = os.path.join("gitpoller",util.safeTranslate(name))
    dwlogging.info("Add git poller '%s' (workdir=%s, project=%s, branches=%s, pollinterval=%i)" %
                   (name, workdir, name, branches, pollinterval))
    poller = plugins.changes.GitPoller(repourl=package.get_cvs_url(),
                                       project=name,
                                       workdir=workdir, 
                                       branches=branches,
                                       pollinterval=pollinterval)
    c['change_source'].append(poller)

def schedule_single_branch(c, package):
    name = package.get_uid()
    build_data = package.get_build_data()
    # get branches
    if 'branches' in build_data:
        branches = build_data['branches']
    else:
        branches = ['master']
    for branch in branches:
        s_name="%s_%s" % (branch, name)
        builders=[name]
        dwlogging.info("Add single branch scheduler '%s' (project=%s, branch=%s, builders=%s)" %
                       (s_name, name, branch, str(builders)))
        change_filter = plugins.util.ChangeFilter(branch=branch, project=name)
        scheduler = plugins.schedulers.SingleBranchScheduler(
                                        name=s_name,
                                        change_filter=change_filter,
                                        builderNames=builders)
        c['schedulers'].append(scheduler)

# ...

def add_builder(c, package):
    name = package.get_uid()
    dwlogging.trace("add builder for package %s" % name)
    available_slaves = slaves_config.keys()
    build_data = package.get_build_data()
    slavenames = build_data['slaves']
    for slavename in slavenames:
        if slavename not in available_slaves:
            raise Exception("Package '%s' : slave '%s' not exists" % (name, slavename))

    if len(slavenames) > 0:
        builddir = os.path.join("build",util.safeTranslate(name))
        tags = [package.get_repository().get_uid()]
        dwlogging.info("Add builder '%s' (builddir=%s, slaves=%s)" %
                       (name, builddir, str(slavenames)))
        f = generic_factory(package)
        builder_config = plugins.util.BuilderConfig(
                                        name=name,
                                        builddir=builddir,
                                        slavenames=slavenames,
                                        factory=f,
                                        tags=tags)
        c['builders'].append(builder_config)

def generic_factory(package):
    name = package.get_uid()
    dwlogging.info("Make build factory for '%s' package" % name)
    build_data = package.get_build_data()
    testdir = os.path.join("test",util.safeTranslate(name))
    factory = plugins.util.BuildFactory()
    # check out the source
    if build_data['cvs']['type'] == 'git':
        submodules = build_data['cvs'].get('submodules',False)
        dwlogging.info("Add git step (submodules=%s)" % str(submodules))
        factory.addStep(plugins.steps.Git(repourl=package.get_cvs_url(), 
                                          mode='full',
                                          submodules=submodules,
                                          branch='%%BRANCH%%')) # ???
    else:
        dwlogging.error("%s not implemented yet" % build_data['cvs']['type'])

    if 'steps' in build_data and build_data['steps']:
        for step_data in build_data['steps']:
            step_type = step_data.get('type')
            step_args = step_data.get('args')
            if not isinstance(step_args, (list, tuple)):
                step_args = [step_args]
            workdir = step_data.get('workdir', None)
            dwlogging.info("Add step %s (%s workdir:%s)" % (step_type, step_args, workdir))
            if step_type == 'command':
                factory.addStep(plugins.steps.ShellCommand(name="command (%s)" % step_args[0],
                                                           command=step_args,
                                                           workdir=workdir))
            elif step_type == 'compile':
                factory.addStep(plugins.steps.Compile(command=step_args,
                                                      warningPattern="^(.\*?):([0-9]+): [Ww]arning: (.\*)$",
                                                      warningExtractor=plugins.steps.Compile.warnExtractFromRegexpGroups,
                                                      workdir=workdir))
            elif step_type == 'pyflakes':
                command = ["pyflakes"] + step_args
                factory.addStep(plugins.steps.PyFlakes(command=command))
            elif step_type == 'pylint':
                for path in step_args:
                    factory.addStep(plugins.steps.PyLint(name="pylint (%s)" % path,
                                                         command=["pylint", path]))
            elif step_type == 'trial':
                for path in step_args:
                    factory.addStep(plugins.steps.Trial(name="trial (%s)" % path,
                                                        tests=path, 
                                                        testpath="python"))
            elif step_type == 'mkdir':
                factory.addStep(plugins.steps.MakeDirectory(dir=step_args[0]))

    factory.addStep(plugins.steps.RemovePYCs())
    return factory

for package_uid in packages:
    package = pkg_manager.get_package(package_uid)
    add_git_poller(c, package, pollinterval=300)
    schedule_single_branch(c, package)
    schedule_forced(c, package)
    schedule_try(c, package, schedule_try_port, [('sampleuser','samplepass')])
    schedule_try_port += 1
    add_builder(c, package)

2 个答案:

答案 0 :(得分:0)

Git step的Buildbot文档说:

  

分支

     

(可选):这指定当Build不提供自己的分支时要使用的分支的名称。如果未指定此参数,并且Build未提供分支,则将使用主分支。

我解释为默认Git步骤继承'更改触发构建的分支。因此,如果你只留下那个参数,它应该可以正常工作。

答案 1 :(得分:0)

实际上,您可以编写一个非常简单的函数来返回正在运行构建器步骤的分支的名称。

def getBranch(step):
    return step.getProperty("branch")

# Additionally, you can make additional checks for specific brancges like 

def isMaster(step):
    return step.getProperty("branch") == "master"

所以您要更改此

 factory.addStep(plugins.steps.Git(repourl=package.get_cvs_url(), 
                                          mode='full',
                                          submodules=submodules,
                                          branch='%%BRANCH%%'))

 factory.addStep(plugins.steps.Git(repourl=package.get_cvs_url(), 
                                              mode='full',
                                              submodules=submodules,
                                              branch=lambda step:getBranch(step))

这是从builbot 2.x版本起的