Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

buildbot: updates #91

Merged
merged 17 commits into from
Sep 20, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
416 changes: 186 additions & 230 deletions inventory/group_vars/buildbot

Large diffs are not rendered by default.

28 changes: 14 additions & 14 deletions inventory/host_vars/buildbot.berlin.freifunk.net/main.yml
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
$ANSIBLE_VAULT;1.1;AES256
35366637376531306361373131303633313938346633333539306465623739353864353162633939
6337386335376532353931313735326462346239333662350a393438313434343964306336393864
35633634363134343163623763326264366230643764653462373533363566366263376334383932
3765333830303234360a303031313061396232623632356337313566323538373734323831663430
66353639313561333437333562323765616261306662313135643663343565656438363135313466
34383133643735373139386530613633383239653163636631346333343234383864333865626666
62336663356563623638383561373536343538393532666461663231353532366364633065626135
30633032313164386535313239376663376333646436306530386431353838323337363935396636
65303737326531623463316430623931316535646331633938306361626530623861663931626465
38666664346537393537393766383466633366643233643235306131333331353731633366623232
37313538386465376366333562306566343031343461376339633165666635653337613763663462
64633037656331353433623131346635366562313837616261313833363433303964333132343065
62626231393839623565356565636635353434346237663563336239316639626637
---
bbworker_name: masterworker
bbworker_pwd: !vault |
$ANSIBLE_VAULT;1.1;AES256
35323564303562396566313735336535333937353937383333306338666565376463396432303330
6439333764633135363935353863383961343032363731330a656239353830316332613033663739
66353539653763333164616666343233656262393765386661653033306239376635333161303932
6136623236636335390a323763633261643338623435393866613339313332626466323639663738
37373863636162386430393636303433663238303965343237383032663562616563376333313132
36373639396238366534626330663137336233353531653331346239343337656238353036353131
316237353437373330343034626338396366

bbworker_contact: pktpls
bbworker_info: virtual worker, syncing builds etc.
2 changes: 1 addition & 1 deletion inventory/hosts
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,4 @@ f.tunnel.berlin.freifunk.net # vpn03h.berlin.freifunk.net
t-löffel.de

[other]
util.berlin.freifunk.net
util.berlin.freifunk.net
5 changes: 1 addition & 4 deletions play.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,9 @@
- systemli.letsencrypt

- name: Set up buildbot workers
# buildbot has docker already. Don't deploy podman for now.
hosts: buildbotworker, !buildbot.berlin.freifunk.net
hosts: buildbotworker
become: true
roles:
- alvistack.podman
- podman_fix
- buildbot_worker

- name: Set up config server
Expand Down
2 changes: 2 additions & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
ansible >= 2.13
black >= 23.9
isort >= 5.12
6 changes: 0 additions & 6 deletions requirements.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,12 @@ roles:
version: 1.0.8
- src: geerlingguy.nginx
version: 3.1.0
- src: geerlingguy.docker
version: 4.1.3
- src: systemli.letsencrypt
version: 2.1.0
- src: alvistack.podman
version: 6.3.1
collections:
- name: ansible.posix
version: 1.5.1
- name: community.mysql
version: 3.6.0
- name: community.general
version: 6.5.0
- name: community.docker
version: 3.4.3
28 changes: 17 additions & 11 deletions roles/buildbot/files/asyncbuild.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
# -*- python -*-
# ex: set filetype=python:

from buildbot.plugins import util, steps
from buildbot.process import build, buildstep, factory, logobserver
from typing import List

from buildbot.plugins import steps, util
from buildbot.process import build, buildstep, logobserver
from twisted.internet import defer
from twisted.python import log

from typing import List
# We don't care for "too long" lines. We don't use punchcards anymore!
# flake8: noqa


# AsyncBuildGenerator dynamically generates build steps from command output.
#
Expand All @@ -19,14 +23,14 @@ def __init__(self, stepFunc, **kwargs):
kwargs = self.setupShellMixin(kwargs)
super().__init__(**kwargs)
self.observer = logobserver.BufferLogObserver()
self.addLogObserver('stdio', self.observer)
self.addLogObserver("stdio", self.observer)
self.stepFunc = stepFunc

