yocto-autobuilder2/builders.py
Joshua Lock 4fd189ab38 Initial prototype of using yocto-autobuilder-helper scripts
Initial prototype of using yocto-autobuilder-helper scripts from vanilla
buildbot to replicate yocto-autobuilder configuration.

* README.md is updated to describe goals and approach
* TODO contains known issues and work items, TODO: comments in the code
  point to specific locations of work

Signed-off-by: Joshua Lock <joshua.g.lock@intel.com>
2018-02-22 10:38:19 +00:00

168 lines
6.3 KiB
Python

from buildbot.plugins import *
from yoctoab import config
from yoctoab.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()
# FIXME: use RP's script
f.addStep(steps.ShellCommand(
command=["rm", "-fr", 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"))
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()
# FIXME: use RP's script
factory.addStep(steps.ShellCommand(
command=["rm", "-fr", 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"))
# trigger the buildsets contained in the nightly set
set_props = {
"sharedrepolocation": util.Interpolate("{}/%(prop:buildername)s-%(prop:buildnumber)s".format(config.sharedrepodir)),
"is_release": util.Property("is_release"),
"buildappsrcrev": "None",
"branch_poky": util.Property("branch_poky"),
"commit_poky": util.Property("commit_poky"),
"repo_poky": util.Property("repo_poky")
}
factory.addStep(steps.Trigger(schedulerNames=['nowait'],
waitForFinish=False,
set_properties=set_props))
factory.addStep(steps.Trigger(schedulerNames=['wait'],
waitForFinish=True,
set_properties=set_props))
# 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))