Project

General

Profile

Old instructions, needs to be updated

BuildBot Config

Master

Installation

adduser --home /var/lib/buildbot --disabled-password --disabled-login --gecos "Buildbot user" buildbot
apt-get install -y python3-venv build-essential python3-dev libssl-dev libffi-dev libmariadb-dev-compat mercurial
su - buildbot
python3 -m venv sandbox
source sandbox/bin/activate
pip install --upgrade pip
pip install 'buildbot[bundle]' mysqlclient
exit
su - buildbot -c '(source sandbox/bin/activate; buildbot create-master master)'

Developers try jobs

addgroup developers
mkdir -p /var/lib/buildbot/jobdir/{new,cur,tmp}
chown -R buildbot.developers /var/lib/buildbot/jobdir
chmod -R g+rwx,o-rwx /var/lib/buildbot/jobdir
adduser ${UN} developers

MySQL database initialization

echo "DROP DATABASE IF EXISTS ${BUILDBOT_DB_NAME};" | mysql
echo "DROP USER IF EXISTS '${BUILDBOT_DB_USER}'@'localhost';" | mysql
echo "CREATE DATABASE ${BUILDBOT_DB_NAME};" | mysql
echo "CREATE USER IF NOT EXISTS '${BUILDBOT_DB_USER}'@'localhost' IDENTIFIED BY '${BUILDBOT_DB_PASS}';" | mysql
echo "GRANT ALL ON ${BUILDBOT_DB_NAME}.* TO '${BUILDBOT_DB_USER}'@'localhost';" | mysql
echo "FLUSH PRIVILEGES;" | mysql
su - buildbot -c '(source sandbox/bin/activate; buildbot upgrade-master master)'
su - buildbot -c '(source sandbox/bin/activate; buildbot checkconfig master)'
su - buildbot -c '(source sandbox/bin/activate; buildbot restart master)'

SystemD script

cat << EOF > /etc/systemd/system/buildbot-master.service
[Unit]
Description=BuildBot master service
After=network.target
[Service]
User=buildbot
Group=buildbot
WorkingDirectory=/var/lib/buildbot/
ExecStart=/var/lib/buildbot/sandbox/bin/buildbot start --nodaemon master
ExecStop=/var/lib/buildbot/sandbox/bin/buildbot stop master
ExecReload=/var/lib/buildbot/sandbox/bin/buildbot reconfig master
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload 
systemctl enable buildbot-master

Basic configuration

cat << EOF > /var/lib/buildbot/master/master.cfg
from buildbot.plugins import *
c = BuildmasterConfig = {}

c['protocols'] = {'pb': {'port': 9989}}
c['workers'] = [
worker.Worker("bb-src", "pass!"),
worker.Worker("bb-lin", "pass!"),
worker.Worker("bb-deb", "pass!"),
worker.Worker("bb-mingw", "pass!"),
worker.Worker("macos-monterey", "pass!"),
]

c['change_source'] = []
cs_mkernel = changes.HgPoller(repourl='/srv/hg/mkernel', workdir='mkernel', pollInterval=30, branch='') 
#cs_mkernel=changes.HgPoller(repourl='http://hg.cerbelle.net/hg/mkernel', workdir='mkernel', pollInterval=30, branch='')
c['change_source'].append(cs_mkernel)

c['projects'] = [
    util.Project(name="mkernel",
                 description="Micro_Kernel applicationd"),
]

c['builders'] = []

c['schedulers'] = []

c['services'] = []

c['title'] = "Buildbot Cerbelle" 
c['titleURL'] = "https://redmine.cerbelle.net/" 
c['buildbotURL'] = "https://buildbot.cerbelle.net/" 
c['www'] = dict(port="tcp:8010:interface=127.0.0.1", plugins=dict(waterfall_view={}, console_view={}, grid_view={}))
c['db'] = { 'db_url' : "mysql://${BUILDBOT_DB_USER}:${BUILDBOT_DB_PASS}@localhost/${BUILDBOT_DB_NAME}?max_idle=300" }
EOF

BuildBot source package

To build the source package and test it

Dependencies

apt-get install -y mercurial autogen autoconf autopoint libtool pkg-config gettext g++ make

Buildbot builder

