В buildbot нет просмотра сетки / консоли, представление сборки всегда пустое, несмотря на успешную сборку - PullRequest
0 голосов
/ 22 марта 2020

Я установил buildbot - один docker образ с мастером, а другой с рабочим. Разрешены межконтейнерные сети, и они совместно используют одну сеть; У меня также есть экземпляр gitea, и я установил плагин buildbot_gitea.

Пока что у меня есть небольшой проект для запуска make на работнике после pu sh, и buildbot правильно сообщает об успешном завершении gitea (я могу сказать из журналов, и gitea также показывает зеленое контрольное изображение на репо).

Однако,

  • вид на водопад всегда пуст; виды консоли и сетки не загружаются (они показывают анимацию «загрузки» и никогда не заканчиваются sh);
  • на вкладке "Домашний" buildbot, иногда отображается список последних сборок, иногда нет. (Но число последних сборок всегда корректно)
  • если я нажму на одну из сборок (успешно или нет, не имеет значения), она покажет страницу сборки, но пустую (без шагов сборки, нет свойства сборки, ничего).

Единственные вещи, которые выглядят странно в основных журналах, - это периодические c сообщения об истечении времени ожидания, некоторые сообщения о разрыве соединения:

2020-03-21 12:11:26+0000 [-] Timing out client: IPv4Address(type='TCP', host='172.27.0.1', port=56388)
2020-03-21 12:11:26+0000 [-] Timing out client: IPv4Address(type='TCP', host='172.27.0.1', port=56380)
2020-03-21 12:11:26+0000 [-] Timing out client: IPv4Address(type='TCP', host='172.27.0.1', port=56392)

2020-03-21 12:19:40+0000 [-] dropping connection to peer tcp4:172.27.0.1:56598 with abort=False: None

и это:

2020-03-21 12:10:49+0000 [-] Unhandled error in Deferred:
2020-03-21 12:10:49+0000 [-] Unhandled Error
    Traceback (most recent call last):
      File "/usr/lib/python3.8/threading.py", line 932, in _bootstrap_inner
        self.run()
      File "/usr/lib/python3.8/threading.py", line 870, in run
        self._target(*self._args, **self._kwargs)
      File "/bbot/sandbox/lib/python3.8/site-packages/twisted/_threads/_threadworker.py", line 46, in work
        task()
      File "/bbot/sandbox/lib/python3.8/site-packages/twisted/_threads/_team.py", line 190, in doWork
        task()
    --- <exception caught here> ---
      File "/bbot/sandbox/lib/python3.8/site-packages/twisted/python/threadpool.py", line 250, in inContext
        result = inContext.theWork()
      File "/bbot/sandbox/lib/python3.8/site-packages/twisted/python/threadpool.py", line 266, in <lambda>
        inContext.theWork = lambda: context.call(ctx, func, *args, **kw)
      File "/bbot/sandbox/lib/python3.8/site-packages/twisted/python/context.py", line 122, in callWithContext
        return self.currentContext().callWithContext(ctx, func, *args, **kw)
      File "/bbot/sandbox/lib/python3.8/site-packages/twisted/python/context.py", line 85, in callWithContext
        return func(*args,**kw)
      File "/bbot/sandbox/lib/python3.8/site-packages/buildbot/buildbot_net_usage_data.py", line 204, in _sendBuildbotNetUsageData
        res = _sendWithRequests(PHONE_HOME_URL, data)
      File "/bbot/sandbox/lib/python3.8/site-packages/buildbot/buildbot_net_usage_data.py", line 197, in _sendWithRequests
        r = requests.post(url, json=data)
      File "/bbot/sandbox/lib/python3.8/site-packages/requests/api.py", line 119, in post
        return request('post', url, data=data, json=json, **kwargs)
      File "/bbot/sandbox/lib/python3.8/site-packages/requests/api.py", line 61, in request
        return session.request(method=method, url=url, **kwargs)
      File "/bbot/sandbox/lib/python3.8/site-packages/requests/sessions.py", line 530, in request
        resp = self.send(prep, **send_kwargs)
      File "/bbot/sandbox/lib/python3.8/site-packages/requests/sessions.py", line 643, in send
        r = adapter.send(request, **kwargs)
      File "/bbot/sandbox/lib/python3.8/site-packages/requests/adapters.py", line 516, in send
        raise ConnectionError(e, request=request)
    requests.exceptions.ConnectionError: HTTPSConnectionPool(host='events.buildbot.net', port=443): Max retries exceeded with url: /events/phone_home (Caused by NewConnectionError('<urllib3.connection.VerifiedHTTPSConnection object at 0x7ff7297704f0>: Failed to establish a new connection: [Errno 110] Operation timed out'))

