mirror of
git://git.yoctoproject.org/yocto-autobuilder2.git
synced 2025-07-19 11:59:02 +02:00

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>
180 lines
6.9 KiB
Python
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))
|