def getLines(self, stdout):
archs = []
for line in stdout.split('\n'):
for line in stdout.split("\n"):
arch = str(line.strip())
if arch and not arch.startswith('#'):
if arch and not arch.startswith("#"):
archs.append(arch)
return archs

Expand All @@ -36,11 +40,12 @@ def run(self):
yield self.runCommand(cmd)
result = cmd.results()
if result == util.SUCCESS:
self.build.addStepsAfterCurrentStep([
self.stepFunc(a) for a in self.getLines(self.observer.getStdout())
])
self.build.addStepsAfterCurrentStep(
[self.stepFunc(a) for a in self.getLines(self.observer.getStdout())]
)
return result


# AsyncTrigger is a Trigger step which executes in parallel with other AsyncTriggers.
# It's a useful middleground between waitForFinish=False and waitForFinish=True.
#
Expand All @@ -60,8 +65,8 @@ def _createStep(self):
self.name = yield self.build.render(self.name)
self.build.setUniqueStepName(self)
self.stepid, self.number, self.name = yield self.master.data.updates.addStep(
buildid=self.build.buildid,
name=self.name)
buildid=self.build.buildid, name=self.name
)

@defer.inlineCallbacks
def addStep(self):
Expand Down Expand Up @@ -91,6 +96,7 @@ def run(self):

return results


# AsyncBuild is a Build which can execute AsyncTrigger steps in parallel.
# It's a useful middleground between waitForFinish=False and waitForFinish=True.
#
Expand Down
36 changes: 26 additions & 10 deletions roles/buildbot/files/generate_autoupdate_json.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,27 +2,43 @@

# {{ ansible_managed }}

# silence mypy
# type: ignore

import argparse
import json
import os

# We don't care for "too long" lines. We don't use punchcards anymore!
# flake8: noqa

parser = argparse.ArgumentParser()
parser.add_argument('-v', dest='version', type=str, required=True,
help='falter-version that the autoupdate-file is for.')
parser.add_argument('-p', dest='dir', type=str, required=True,
help='version directory, in which there are tunneldigger- and notunnel- dirs. autoupdate.json will be placed in that directory too.')
parser.add_argument(
"-v",
dest="version",
type=str,
required=True,
help="falter-version that the autoupdate-file is for.",
)
parser.add_argument(
"-p",
dest="dir",
type=str,
required=True,
help="version directory, in which there are tunneldigger- and notunnel- dirs. autoupdate.json will be placed in that directory too.",
)
args = parser.parse_args()

# build autoupdate.json
autoupdate_json = {}
autoupdate_json[
"image_url"] = "https://firmware.berlin.freifunk.net/stable/{falter-version}/{flavour}/{target}"
"image_url"
] = "https://firmware.berlin.freifunk.net/stable/{falter-version}/{flavour}/{target}"
autoupdate_json["target"] = {}
autoupdate_json["falter-version"] = args.version

# get paths of all json-files
file_list = os.popen('find ' + args.dir + ' -name "*.json"').read().split()
file_list = os.popen("find " + args.dir + ' -name "*.json"').read().split()

# aggregate the content of all files
for fpath in file_list:
Expand All @@ -36,13 +52,13 @@
# print(profiles)

# get flavour and omit backbone-images
flavour = fpath.split('/')[-4]
flavour = fpath.split("/")[-4]
if flavour == "backbone":
continue

# get target and create dict, if not already created
target = '/'.join(fpath.split('/')[-3:-1])
if autoupdate_json.get("target").get(target) == None:
target = "/".join(fpath.split("/")[-3:-1])
if autoupdate_json.get("target").get(target) is None:
autoupdate_json["target"][target] = {}

# get hashsums
Expand All @@ -55,7 +71,7 @@
break

# add information to autoupdate.json
if autoupdate_json.get("target").get(target).get(model) == None:
if autoupdate_json.get("target").get(target).get(model) is None:
autoupdate_json["target"][target][model] = {}

if sha256 is not None:
Expand Down
83 changes: 46 additions & 37 deletions roles/buildbot/files/notify.py
Original file line number Diff line number Diff line change
@@ -1,37 +1,36 @@
# -*- python -*-
# ex: set filetype=python:

from buildbot.plugins import util, steps