, что, кажется, происходит только один раз (почему buildbot все равно пытается позвонить домой? В моих конфигурационных файлах нет упоминания о events.buildbot.net.

* docker Контейнеры имеют полный доступ к сети, ipv6, маршрутизация и DNS все в порядке (протестировано с изображением buildbot-master).

Это мой master.cfg:

import os

from twisted.application import service
from buildbot.master import BuildMaster

from buildbot.plugins import *
from buildbot_gitea.auth import GiteaAuth
from buildbot_gitea import *

basedir = '/bbot/bbot-master'
rotateLength = 10000000
maxRotatedFiles = 10
configfile = 'master.cfg'

umask = None

if basedir == '.':
    basedir = os.path.abspath(os.path.dirname(__file__))
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)

m = BuildMaster(basedir, configfile, umask)
m.setServiceParent(application)
m.log_rotation.rotateLength = rotateLength
m.log_rotation.maxRotatedFiles = maxRotatedFiles# -*- python -*-                                                                                                                                                                                                                                                       
# ex: set filetype=python:                                                                                                                                                                                                                                                                                             

from buildbot.plugins import *


c = BuildmasterConfig = {}
####### WORKERS                                                                                                                                                                                                                                                                                                        

c['workers'] = [worker.Worker("bbot-worker", "BUILDBOT_PASSWORD")]

c['protocols'] = {'pb': {'port': 9989}}

####### CHANGESOURCES                                                                                                                                                                                                                                                                                                  

c['change_source'] = []
c['change_source'].append(changes.PBChangeSource())

####### SCHEDULERS                                                                                                                                                                                                                                                                                                     

c['schedulers'] = []


c['schedulers'].append(schedulers.SingleBranchScheduler(
                            name="all",
                            change_filter=util.ChangeFilter(branch='master'),
                            treeStableTimer=None,
                            builderNames=["runtests"]))
c['schedulers'].append(schedulers.ForceScheduler(
                            name="force",
                            builderNames=["runtests"]))

####### BUILDERS                                                                                                                                                                                                                                                                                                       

factory = util.BuildFactory()
factory.addStep(steps.Gitea(repourl='gitea@gitea.mydomain:myself/repo.git',
    mode='incremental',
        workdir="build",
        branch="master",
        progress=True,
        logEnviron=False,
))

factory.addStep(steps.ShellCommand(command=["make"]))

c['builders'] = []

c['builders'].append(
    util.BuilderConfig(name="runtests",
      workernames=["bbot-worker"],
      factory=factory))

####### BUILDBOT SERVICES                                                                                                                                                                                                                                                                                              

c['services'] = [
    reporters.GiteaStatusPush(
    baseURL="https://gitea.mydomain/",
        token="GITEA_API_ACCESS_TOKEN",
        verbose=True)
]


####### PROJECT IDENTITY                                                                                                                                                                                                                                                                                               

c['title'] = "My Domain!"
c['titleURL'] = "https://buildbot.mydomain"


c['buildbotURL'] = "https://buildbot.mydomain/"

c['www'] = dict(port=8010,
                plugins=dict(waterfall_view={}, console_view={}, grid_view={}))

c['www']['authz'] = util.Authz(
        allowRules = [
            util.AnyEndpointMatcher(role="admins")
        ],
        roleMatchers = [
            util.RolesFromUsername(roles=['admins'], usernames=['myself'])
        ]
)

c['www']['auth'] = GiteaAuth(
    endpoint="https://gitea.mydomain/",
    client_id="MY_CLIENT_ID_FROM_GITEA",
    client_secret='MY_CLIENT_SECRET_FROM_GITEA')