srcpkg = util.BuildFactory()
srcpkg.addStep(steps.ShellCommand(name='Cleanup environment', command=['sudo', 'rm', '-Rf', '../build']))
srcpkg.addStep(steps.Mercurial(name="Clone repository",repourl='http://hg.cerbelle.net/hg/mkernel', mode='full', method='fresh', branchType='inrepo'))
srcpkg.addStep(steps.SetPropertyFromCommand(name="Get package name", command="grep AC_INIT configure.ac | sed 's~.*\[\(.*\)\].*\[\(.*\)\].*\[\(.*\)\].*~\\1~'", property="package"))
srcpkg.addStep(steps.SetPropertyFromCommand(name="Get package version", command="grep AC_INIT configure.ac | sed 's~.*\[\(.*\)\].*\[\(.*\)\].*\[\(.*\)\].*~\\2~'", property="version"))
srcpkg.addStep(steps.ShellCommand(name="Generate autotools files",command=["./bootstrap.sh"]))
srcpkg.addStep(steps.Configure(name="Configure"))
srcpkg.addStep(steps.Compile(name="Make dist",command=["make", "dist" ], warningPattern="^Warning: "))
srcpkg.addStep(steps.Test(name="Make distcheck",command=["make", "distcheck" ], warningPattern="^Warning: ", warnOnFailure=False))
srcpkg.addStep(steps.MultipleFileUpload(name="Publish files",
  workersrcs=[
    util.Interpolate("%(prop:package)s-%(prop:version)s.tar.gz"),
    util.Interpolate("%(prop:package)s-%(prop:version)s.tar.bz2"),
    util.Interpolate("%(prop:package)s-%(prop:version)s.tar.xz"),
    util.Interpolate("%(prop:package)s-%(prop:version)s.zip"),
  ],
  masterdest=util.Interpolate("/var/www/buildbot.cerbelle.net/%(prop:package)s/%(prop:version)s"), 
  mode=0o755,
  url=util.Interpolate("http://buildbot.cerbelle.net/%(prop:package)s/%(prop:version)s/")))
srcpkg.addStep(steps.MasterShellCommand(name="Fix www folders permissions",command=["chmod", "-R", "u+rw,go+r", util.Interpolate("/var/www/buildbot.cerbelle.net/%(prop:package)s")]))
srcpkg.addStep(steps.Trigger(
  schedulerNames=['MKernel_Triggerable'],
  waitForFinish=False,
  updateSourceStamp=True,
  set_properties={
    'package'  : util.Interpolate("%(prop:package)s"),
    'version'  : util.Interpolate("%(prop:version)s"),
}))
c['builders'].append( util.BuilderConfig(
    project="mkernel",
    name="Sources",
    workernames=["bb-src"],
    factory=srcpkg))

BuildBot Linux builder

To build :
  • The binary archive
  • The documentation archive
  • The development archive
  • The AppImage executable

Dependencies

apt-get install -y g++ make doxygen libcppunit-dev pkg-config fuse3

Builder

binlin = util.BuildFactory()
binlin.addStep(steps.ShellCommand(name='Cleanup environment', command=['rm', '-Rf', util.Interpolate('%(prop:builddir)s/build')]))
binlin.addStep(steps.FileDownload(name="Download sources",mastersrc=util.Interpolate("/var/www/buildbot.cerbelle.net/%(prop:package)s/%(prop:version)s/%(prop:package)s-%(prop:version)s.tar.gz"),workerdest=util.Interpolate("%(prop:package)s-%(prop:version)s.tar.gz")))
binlin.addStep(steps.ShellCommand(name='Extract sources from dist', command=['tar', 'xvzf', util.Interpolate("%(prop:package)s-%(prop:version)s.tar.gz")]))
binlin.addStep(steps.ShellCommand(name='Create a build folder', command=['mkdir', util.Interpolate("%(prop:package)s-%(prop:version)s-build")]))
binlin.addStep(steps.ShellCommand(name='Out of tree default configuration', command=[util.Interpolate("../%(prop:package)s-%(prop:version)s/configure"), '--prefix=/usr' ], workdir=util.Interpolate("build/%(prop:package)s-%(prop:version)s-build")))
binlin.addStep(steps.Compile(name="Compile", command=['make', util.Interpolate("CFLAGS=-DBBID=\\\"%(prop:buildnumber)s\\\""), 'clean', 'all' ], workdir=util.Interpolate("build/%(prop:package)s-%(prop:version)s-build"), warningPattern="^Warning: "))
binlin.addStep(steps.Test(name="Test", command=["make","check"],workdir=util.Interpolate("build/%(prop:package)s-%(prop:version)s-build"), warningPattern="^Warning: "))
binlin.addStep(steps.Compile(name="Install", command=['make', 'install', util.Interpolate('DESTDIR=%(prop:builddir)s/build/%(prop:package)s-%(prop:version)s-linux')], workdir=util.Interpolate("build/%(prop:package)s-%(prop:version)s-build"), warningPattern="^Warning: "))
binlin.addStep(steps.ShellCommand(name='Create the archive', command=['tar', 'cvzf', util.Interpolate('%(prop:package)s-%(prop:version)s-linux.tar.gz'), util.Interpolate('%(prop:package)s-%(prop:version)s-linux')]))
binlin.addStep(steps.FileUpload(workersrc=util.Interpolate('%(prop:package)s-%(prop:version)s-linux.tar.gz'), masterdest=util.Interpolate('/var/www/buildbot.cerbelle.net/%(prop:package)s/%(prop:version)s/%(prop:package)s-%(prop:version)s-linux.tar.gz'),mode=0o755,urlText="Linux binaries",url=util.Interpolate("http://buildbot.cerbelle.net/%(prop:package)s/%(prop:version)s/%(prop:package)s-%(prop:version)s-linux.tar.gz")))
binlin.addStep(steps.ShellCommand(name="Get linuxdeploy for Appimages",command=["wget","https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage"]))
binlin.addStep(steps.ShellCommand(name="Make linuxdeploy executable",command=["chmod","+x","linuxdeploy-x86_64.AppImage"]))
binlin.addStep(steps.ShellCommand(name='Build AppImage', command=["./linuxdeploy-x86_64.AppImage","--appdir",util.Interpolate('%(prop:package)s-%(prop:version)s-linux'),"-e",util.Interpolate('%(prop:package)s-%(prop:version)s-linux/usr/bin/mkernel'),"-i",util.Interpolate("%(prop:package)s-%(prop:version)s/resources/mkernel.png"),"-d",util.Interpolate("%(prop:package)s-%(prop:version)s/resources/mkernel.desktop"),"--output","appimage" ]))
binlin.addStep(steps.FileUpload(workersrc="MKernel-x86_64.AppImage", masterdest=util.Interpolate('/var/www/buildbot.cerbelle.net/%(prop:package)s/%(prop:version)s/MKernel-x86_64.AppImage'),mode=0o755,urlText="Linux AppImage",url=util.Interpolate("http://buildbot.cerbelle.net/%(prop:package)s/%(prop:version)s/MKernel-x86_64.AppImage")))
c['builders'].append( util.BuilderConfig(
    project="mkernel",
    name="Linux",
    workernames=["bb-lin"],
    factory=binlin))