from buildbot.plugins import util
from buildbot.process.results import statusToString
from buildbot.reporters.base import ReporterBase
from buildbot.reporters.generators.build import BuildStartEndStatusGenerator
from buildbot.reporters.generators.buildrequest import BuildRequestGenerator
from buildbot.reporters.message import MessageFormatterRenderable
from buildbot.util import httpclientservice
from buildbot.process.results import statusToString

from twisted.internet import defer
from twisted.python import log

import pprint

class MatrixNotifier(ReporterBase):

def __init__(self, homeserver=None, accessToken=None, room=None, **kwargs):
self.homeserver = homeserver
self.accessToken = accessToken
self.room = room
super().__init__(**kwargs)

def checkConfig(self, context=None, debug=None, verify=None, generators=None,
**kwargs):
def checkConfig(
self, context=None, debug=None, verify=None, generators=None, **kwargs
):
if generators is None:
generators = self._create_default_generators()

super().checkConfig(generators=generators, **kwargs)

@defer.inlineCallbacks
def reconfigService(self, context=None, debug=None,
verify=None, generators=None, **kwargs):
def reconfigService(
self, context=None, debug=None, verify=None, generators=None, **kwargs
):
self.debug = debug
self.verify = verify
self.context = self.setup_context(context)
Expand All @@ -41,50 +40,60 @@ def reconfigService(self, context=None, debug=None,
yield super().reconfigService(generators=generators, **kwargs)

def setup_context(self, context):
return context or util.Interpolate('buildbot/%(prop:buildername)s')
return context or util.Interpolate("buildbot/%(prop:buildername)s")

# This is needed but I have no clue what it does.
def _create_default_generators(self):
start_formatter = MessageFormatterRenderable('Build started.')
end_formatter = MessageFormatterRenderable('Build done.')
pending_formatter = MessageFormatterRenderable('Build pending.')
start_formatter = MessageFormatterRenderable("Build started.")
end_formatter = MessageFormatterRenderable("Build done.")
pending_formatter = MessageFormatterRenderable("Build pending.")

return [
BuildRequestGenerator(formatter=pending_formatter),
BuildStartEndStatusGenerator(start_formatter=start_formatter,
end_formatter=end_formatter)
BuildStartEndStatusGenerator(
start_formatter=start_formatter, end_formatter=end_formatter
),
]

@defer.inlineCallbacks
def sendMessage(self, reports):
b = reports[0]['builds'][0]
builder = b['builder']['name']

if 'number' not in b or b['complete'] != True or (builder != 'builds/targets' and builder != 'builds/packages'):
b = reports[0]["builds"][0]
builder = b["builder"]["name"]

if (
"number" not in b
or b["complete"] is not True
or (builder != "builds/targets" and builder != "builds/packages")
):
return

# pp = pprint.PrettyPrinter(indent=4)
# log.msg(f'MatrixNotifier.sendMessage - {pp.pformat(reports)}')

version = b['properties']['branch'][0]
if builder == 'builds/targets':
version = b['properties']['falterVersion'][0]
version = b["properties"]["branch"][0]
if builder == "builds/targets":
version = b["properties"]["falterVersion"][0]

result = statusToString(b['results'])
color = '#ff0000'
if b['results'] == 0:
color = '#008000'
result = statusToString(b["results"])
color = "#ff0000"
if b["results"] == 0:
color = "#008000"

url = b['url']
url = b["url"]

msg = f'{builder} @ {version} · {result} · {url}'
htmlmsg = f'{builder} @ {version} · <font color="{color}">{result}</font> · {url}'
msg = f"{builder} @ {version} · {result} · {url}"
htmlmsg = f'{builder} @ {version} · <font color="{color}">{result}</font> · {url}' # noqa: E501

http = yield httpclientservice.HTTPClientService.getService(
self.master, self.homeserver)

res = http.post(
f'/_matrix/client/r0/rooms/{self.room}/send/m.room.message?access_token={self.accessToken}',
json={'msgtype':'m.notice', 'body':msg,
'format':'org.matrix.custom.html', 'formatted_body':htmlmsg})

self.master, self.homeserver
)

http.post(
f"/_matrix/client/r0/rooms/{self.room}/send/m.room.message?access_token={self.accessToken}", # noqa: E501
json={
"msgtype": "m.notice",
"body": msg,
"format": "org.matrix.custom.html",
"formatted_body": htmlmsg,
},
)
Loading