[Scummvm-git-logs] scummvm-sites director-buildbot -> 0073195c9e3e524f024cef2ec8da04a3bd7ead62

rvanlaar noreply at scummvm.org
Tue Apr 5 14:19:46 UTC 2022


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm-sites' repo located at https://github.com/scummvm/scummvm-sites .

Summary:
0073195c9e Import code changes made directly on server


Commit: 0073195c9e3e524f024cef2ec8da04a3bd7ead62
    https://github.com/scummvm/scummvm-sites/commit/0073195c9e3e524f024cef2ec8da04a3bd7ead62
Author: Roland van Laar (roland at rolandvanlaar.nl)
Date: 2022-04-05T16:18:16+02:00

Commit Message:
Import code changes made directly on server

- deletes deploy files needed by dokku/docker
- make it multi master
- specify cache parameters tuned for scummvm

Changed paths:
  R CHECKS
  R Procfile
  R apt-packages
  R nginx.conf.sigil
  R runtime.txt
  R test-deploy/cloudinit.sh
  R test-deploy/deploy.sh
    buildbot.tac
    director/build_factory.py
    director/env.py
    director/scummvm_reporter.py
    director/targets.py
    director/vendor/reporter_utils.py
    master.py
    poetry.lock
    pyproject.toml


diff --git a/CHECKS b/CHECKS
deleted file mode 100644
index 0320a66..0000000
--- a/CHECKS
+++ /dev/null
@@ -1 +0,0 @@
-/ buildbot
diff --git a/Procfile b/Procfile
deleted file mode 100644
index a518108..0000000
--- a/Procfile
+++ /dev/null
@@ -1,2 +0,0 @@
-release: buildbot upgrade-master
-web: buildbot start --nodaemon .
diff --git a/apt-packages b/apt-packages
deleted file mode 100644
index ab70787..0000000
--- a/apt-packages
+++ /dev/null
@@ -1,2 +0,0 @@
-libsdl2-dev
-ccache
diff --git a/buildbot.tac b/buildbot.tac
index ca7e8c4..b25a1c6 100644
--- a/buildbot.tac
+++ b/buildbot.tac
@@ -1,7 +1,10 @@
-import os
+import os, sys
 
 from twisted.application import service
-from buildbot.master import BuildMaster
+from director.vendor.buildmaster import BuildMaster
+#from buildbot.master import BuildMaster
+
+master_name = os.environ["MASTER_NAME"]
 
 basedir = '.'
 rotateLength = 10000000
@@ -18,13 +21,11 @@ if basedir == '.':
 # note: this line is matched against to check that this is a buildmaster
 # directory; do not edit it.
 application = service.Application('buildmaster')
-from twisted.python.logfile import LogFile
 from twisted.python.log import ILogObserver, FileLogObserver
-logfile = LogFile.fromFullPath(os.path.join(basedir, "twistd.log"), rotateLength=rotateLength,
-                                maxRotatedFiles=maxRotatedFiles)
-application.setComponent(ILogObserver, FileLogObserver(logfile).emit)
+application.setComponent(ILogObserver, FileLogObserver(sys.stdout).emit)
 
-m = BuildMaster(basedir, configfile, umask)
+#m = BuildMaster(basedir, configfile, umask)
+m = BuildMaster(basedir, configfile, umask, master_name=master_name)
 m.setServiceParent(application)
 m.log_rotation.rotateLength = rotateLength
 m.log_rotation.maxRotatedFiles = maxRotatedFiles
diff --git a/director/build_factory.py b/director/build_factory.py
index 95d0a7d..a6071d5 100644
--- a/director/build_factory.py
+++ b/director/build_factory.py
@@ -1,18 +1,16 @@
 """Build Factory to configure, compile and build the scummvm binary."""
 
-from typing import Dict, Any
-
 import os.path
+from typing import Any, Dict
 
 from buildbot.plugins import steps, util
-from .env import env
 
 default_step_kwargs: Dict[str, Any] = {"logEnviron": False}
 
 default_env: Dict[str, str] = {
     "SDL_VIDEODRIVER": "dummy",
     "SDL_AUDIODRIVER": "dummy",
-    "ASAN_OPTIONS": "detect_leaks=0:abort_on_error=1:disable_coredump=0:unmap_shadow_on_exit=1"
+    "ASAN_OPTIONS": "detect_leaks=0:abort_on_error=1:disable_coredump=0:unmap_shadow_on_exit=1",
 }
 
 
@@ -31,7 +29,7 @@ def configure_has_not_been_run(step):
 build_factory = util.BuildFactory()
 # check out the source
 checkout_step = steps.GitHub(
-    repourl=env["REPOSITORY"], mode="incremental", **default_step_kwargs,
+    repourl="https://github.com/scummvm/scummvm", mode="incremental", **default_step_kwargs,
 )
 build_factory.addStep(checkout_step)
 