BuildBot Debian builder

To build and test the DEB packages

Dependencies

apt-get install -y pbuilder

Builder

bindeb = util.BuildFactory()
bindeb.addStep(steps.SetProperty(name="Compute basename", property="basename", value=util.Interpolate("%(prop:package)s-%(prop:version)s")))
bindeb.addStep(steps.ShellCommand(name='Cleanup environment', command=['rm', '-Rf', util.Interpolate('%(prop:builddir)s/build')]))
bindeb.addStep(steps.FileDownload(name="Download sources", mastersrc=util.Interpolate("/var/www/buildbot.cerbelle.net/%(prop:package)s/%(prop:version)s/%(prop:basename)s.tar.gz"),workerdest=util.Interpolate("%(prop:basename)s.tar.gz")))
bindeb.addStep(steps.ShellCommand(name='Extract sources from dist', command=['tar', 'xvzf', util.Interpolate("%(prop:basename)s.tar.gz")]))
bindeb.addStep(steps.ShellCommand(name='Rename src dist file', command=['mv', util.Interpolate("%(prop:basename)s.tar.gz"), util.Interpolate("%(prop:package)s_%(prop:version)s.orig.tar.gz")]))
bindeb.addStep(steps.DebPbuilder(architecture="amd64",distribution="bullseye",workdir=util.Interpolate("build/%(prop:basename)s")))
bindeb.addStep(steps.MultipleFileUpload(name="Publish files", 
                                   workersrcs=[
                                       util.Interpolate("%(prop:basename)s/%(prop:package)s_%(prop:version)s-1_amd64.buildinfo"),
                                       util.Interpolate("%(prop:basename)s/%(prop:package)s_%(prop:version)s-1_amd64.changes"),
                                       util.Interpolate("%(prop:basename)s/%(prop:package)s_%(prop:version)s-1_amd64.deb"),
                                       util.Interpolate("%(prop:basename)s/%(prop:package)s_%(prop:version)s-1.debian.tar.xz"),
                                       util.Interpolate("%(prop:basename)s/%(prop:package)s_%(prop:version)s-1.dsc"),
                                       util.Interpolate("%(prop:basename)s/%(prop:package)s_%(prop:version)s-1_source.changes"),
                                       util.Interpolate("%(prop:basename)s/%(prop:package)s_%(prop:version)s.orig.tar.gz"),
                                       util.Interpolate("%(prop:basename)s/%(prop:package)s-dbgsym_%(prop:version)s-1_amd64.deb")
                                   ],
                                   mode=0o755,
                                   masterdest=util.Interpolate("/var/www/buildbot.cerbelle.net/%(prop:package)s/%(prop:version)s/debian"),
                                   url=util.Interpolate("http://buildbot.cerbelle.net/%(prop:package)s/%(prop:version)s/debian")))
bindeb.addStep(steps.MasterShellCommand(name="Fix www folders permissions",command=["chmod", "-R", "u+rw,go+r", util.Interpolate("/var/www/buildbot.cerbelle.net/%(prop:package)s")]))
c['builders'].append( util.BuilderConfig(
    name="Debian",
    workernames=["bb-deb"],
    factory=bindeb))

Windows (MinGW) builder

Dependencies



	

Builder



	

MacOS (Monterey) builder

Dependencies



	

Builder


Also available in: PDF HTML TXT