c['www']['change_hook_dialects'] = {
                                  'gitea': {
                                  'secret': 'THE_GITEA_WEBHOOK_SECRET',
                                  'onlyIncludePushCommit': True
                                  }
}

####### DB URL                                                                                                                                                                                                                                                                                                         

c['db'] = {
    'db_url' : "postgresql://buildbot:MY_SECRET_DB_PASSWORD@172.25.0.2/buildbot",
}

Файл Docker для master это

FROM alpine:3.11.3
EXPOSE 9989

RUN apk update
RUN apk add python3 bash    busybox-extras w3m gcc python3-dev libffi-dev openssl-dev musl-dev postgresql-dev
RUN mkdir /bbot
COPY entrypoint.sh /root/
RUN chmod a+x /root/entrypoint.sh
RUN mkdir /root/.ssh && chmod og-rwx /root/.ssh/
COPY bbot-gitea bbot-gitea.pub /root/.ssh/
RUN chmod og-w /root/.ssh/bbot-gitea*


RUN cd /bbot && \
    python3 -m venv sandbox && \
    source sandbox/bin/activate && \
    pip3 install 'buildbot[bundle]' && \
    pip3 install 'requests[security]' && \
    pip3 -v install buildbot_gitea && \
    pip3 install treq && \
    pip3 install psycopg2
RUN apk del gcc python3-dev libffi-dev openssl-dev musl-dev

RUN ls -la /root
RUN cat /root/entrypoint.sh

ENTRYPOINT [ "/root/entrypoint.sh" ]

и точка входа не делает ничего особенного - именно эта строка

#!/bin/bash                                                                                                                                                                                                                                                                                                            

cd /bbot

echo " BBOT MASTER ENTRYPOINT"

source sandbox/bin/activate
buildbot upgrade-master bbot-master

# debug: check everything that was pip-installed:
echo "\n\n=====\n"
pip3 list
echo "=====\n\n"

if [ ! -f bbot-master/buildbot.tac ]; then
        buildbot create-master bbot-master
fi

buildbot start bbot-master
tail -f /bbot/bbot-master/twistd.log

и строка pip3 list, которая запускается при запуске для отладки, показывает, что у меня есть

buildbot                2.7.0     
buildbot-console-view   2.7.0     
buildbot-gitea          1.2.0     
buildbot-grid-view      2.7.0     
buildbot-waterfall-view 2.7.0     
buildbot-worker         2.7.0     
buildbot-www            2.7.0     

edit : проверил консоль JS в Firefox и там Кажется, проблема с подключением к серверу через веб-сокеты:

Firefox can’t establish a connection to the server at wss://buildbot.mydomain/ws.

С Chrome, вот что я вижу:

WebSocket connection to 'wss://buildbot.aleph0.info/ws' failed: Error during WebSocket handshake: Unexpected response code: 200

(200? почему 200?)

Я не понимаю, почему это не сработает. Apache настроен для выполнения обратного проксирования, например:

RewriteEngine On
RewriteCond ${HTTP:Upgrade} websocket [NC]
RewriteCond ${HTTP:Connection} upgrade [NC]
RewriteRule .* "wss:/localhost:8010/$1" [P,L]
ProxyPass        / http://localhost:8010/
ProxyPassReverse / http://localhost:8010/

Итак ... Что еще я могу сделать, чтобы продолжить отладку этого?

(Кстати, это выглядит как список рассылки buildbot не очень активен - после публикации этого вопроса я проверил архивы, и там очень низкая активность. Где пользователи Buildbot go в эти дни, чтобы получить и поделиться советами?)

1 Ответ

0 голосов
/ 24 марта 2020

Я обнаружил проблему!

Это был обратный прокси-сервер, который не был правильно настроен для веб-сокетов.

Я использовал это в своей конфигурации apache virtualhost,

    <Location /ws>
              ProxyPass ws://127.0.0.1:8010/ws
              ProxyPassReverse ws://127.0.0.1:8010/ws
    </Location>

    ProxyPass /ws !
    ProxyPass        / http://localhost:8010/
    ProxyPassReverse / http://localhost:8010/

и теперь это работает!

(после долгих поисков я нашел решение здесь: https://docs.buildbot.net/0.9.2/manual/cfg-www.html)

Вот оно, на всякий случай еще это нужно.

...