@@ -58,7 +56,12 @@ build_factory.addStep(
 
 build_factory.addStep(
     steps.Configure(
-        command=["./configure", "--disable-all-engines", "--enable-engine=director", "--enable-asan"],
+        command=[
+            "./configure",
+            "--disable-all-engines",
+            "--enable-engine=director",
+            "--enable-asan",
+        ],
         env={"CXX": "ccache g++"},
         doStepIf=configure_has_not_been_run,
         **default_step_kwargs,
diff --git a/director/env.py b/director/env.py
index 8551a4a..dc437b8 100644
--- a/director/env.py
+++ b/director/env.py
@@ -2,14 +2,13 @@
 
 import os
 
-from dotenv import dotenv_values
+from environs import Env
 
-dotenv = dotenv_values()
-
-env = {}
+env = Env()
+env.read_env()
 
+ENABLE_FORCE_SCHEDULER =  False
 default_vars = {
-    "ENABLE_FORCE_SCHEDULER": False,
     "DATABASE_URL": "sqlite:///state.sqlite",
     "BUILDBOT_URL": "http://localhost:5000/",
     "DISCORD_WEBHOOK": False,
@@ -21,7 +20,7 @@ default_vars = {
     "REPOSITORY": "https://github.com/scummvm/scummvm",
     # base directory which contains all the targets
     "TARGETS_BASEDIR": "~/wb1/",
-    "PRODUCTION": False
+    "UI": False
 }
 
 
diff --git a/director/scummvm_reporter.py b/director/scummvm_reporter.py
index 5198116..33af197 100644
--- a/director/scummvm_reporter.py
+++ b/director/scummvm_reporter.py
@@ -231,6 +231,8 @@ class JSONMessageFormatter:
 
         url = ctx["build_url"]
 
+        # TODO: Convert title from interger to it's name
+        title = ctx["build"]["results"]
         if ctx["build"]["results"] == SUCCESS:
             color = 0x36A64F  # green
             title = f"Success {ctx['buildername']}"
diff --git a/director/targets.py b/director/targets.py
index 3f226f0..4d1fac5 100644
--- a/director/targets.py
+++ b/director/targets.py
@@ -1,13 +1,12 @@
 import json
 import os.path
 from dataclasses import dataclass, fields
-from typing import List, Union
+from typing import List
 
 from buildbot.config import BuilderConfig
 from buildbot.plugins import steps, util
 
-from .build_factory import default_env, default_step_kwargs
-from .env import env
+from .build_factory import default_env
 from .steps import ScummVMTest, download_step
 
 
@@ -46,7 +45,7 @@ target_fields = [f.name for f in fields(TestTarget)]
 """
 
 test_targets = []
-with open(os.path.join(env["TARGETS_BASEDIR"], "targets.json"), "r") as data:
+with open(os.path.join("/storage", "targets.json"), "r") as data:
     targets = json.loads(data.read())
     for target in targets:
         test_targets.append(
@@ -54,7 +53,7 @@ with open(os.path.join(env["TARGETS_BASEDIR"], "targets.json"), "r") as data:
         )
 
 
-def generate_command(target: TestTarget, moviename: str):
+def generate_command(target: TestTarget, moviename: str) -> List[str]:
     command = [
         "../scummvm",
         "-c",
@@ -70,7 +69,7 @@ def generate_command(target: TestTarget, moviename: str):
 def generate_builder(target: TestTarget, workernames: List[str]) -> BuilderConfig:
     factory = util.BuildFactory()
     factory.addStep(download_step)
-    base_dir = env["TARGETS_BASEDIR"]
+    base_dir = "/storage/"
     to_directory = target.directory
     if not to_directory.endswith("/"):
         to_directory += "/"
diff --git a/director/vendor/reporter_utils.py b/director/vendor/reporter_utils.py
index 17a386d..1a06ce3 100644
--- a/director/vendor/reporter_utils.py
+++ b/director/vendor/reporter_utils.py
@@ -85,7 +85,7 @@ def getDetailsForBuilds(master, buildset, builds, wantProperties=False, wantStep
 
     if wantPreviousBuild:
         prev_builds = yield defer.gatherResults(
-            [getPreviousBuild(master, build) for build in builds])
+            [getPreviousBuild(master, build) for build in builds if build is not None])
     else:  # we still need a list for the big zip
         prev_builds = list(range(len(builds)))
 
@@ -117,4 +117,4 @@ def getDetailsForBuilds(master, buildset, builds, wantProperties=False, wantStep
             build['steps'] = list(steps)
 
         if wantPreviousBuild:
-            build['prev_build'] = prev 
\ No newline at end of file
+            build['prev_build'] = prev 
diff --git a/master.py b/master.py
index efe797f..febfaa6 100644
--- a/master.py
+++ b/master.py
@@ -1,17 +1,15 @@
 # -*- python -*-
 # ex: set filetype=python:
 
-import os.path
 from typing import Any
 from datetime import timedelta
 
 from buildbot.changes.changes import Change
 from buildbot.plugins import reporters, schedulers, util, worker
-from buildbot.reporters.message import MessageFormatter
 from twisted.python import log
+from environs import Env
 
 from director.build_factory import build_factory
-from director.env import env, get_env
 from director.lingo_factory import lingo_factory
 from director.scummvm_reporter import JSONMessageFormatter, WebHookReporter
 from director.targets import generate_builder, test_targets
@@ -25,28 +23,40 @@ c: Any
 BuildmasterConfig: Any
 c = BuildmasterConfig = {}
 
-PRODUCTION = get_env("PRODUCTION")
+env = Env()
+env.read_env()
 
 ####### SECRETS
 # We don't use a secretsProvider. It wouldn't work together with
 # the reporters.
 
+####### MultiMaster
+
+c["multiMaster"] = env.bool("MULTI_MASTER", False)
+
+WORKER_NAMES = env.list("WORKER_NAMES")
+
 ####### WORKERS
 
 # The 'workers' list defines the set of recognized workers. Each element is
 # a Worker object, specifying a unique worker name and password.  The same
 # worker name and password must be configured on the worker.
-c["workers"] = []
-scummvm_builbot_password = get_env("SCUMMVM_BUILDBOT_PASSWORD")
-if scummvm_builbot_password:
-    worker_name = "john-scummvm-net"
-    c["workers"].append(
-        worker.Worker(worker_name, scummvm_builbot_password, max_builds=12)
-    )
-else:
+HAS_WORKER = env.bool("HAS_WORKER", False)
+IS_LOCAL_WORKER = env.bool("IS_LOCAL_WORKER", False)
+if HAS_WORKER:
+    c["workers"] = []
+    scummvm_builbot_password = env("SCUMMVM_BUILDBOT_PASSWORD")
+    for worker_name in WORKER_NAMES:
+        c["workers"].append(
+            worker.Worker(
+                worker_name, scummvm_builbot_password, max_builds=env.int("MAX_BUILDS", 12)
+            )
+        )
+elif IS_LOCAL_WORKER:
+    c["workers"] = []
     worker_name = "director-worker"
     c["workers"].append(
-        worker.LocalWorker(worker_name, max_builds=int(env["MAX_BUILDS"]))
+        worker.LocalWorker(worker_name, max_builds=env.int("MAX_BUILDS", 3))
     )
 
 # 'protocols' contains information about protocols which master will use for
@@ -54,15 +64,13 @@ else:
 # could connect to your master with this protocol.
 # 'port' must match the value configured into the workers (with their
 # --master option)
-c["protocols"] = {"pb": {"port": 9989}}
 
-####### CHANGESOURCES
+c["protocols"] = {"pb": {"port": env.int("PROTOCOLS_PORT", 9989)}}
 
-# the 'change_source' setting tells the buildmaster how it should find out
-# about source code changes.  Here we point to the buildbot version of a python hello-world project.
+####### SCHEDULERS
 
-# leave empty, the github hook should take care of it.
-c["change_source"] = []
+# Configure the Schedulers, which decide how to react to incoming changes.  In this
+# case, just kick off a 'runtests' build
 
 
 def file_is_director_related(change: Change) -> bool:
@@ -77,22 +85,20 @@ def file_is_director_related(change: Change) -> bool:
                 return True
     return False
 
-
+REPOSITORY = env("REPOSITORY", "https://github.com/scummvm/scummvm")
 ####### BUILDER NAMES
 lingo_builder = "lingotests (D4)"
 builder_names = [lingo_builder]
-if PRODUCTION:
+if env.bool(
+    "FULL_BUILD", True
+):  # Set FULL_BUILD to false to get a quicker lingo only build
     builder_names.extend(target.builder_name for target in test_targets)
 
 force_builder_names = ["build", *builder_names]
 
-####### SCHEDULERS
-
-# Configure the Schedulers, which decide how to react to incoming changes.  In this
-# case, just kick off a 'runtests' build
 build_scheduler = schedulers.SingleBranchScheduler(
     name="all",
-    change_filter=util.ChangeFilter(repository=env["REPOSITORY"]),
+    change_filter=util.ChangeFilter(repository=REPOSITORY),
     treeStableTimer=5,
     fileIsImportant=file_is_director_related,
     builderNames=["build"],
@@ -117,26 +123,39 @@ c["schedulers"].append(force_scheduler)
 # what steps, and which workers can execute them.  Note that any particular build will
 # only take place on one worker.
 
-build_lock = util.MasterLock("Build")
-
-
-c["builders"] = []
-if PRODUCTION:
-    c["builders"].extend(generate_builder(target, [worker_name]) for target in test_targets)
-c["builders"].append(
-    util.BuilderConfig(
-        name="build",
-        workernames=[worker_name],
-        factory=build_factory,
-        locks=[build_lock.access("exclusive")],
+if HAS_WORKER or IS_LOCAL_WORKER:
+    build_lock = util.MasterLock("Build")
+
+    c["builders"] = []
+    c["builders"].append(
+        util.BuilderConfig(
+            name="build",
+            workernames=[WORKER_NAMES[0]],
+            factory=build_factory,
+            locks=[build_lock.access("exclusive")],
+        )
     )
-)
 
-c["builders"].append(
-    util.BuilderConfig(
-        name=lingo_builder, workernames=[worker_name], factory=lingo_factory
+    c["builders"].append(
+        util.BuilderConfig(
+            name=lingo_builder, workernames=WORKER_NAMES, factory=lingo_factory
+        )
     )
-)
+
+    if env.bool(
+        "FULL_BUILD", True
+    ):
+        c["builders"].extend(
+            generate_builder(target, WORKER_NAMES) for target in test_targets
+        )
+
+####### CHANGESOURCES
+
+# the 'change_source' setting tells the buildmaster how it should find out
+# about source code changes.  Here we point to the buildbot version of a python hello-world project.
+
+# leave empty, the github hook should take care of it.
+c["change_source"] = []
 
 ####### BUILDBOT SERVICES
 
@@ -146,57 +165,60 @@ c["builders"].append(
 
 c["services"] = []
 
-if env["DISCORD_WEBHOOK"]:
+c["buildbotURL"] = env("BUILDBOT_URL")
+WEB_UI = env.bool("WEB_UI", True)
+if WEB_UI:
+    DISCORD_WEBHOOK = env("DISCORD_WEBHOOK")
     scummvm_reporter = WebHookReporter(
-        env["DISCORD_WEBHOOK"],
+        DISCORD_WEBHOOK,
         mode="changesteps",
         messageFormatter=JSONMessageFormatter(),
     )
     c["services"].append(scummvm_reporter)
 
-# RTS: Roland Test Server
-if get_env("RTS_DISCORD_WEBHOOK"):
-    slack_webhook = reporters.SlackStatusPush(endpoint=get_env("RTS_DISCORD_WEBHOOK"))
-    c["services"].append(slack_webhook)
+    # RTS: Roland Test Server
+    RTS_DISCORD_WEBHOOK = env("RTS_DISCORD_WEBHOOK", "")
+    if RTS_DISCORD_WEBHOOK:
+        slack_webhook = reporters.SlackStatusPush(endpoint=RTS_DISCORD_WEBHOOK)
+        c["services"].append(slack_webhook)
 
-####### PROJECT IDENTITY
+    github_hook = {
+        "secret": env("GITHUB_WEBHOOK_SECRET"),
+        "strict": True,
+        "pullrequest_ref": "head",
+    }
 
-# the 'title' string will appear at the top of this buildbot installation's
-# home pages (linked to the 'titleURL').
 
-c["title"] = "Director builds"
-c["titleURL"] = env["REPOSITORY"]
+    github_token = env("GITHUB_TOKEN")
+    if github_token:
+        github_hook["token"] = github_token
 
-# the 'buildbotURL' string should point to the location where the buildbot's
-# internal web server is visible. This typically uses the port number set in
-# the 'www' entry below, but with an externally-visible host name which the
-# buildbot cannot figure out without some help.
+    ####### PROJECT IDENTITY
 
-c["buildbotURL"] = env["BUILDBOT_URL"]
+    # the 'title' string will appear at the top of this buildbot installation's
+    # home pages (linked to the 'titleURL').
 
-github_hook = {
-    "secret": env["GITHUB_WEBHOOK_SECRET"],
-    "strict": True,
-    "pullrequest_ref": "head",
-}
+    c["title"] = "Director builds"
+    c["titleURL"] = REPOSITORY
 
+    # the 'buildbotURL' string should point to the location where the buildbot's
+    # internal web server is visible. This typically uses the port number set in
+    # the 'www' entry below, but with an externally-visible host name which the
+    # buildbot cannot figure out without some help.
 
-github_token = get_env("GITHUB_TOKEN")
-if github_token:
-    github_hook["token"] = github_token
+    #c["buildbotURL"] = "https://john-test.scummvm.org/"
 
-# minimalistic config to activate new web UI
-c["www"] = dict(
-    port="tcp:5000:interface=127.0.0.1",
-    plugins=dict(console_view={}, grid_view={},),
-    change_hook_dialects={"github": github_hook},
-    allowed_origins=["*"],
-)
+    # minimalistic config to activate new web UI
+    c["www"] = dict(
+        port=env("WEB_UI_CONNECTION", "tcp:5000:interface=127.0.0.1"),
+        plugins=dict(console_view={}, grid_view={},),
+        change_hook_dialects={"github": github_hook},
+        allowed_origins=["*"],
+    )
 
-if PRODUCTION:
     c["www"]["auth"] = util.GitHubAuth(
-        env["GITHUB_CLIENT_ID"],
-        env["GITHUB_CLIENT_SECRET"],
+        env("GITHUB_CLIENT_ID"),
+        env("GITHUB_CLIENT_SECRET"),
         apiVersion=4,
         getTeamsMembership=True,
     )
@@ -205,6 +227,22 @@ if PRODUCTION:
         allowRules=[util.AnyControlEndpointMatcher(role="developers"),],
         roleMatchers=[util.RolesFromGroups(groupPrefix="scummvm/")],
     )
+    c['www']['ui_default_config'] = { 
+        'Grid.buildFetchLimit': 200,
+    }
+    c["configurators"] = [
+        util.JanitorConfigurator(logHorizon=timedelta(weeks=5), hour=23, dayOfWeek=0)
+    ]
+
+if env.bool("WAMP", False):
+    c['mq'] = {
+        'type' : 'wamp',
+        'router_url': env("WAMP_URL", 'ws://localhost:8080/ws'),
+        'realm': 'realm1',
+        # valid are: none, critical, error, warn, info, debug, trace
+        #'wamp_debug_level' : 'error'
+        'wamp_debug_level' : 'warn'
+}
 
 
 ####### DB URL
@@ -213,13 +251,23 @@ c["db"] = {
     # It's easy to start with sqlite, but it's recommended to switch to a dedicated
     # database, such as PostgreSQL or MySQL, for use in production environments.
     # http://docs.buildbot.net/current/manual/configuration/global.html#database-specification
-    "db_url": env["DATABASE_URL"],
+    "db_url": env("DATABASE_URL", default="sqlite:///state.sqlite"),
 }
 
-c['configurators'] = [util.JanitorConfigurator(
-    logHorizon=timedelta(weeks=5),
-    hour=23,
-    dayOfWeek=0
-)]
 ### disable sending usage data to buildbot. Their usage data receiver is down.
-c['buildbotNetUsageData'] = None
+c["buildbotNetUsageData"] = None
+
+### Use internal caching
+# https://docs.buildbot.net/2.8.4/manual/configuration/global.html#horizons
+
+c['caches'] = {             # defaults
+    'Changes' : 30000,       # 10 Have seen up to 17K changes be requested in one request.
+    'Builds' : 5000,         # 15    
+    'chdicts' : 30000,       # 1
+    'BuildRequests' : 20,   # 1
+    'SourceStamps' : 20,    # 1
+    'ssdicts' : 20,         # 20
+    'objectids' : 100,       # 1
+    'usdicts' : 10,         # 1
+}
+
diff --git a/nginx.conf.sigil b/nginx.conf.sigil
deleted file mode 100644
index 8576d81..0000000
--- a/nginx.conf.sigil
+++ /dev/null
@@ -1,182 +0,0 @@
-{{ range $port_map := .PROXY_PORT_MAP | split " " }}
-{{ $port_map_list := $port_map | split ":" }}
-{{ $scheme := index $port_map_list 0 }}
-{{ $listen_port := index $port_map_list 1 }}
-{{ $upstream_port := index $port_map_list 2 }}
-
-{{ if eq $scheme "http" }}
-server {
-  listen      [{{ $.NGINX_BIND_ADDRESS_IP6 }}]:{{ $listen_port }};
-  listen      {{ if $.NGINX_BIND_ADDRESS_IP4 }}{{ $.NGINX_BIND_ADDRESS_IP4 }}:{{end}}{{ $listen_port }};
-  {{ if $.NOSSL_SERVER_NAME }}server_name {{ $.NOSSL_SERVER_NAME }}; {{ end }}
-  access_log  {{ $.NGINX_ACCESS_LOG_PATH }};
-  error_log   {{ $.NGINX_ERROR_LOG_PATH }};
-{{ if (and (eq $listen_port "80") ($.SSL_INUSE)) }}
-  return 301 https://$host:{{ $.PROXY_SSL_PORT }}$request_uri;
-{{ else }}
-  location    / {
-
-    gzip on;
-    gzip_min_length  1100;
-    gzip_buffers  4 32k;
-    gzip_types    text/css text/javascript text/xml text/plain text/x-component application/javascript application/x-javascript application/json application/xml  application/rss+xml font/truetype application/x-font-ttf font/opentype application/vnd.ms-fontobject image/svg+xml;
-    gzip_vary on;
-    gzip_comp_level  6;
-
-    proxy_pass  http://{{ $.APP }}-{{ $upstream_port }};
-    proxy_http_version 1.1;
-    proxy_set_header Upgrade $http_upgrade;
-    proxy_set_header Connection $http_connection;
-    proxy_set_header Host $http_host;
-    proxy_set_header X-Forwarded-Proto $scheme;
-    proxy_set_header X-Forwarded-For $remote_addr;
-    proxy_set_header X-Forwarded-Port $server_port;
-    proxy_set_header X-Request-Start $msec;
-  }
-  include {{ $.DOKKU_ROOT }}/{{ $.APP }}/nginx.conf.d/*.conf;
-
-  error_page 400 401 402 403 405 406 407 408 409 410 411 412 413 414 415 416 417 418 420 422 423 424 426 428 429 431 444 449 450 451 /400-error.html;
-  location /400-error.html {
-    root {{ $.DOKKU_LIB_ROOT }}/data/nginx-vhosts/dokku-errors;
-    internal;
-  }
-
-  error_page 404 /404-error.html;
-  location /404-error.html {
-    root {{ $.DOKKU_LIB_ROOT }}/data/nginx-vhosts/dokku-errors;
-    internal;
-  }
-
-  error_page 500 501 502 503 504 505 506 507 508 509 510 511 /500-error.html;
-  location /500-error.html {
-    root {{ $.DOKKU_LIB_ROOT }}/data/nginx-vhosts/dokku-errors;
-    internal;
-  }
-{{ end }}
-}
-{{ else if eq $scheme "https"}}
-server {
-  listen      [{{ $.NGINX_BIND_ADDRESS_IP6 }}]:{{ $listen_port }} ssl {{ if eq $.HTTP2_SUPPORTED "true" }}http2{{ else if eq $.SPDY_SUPPORTED "true" }}spdy{{ end }};
-  listen      {{ if $.NGINX_BIND_ADDRESS_IP4 }}{{ $.NGINX_BIND_ADDRESS_IP4 }}:{{end}}{{ $listen_port }} ssl {{ if eq $.HTTP2_SUPPORTED "true" }}http2{{ else if eq $.SPDY_SUPPORTED "true" }}spdy{{ end }};
-  {{ if $.SSL_SERVER_NAME }}server_name {{ $.SSL_SERVER_NAME }}; {{ end }}
-  {{ if $.NOSSL_SERVER_NAME }}server_name {{ $.NOSSL_SERVER_NAME }}; {{ end }}
-  access_log  {{ $.NGINX_ACCESS_LOG_PATH }};
-  error_log   {{ $.NGINX_ERROR_LOG_PATH }};
-
-  ssl_certificate           {{ $.APP_SSL_PATH }}/server.crt;
-  ssl_certificate_key       {{ $.APP_SSL_PATH }}/server.key;
-  ssl_protocols             TLSv1.2 {{ if eq $.TLS13_SUPPORTED "true" }}TLSv1.3{{ end }};
-  ssl_prefer_server_ciphers off;
-
-  keepalive_timeout   70;
-  {{ if and (eq $.SPDY_SUPPORTED "true") (ne $.HTTP2_SUPPORTED "true") }}add_header          Alternate-Protocol  {{ $.PROXY_SSL_PORT }}:npn-spdy/2;{{ end }}
-
-  proxy_set_header Host $http_host;
-  proxy_set_header X-Forwarded-Proto $scheme;
-  proxy_set_header X-Forwarded-For $remote_addr;
-  proxy_set_header X-Forwarded-Port $server_port;
-  proxy_set_header X-Request-Start $msec;
-
-  location    / {
-
-    gzip on;
-    gzip_min_length  1100;
-    gzip_buffers  4 32k;
-    gzip_types    text/css text/javascript text/xml text/plain text/x-component application/javascript application/x-javascript application/json application/xml  application/rss+xml font/truetype application/x-font-ttf font/opentype application/vnd.ms-fontobject image/svg+xml;
-    gzip_vary on;
-    gzip_comp_level  6;
-
-    proxy_pass  http://{{ $.APP }}-{{ $upstream_port }};
-    {{ if eq $.HTTP2_PUSH_SUPPORTED "true" }}http2_push_preload on; {{ end }}
-    proxy_http_version 1.1;
-    proxy_set_header Upgrade $http_upgrade;
-    proxy_set_header Connection $http_connection;
-
-  }
-
-  location /sse/ {
-    # proxy buffering will prevent sse to work
-    proxy_buffering off;
-    proxy_pass http://{{ $.APP }}-{{ $upstream_port }}/sse/;
-  }
-
-  location /ws {
-    proxy_http_version 1.1;
-    proxy_set_header Upgrade $http_upgrade;
-    proxy_set_header Connection "upgrade";
-    proxy_pass http://{{ $.APP }}-{{ $upstream_port }}/ws;
-    # raise the proxy timeout for the websocket
-    proxy_read_timeout 6000s;
-  }
-  include {{ $.DOKKU_ROOT }}/{{ $.APP }}/nginx.conf.d/*.conf;
-
-  error_page 400 401 402 403 405 406 407 408 409 410 411 412 413 414 415 416 417 418 420 422 423 424 426 428 429 431 444 449 450 451 /400-error.html;
-  location /400-error.html {
-    root {{ $.DOKKU_LIB_ROOT }}/data/nginx-vhosts/dokku-errors;
-    internal;
-  }
-
-  error_page 404 /404-error.html;
-  location /404-error.html {
-    root {{ $.DOKKU_LIB_ROOT }}/data/nginx-vhosts/dokku-errors;
-    internal;
-  }
-
-  error_page 500 501 503 504 505 506 507 508 509 510 511 /500-error.html;
-  location /500-error.html {
-    root {{ $.DOKKU_LIB_ROOT }}/data/nginx-vhosts/dokku-errors;
-    internal;
-  }
-
-  error_page 502 /502-error.html;
-  location /502-error.html {
-    root {{ $.DOKKU_LIB_ROOT }}/data/nginx-vhosts/dokku-errors;
-    internal;
-  }
-}
-{{ else if eq $scheme "grpc"}}
-{{ if eq $.GRPC_SUPPORTED "true"}}{{ if eq $.HTTP2_SUPPORTED "true"}}
-server {
-  listen      [{{ $.NGINX_BIND_ADDRESS_IP6 }}]:{{ $listen_port }} http2;
-  listen      {{ if $.NGINX_BIND_ADDRESS_IP4 }}{{ $.NGINX_BIND_ADDRESS_IP4 }}:{{end}}{{ $listen_port }} http2;
-  {{ if $.NOSSL_SERVER_NAME }}server_name {{ $.NOSSL_SERVER_NAME }}; {{ end }}
-  access_log  {{ $.NGINX_ACCESS_LOG_PATH }};
-  error_log   {{ $.NGINX_ERROR_LOG_PATH }};
-  location    / {
-    grpc_pass  grpc://{{ $.APP }}-{{ $upstream_port }};
-  }
-  include {{ $.DOKKU_ROOT }}/{{ $.APP }}/nginx.conf.d/*.conf;
-}
-{{ end }}{{ end }}
-{{ else if eq $scheme "grpcs"}}
-{{ if eq $.GRPC_SUPPORTED "true"}}{{ if eq $.HTTP2_SUPPORTED "true"}}
-server {
-  listen      [{{ $.NGINX_BIND_ADDRESS_IP6 }}]:{{ $listen_port }} ssl http2;
-  listen      {{ if $.NGINX_BIND_ADDRESS_IP4 }}{{ $.NGINX_BIND_ADDRESS_IP4 }}:{{end}}{{ $listen_port }} ssl http2;
-  {{ if $.NOSSL_SERVER_NAME }}server_name {{ $.NOSSL_SERVER_NAME }}; {{ end }}
-  access_log  {{ $.NGINX_ACCESS_LOG_PATH }};
-  error_log   {{ $.NGINX_ERROR_LOG_PATH }};
-
-  ssl_certificate           {{ $.APP_SSL_PATH }}/server.crt;
-  ssl_certificate_key       {{ $.APP_SSL_PATH }}/server.key;
-  ssl_protocols             TLSv1.2 {{ if eq $.TLS13_SUPPORTED "true" }}TLSv1.3{{ end }};
-  ssl_prefer_server_ciphers off;
-
-  location    / {
-    grpc_pass  grpc://{{ $.APP }}-{{ $upstream_port }};
-  }
-  include {{ $.DOKKU_ROOT }}/{{ $.APP }}/nginx.conf.d/*.conf;
-}
-{{ end }}{{ end }}
-{{ end }}
-{{ end }}
-
-{{ if $.DOKKU_APP_WEB_LISTENERS }}
-{{ range $upstream_port := $.PROXY_UPSTREAM_PORTS | split " " }}
-upstream {{ $.APP }}-{{ $upstream_port }} {
-{{ range $listeners := $.DOKKU_APP_WEB_LISTENERS | split " " }}
-{{ $listener_list := $listeners | split ":" }}
-{{ $listener_ip := index $listener_list 0 }}
-  server {{ $listener_ip }}:{{ $upstream_port }};{{ end }}
-}
-{{ end }}{{ end }}
diff --git a/poetry.lock b/poetry.lock
index 9d65551..2b0b99c 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -415,6 +415,24 @@ category = "main"
 optional = false
 python-versions = ">=3.5"
 
+[[package]]
+name = "environs"
+version = "9.3.2"
+description = "simplified environment variable parsing"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+
+[package.dependencies]
+marshmallow = ">=2.7.0"
+python-dotenv = "*"
+
+[package.extras]
+dev = ["pytest", "dj-database-url", "dj-email-url", "django-cache-url", "flake8 (==3.9.0)", "flake8-bugbear (==21.3.2)", "mypy (==0.812)", "pre-commit (>=2.4,<3.0)", "tox"]
+django = ["dj-database-url", "dj-email-url", "django-cache-url"]
+lint = ["flake8 (==3.9.0)", "flake8-bugbear (==21.3.2)", "mypy (==0.812)", "pre-commit (>=2.4,<3.0)"]
+tests = ["pytest", "dj-database-url", "dj-email-url", "django-cache-url"]
+
 [[package]]
 name = "flatbuffers"
 version = "2.0"
@@ -627,6 +645,20 @@ category = "main"
 optional = false
 python-versions = ">=3.6"
 
+[[package]]
+name = "marshmallow"
+version = "3.12.2"
+description = "A lightweight library for converting complex datatypes to and from native Python datatypes."
+category = "main"
+optional = false
+python-versions = ">=3.5"
+
+[package.extras]
+dev = ["pytest", "pytz", "simplejson", "mypy (==0.910)", "flake8 (==3.9.2)", "flake8-bugbear (==21.4.3)", "pre-commit (>=2.4,<3.0)", "tox"]
+docs = ["sphinx (==4.0.3)", "sphinx-issues (==1.2.0)", "alabaster (==0.7.12)", "sphinx-version-warning (==1.1.2)", "autodocsumm (==0.2.6)"]
+lint = ["mypy (==0.910)", "flake8 (==3.9.2)", "flake8-bugbear (==21.4.3)", "pre-commit (>=2.4,<3.0)"]
+tests = ["pytest", "pytz", "simplejson"]
+
 [[package]]
 name = "matplotlib-inline"
 version = "0.1.2"
@@ -940,8 +972,8 @@ six = ">=1.5"
 
 [[package]]
 name = "python-dotenv"
-version = "0.13.0"
-description = "Add .env support to your django/flask apps in development and deployments"
+version = "0.18.0"
+description = "Read key-value pairs from a .env file and set them as environment variables"
 category = "main"
 optional = false
 python-versions = "*"
@@ -1351,8 +1383,8 @@ testing = ["coverage (>=5.0.3)", "zope.event", "zope.testing"]
 
 [metadata]
 lock-version = "1.1"
-python-versions = "3.8.6"
-content-hash = "098ef85d3c1986febc260aed568d83ab39af79c40b094d87e845d69f859b2f71"
+python-versions = "^3.8.4"
+content-hash = "0e5fa1e4b1c6b55649660664a15fc324079df9062e3d1cc3c9f66be7ff437db0"
 
 [metadata.files]
 appdirs = [
@@ -1561,6 +1593,10 @@ decorator = [
     {file = "decorator-5.0.9-py3-none-any.whl", hash = "sha256:6e5c199c16f7a9f0e3a61a4a54b3d27e7dad0dbdde92b944426cb20914376323"},
     {file = "decorator-5.0.9.tar.gz", hash = "sha256:72ecfba4320a893c53f9706bebb2d55c270c1e51a28789361aa93e4a21319ed5"},
 ]
+environs = [
+    {file = "environs-9.3.2-py2.py3-none-any.whl", hash = "sha256:6bef733b88cc901e787cf24fb2eaa72621b0656226ea4e332ab24ed0cba36fcf"},
+    {file = "environs-9.3.2.tar.gz", hash = "sha256:2eb671afd37e6e9820131b918bbbcaa6658d0fb420ebf35bdfb750ae39c51a66"},
+]
 flatbuffers = [
     {file = "flatbuffers-2.0-py2.py3-none-any.whl", hash = "sha256:3751954f0604580d3219ae49a85fafec9d85eec599c0b96226e1bc0b48e57474"},
     {file = "flatbuffers-2.0.tar.gz", hash = "sha256:12158ab0272375eab8db2d663ae97370c33f152b27801fa6024e1d6105fd4dd2"},
@@ -1703,6 +1739,10 @@ markupsafe = [
     {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"},
     {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"},
 ]
+marshmallow = [
+    {file = "marshmallow-3.12.2-py2.py3-none-any.whl", hash = "sha256:d4090ca9a36cd129126ad8b10c3982c47d4644a6e3ccb20534b512badce95f35"},
+    {file = "marshmallow-3.12.2.tar.gz", hash = "sha256:77368dfedad93c3a041cbbdbce0b33fac1d8608c9e2e2288408a43ce3493d2ff"},
+]
 matplotlib-inline = [
     {file = "matplotlib-inline-0.1.2.tar.gz", hash = "sha256:f41d5ff73c9f5385775d5c0bc13b424535c8402fe70ea8210f93e11f3683993e"},
     {file = "matplotlib_inline-0.1.2-py3-none-any.whl", hash = "sha256:5cf1176f554abb4fa98cb362aa2b55c500147e4bdbb07e3fda359143e1da0811"},
@@ -1958,8 +1998,8 @@ python-dateutil = [
     {file = "python_dateutil-2.8.1-py2.py3-none-any.whl", hash = "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a"},
 ]
 python-dotenv = [
-    {file = "python-dotenv-0.13.0.tar.gz", hash = "sha256:3b9909bc96b0edc6b01586e1eed05e71174ef4e04c71da5786370cebea53ad74"},
-    {file = "python_dotenv-0.13.0-py2.py3-none-any.whl", hash = "sha256:25c0ff1a3e12f4bde8d592cc254ab075cfe734fc5dd989036716fd17ee7e5ec7"},
+    {file = "python-dotenv-0.18.0.tar.gz", hash = "sha256:effaac3c1e58d89b3ccb4d04a40dc7ad6e0275fda25fd75ae9d323e2465e202d"},
+    {file = "python_dotenv-0.18.0-py2.py3-none-any.whl", hash = "sha256:dd8fe852847f4fbfadabf6183ddd4c824a9651f02d51714fa075c95561959c7d"},
 ]
 python-snappy = [
     {file = "python-snappy-0.6.0.tar.gz", hash = "sha256:168a98d3f597b633cfeeae7fe1c78a8dfd81f018b866cf7ce9e4c56086af891a"},
diff --git a/pyproject.toml b/pyproject.toml
index 0f118b7..11c9d5b 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -5,8 +5,7 @@ description = "Buildbot for scummvms director tests"
 authors = ["Roland van Laar <roland at rolandvanlaar.nl>"]
 
 [tool.poetry.dependencies]
-python = "3.8.6"
-python-dotenv = "^0.13.0"
+python = "^3.8.4"
 buildbot = {extras = ["bundle"], version = "==2.8.4"}
 buildbot_slack = "^0.2.3"
 service_identity = "^18.1.0"
@@ -15,6 +14,8 @@ wheel = "^0.34.2"
 psycopg2 = "^2.8.5"
 sqlalchemy = "==1.3.24" # 1.4 breaks due to a missing strategy engine
 crossbar = "^21.3.1"
+environs = "^9.3.2"
+buildbot-worker = "2.8.4"
 
 [tool.poetry.dev-dependencies]
 pylint = "^2.4.4"
diff --git a/runtime.txt b/runtime.txt
deleted file mode 100644
index 0fd6938..0000000
--- a/runtime.txt
+++ /dev/null
@@ -1 +0,0 @@
-python-3.8.6
diff --git a/test-deploy/cloudinit.sh b/test-deploy/cloudinit.sh
deleted file mode 100644
index d42fbff..0000000
--- a/test-deploy/cloudinit.sh
+++ /dev/null
@@ -1,158 +0,0 @@
-#cloud-config
-
-apt:
-  sources:
-    source_dokku: 
-      source: 'deb https://packagecloud.io/dokku/dokku/ubuntu/ $RELEASE main'
-      key: |
-        -----BEGIN PGP PUBLIC KEY BLOCK-----
-        Version: GnuPG v1.4.11 (GNU/Linux)
-
-        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
-        =laU4
-        -----END PGP PUBLIC KEY BLOCK-----
-    source_docker: 
-      source: 'deb [arch=amd64] https://download.docker.com/linux/ubuntu $RELEASE stable'
-      key: |
-        -----BEGIN PGP PUBLIC KEY BLOCK-----
-
-        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
-        YT90qFF93M3v01BbxP+EIY2/9tiIPbrd
-        =0YYh
-        -----END PGP PUBLIC KEY BLOCK-----
-
-  debconf_selections:
-    web:      dokku dokku/web_config boolean false
-    vhost:    dokku dokku/vhost_enable boolean true
-    # set the domain name of the new Dokku server
-    hostname: dokku dokku/hostname string projecttycho.nl
-    # this copies over the public SSH key assigned to the server
-    key:      dokku dokku/key_file string /root/.ssh/authorized_keys
-
-packages:
-  - dokku
-  # packages needed for local workers
-  - ccache
-  - libsdl2-dev
-package_update: true
-package_upgrade: true
-# TODO: back to true when it works.
-package_reboot_if_required: false
-
-runcmd:
-  - [ 'dokku', 'plugin:install', 'https://github.com/dokku/dokku-postgres.git' ]
-  - [ 'dokku', 'plugin:install', 'https://github.com/dokku/dokku-letsencrypt.git' ]
\ No newline at end of file
diff --git a/test-deploy/deploy.sh b/test-deploy/deploy.sh
deleted file mode 100755
index 46f104f..0000000
--- a/test-deploy/deploy.sh
+++ /dev/null
@@ -1,54 +0,0 @@
-#!/usr/bin/env bash
-
-# settings exit on:
-# -e: non zero exit code,
-# -u: an undefined variable
-# pipefile: return exit code of last command in the pipe
-set -euo pipefail
-
-LOGFILE=run.txt
-HOST=test-buildbot
-DOMAIN=projecttycho.nl
-
-# create and wait for droplet to come up
-doctl compute droplet create test-deploy \
-    --enable-monitoring \
-    --image ubuntu-20-04-x64 \
-    --size s-1vcpu-1gb \
-    --region ams3 \
-    --user-data-file cloudinit.sh \
-    --ssh-keys 27:98:ce:25:93:79:5a:9e:d6:46:94:10:07:5f:a6:fd \
-    --format ID \
-    --wait \
-    > $LOGFILE
-
-# get droplet ID
-DO_ID=`tail -1 $LOGFILE`
-
-# get droplet IP address
-doctl compute droplet get $DO_ID \
-    --format PublicIPv4 \
-    >> $LOGFILE
-DO_IP=`tail -1 $LOGFILE`
-
-# create POST body for Transip via jq.
-# In bash it's not possible to use $VARs in single quoted strings
-POST_JSON=`jq -n --arg host "$HOST" --arg ip "$DO_IP" \
-'{
-  "dnsEntry": {
-    "name": $host,
-    "expire": 60,
-    "type": "A",
-    "content": $ip
-  }
-}'`
-
-curl -X PATCH \
-    -H "Content-Type: application/json" \
-    -H "Authorization: Bearer $BEARER" \
-    -d "$POST_JSON" \
-    "https://api.transip.nl/v6/domains/$DOMAIN/dns" \
-    >> $LOGFILE
-
-# Be able to login without SSH complaining
-ssh-keygen -f ~/.ssh/known_hosts -R "$HOST.$DOMAIN"




More information about the Scummvm-git-logs mailing list