yocto-autobuilder2/builders.py
Joshua Lock 7fabb26b63 builders: use yocto-autobuilder-helper's clobberdir script
Removing the build directory (with rm -fr) can take a significant amount
of time, longer than the standard buildbot timeout, which delays the
builds. Instead, we use the clobberdir script from the helper repository.

This script moves the directory contents out of the way to a location which
is reaped by a background process.
Unfortunately this assumes/requires a copy of the repository is kept in the
home directory of the user running buildbot.

Signed-off-by: Joshua Lock <joshua.g.lock@intel.com>
2018-02-28 21:58:18 +00:00

180 lines
6.9 KiB
Python

from buildbot.plugins import *
from yoctoabb import config
from yoctoabb.steps.writelayerinfo import WriteLayerInfo
import os
builders = []
def get_sstate_release_number():
# TODO: implement
# release_number = util.Interpolate("%(prop:yocto_number)s")
# if not release_number:
# return ""
# release_components = release_number.split('.', 3)
# return '.'.join(release_components).strip('.')
return "None"
def get_publish_dest():
# if deploy_artifacts property is False return None
return "None" # FIXME: based on SetDest?
@util.renderer
def ensure_props_set(props):
"""
When the various properties aren't set (i.e. a single builder was force
triggered instead of being triggered by the nightly) we need to ensure they
correct defaults are set and passed to the helper scripts.
"""
return {
"sharedrepolocation": props.getProperty("sharedrepolocation", "None"),
"is_release": props.getProperty("is_release", "None"),
"buildappsrcrev": props.getProperty("buildappsrcrev", "None")
}
def create_builder_factory():
f = util.BuildFactory()
# NOTE: Assumes that yocto-autobuilder repo has been cloned to home
# directory of the user running buildbot.
clob = os.path.expanduser("~/yocto-autobuilder-helper/janitor/clobberdir")
f.addStep(steps.ShellCommand(
command=[clob, util.Interpolate("%(prop:builddir)s/")],
name="Clobber build dir"))
f.addStep(steps.Git(
repourl='git://git.yoctoproject.org/yocto-autobuilder-helper',
workdir=util.Interpolate("%(prop:builddir)s/yocto-autobuilder-helper"),
mode='incremental',
name='Fetch yocto-autobuilder-helper'))
f.addStep(steps.SetProperties(properties=ensure_props_set))
f.addStep(WriteLayerInfo(name='Write main layerinfo.json'))
f.addStep(steps.ShellCommand(
command=[util.Interpolate("%(prop:builddir)s/yocto-autobuilder-helper/scripts/shared-repo-unpack"),
util.Interpolate("%(prop:builddir)s/layerinfo.json"),
util.Interpolate("%(prop:sharedrepolocation)s"),
util.Interpolate("%(prop:builddir)s/build"),
util.Property("buildername"),
util.Property("is_release")],
name="Unpack shared repositories"))
f.addStep(steps.ShellCommand(
command=[util.Interpolate("%(prop:builddir)s/yocto-autobuilder-helper/scripts/run-config"),
util.Property("buildername"),
util.Interpolate("%(prop:builddir)s/build/build"),
util.Interpolate("%(prop:branch_poky)s"),
util.Interpolate("%(prop:repo_poky)s"),
get_sstate_release_number(),
util.Interpolate("%(prop:buildappsrcrev)s"),
get_publish_dest(),
util.URLForBuild],
name="run-config",
timeout=16200)) # default of 1200s/20min is too short, use 4.5hrs
return f
# regular builders
f = create_builder_factory()
for builder in config.triggered_builders:
workers = config.builder_to_workers.get(builder, None)
if not workers:
workers = config.builder_to_workers['default']
builders.append(util.BuilderConfig(name=builder,
workernames=workers,
factory=f))
factory = util.BuildFactory()
# NOTE: Assumes that yocto-autobuilder repo has been cloned to home
# directory of the user running buildbot.
clob = os.path.expanduser("~/yocto-autobuilder-helper/janitor/clobberdir")
f.addStep(steps.ShellCommand(
command=[clob, util.Interpolate("%(prop:builddir)s/")],
name="Clobber build dir"))
# check out the source
factory.addStep(steps.Git(
repourl='git://git.yoctoproject.org/yocto-autobuilder-helper',
workdir=util.Interpolate("%(prop:builddir)s/yocto-autobuilder-helper"),
mode='incremental',
name='Fetch yocto-autobuilder-helper'))
factory.addStep(WriteLayerInfo(name='Write main layerinfo.json'))
factory.addStep(steps.ShellCommand(
command=[
util.Interpolate("%(prop:builddir)s/yocto-autobuilder-helper/scripts/prepare-shared-repos"),
util.Interpolate("%(prop:builddir)s/layerinfo.json"),
util.Interpolate("{}/%(prop:buildername)s-%(prop:buildnumber)s".format(config.sharedrepodir)),
config.publish_dest],
name="Prepare shared repositories"))
factory.addStep(steps.SetProperty(
property="sharedrepolocation",
value=util.Interpolate("{}/%(prop:buildername)s-%(prop:buildnumber)s".format(config.sharedrepodir))
))
# shared-repo-unpack
factory.addStep(steps.ShellCommand(
command=[
util.Interpolate("%(prop:builddir)s/yocto-autobuilder-helper/scripts/shared-repo-unpack"),
util.Interpolate("%(prop:builddir)s/layerinfo.json"),
util.Interpolate("{}/%(prop:buildername)s-%(prop:buildnumber)s".format(config.sharedrepodir)),
util.Interpolate("%(prop:builddir)s/build"),
util.Property("buildername"),
util.Property("is_release")],
name="Unpack shared repositories"))
# run-config
factory.addStep(steps.ShellCommand(
command=[
util.Interpolate("%(prop:builddir)s/yocto-autobuilder-helper/scripts/run-config"),
util.Property("buildername"),
util.Interpolate("%(prop:builddir)s/build/build"),
util.Interpolate("%(prop:branch_poky)s"),
util.Interpolate("%(prop:repo_poky)s"),
get_sstate_release_number(),
"None",
get_publish_dest(),
util.URLForBuild],
name="run-config",
timeout=16200)) # default of 1200s/20min is too short, use 4.5hrs
# trigger the buildsets contained in the nightly set
def get_props_set():
set_props = {
"sharedrepolocation": util.Interpolate("{}/%(prop:buildername)s-%(prop:buildnumber)s".format(config.sharedrepodir)),
"is_release": util.Property("is_release"),
"buildappsrcrev": "None"
}
for repo in config.repos:
set_props["branch_%s" % repo] = util.Property("branch_%s" % repo)
set_props["commit_%s" % repo] = util.Property("commit_%s" % repo)
set_props["repo_%s" % repo] = util.Property("repo_%s" % repo)
return set_props
factory.addStep(steps.Trigger(schedulerNames=['nowait'],
waitForFinish=False,
set_properties=get_props_set()))
factory.addStep(steps.Trigger(schedulerNames=['wait'],
waitForFinish=True,
set_properties=get_props_set()))
# selftest
factory.addStep(steps.ShellCommand(
command=". ./oe-init-build-env; bitbake-selftest",
workdir=util.Interpolate("%(prop:builddir)s/build")
))
# TODO: trigger buildhistory_nowait - possibly no longer required?
# TODO: send QA mail if a release - compose and pass to sendmail command?
# TODO: update Current Link if published
builders.append(
util.BuilderConfig(name="nightly",
workernames=config.workers,
factory=factory))