From 38a3f8cf4cee74d106c8b3520a1ce79a116a4155 Mon Sep 17 00:00:00 2001 From: Alex Grintsvayg <grin@lbry.com> Date: Thu, 23 Jan 2020 12:38:33 -0500 Subject: [PATCH 1/5] add docker build info to wallet server image --- docker/Dockerfile.wallet_server | 5 +++++ docker/hooks/build | 7 +++++++ 2 files changed, 12 insertions(+) create mode 100644 docker/hooks/build diff --git a/docker/Dockerfile.wallet_server b/docker/Dockerfile.wallet_server index 45e826e65..329a48063 100644 --- a/docker/Dockerfile.wallet_server +++ b/docker/Dockerfile.wallet_server @@ -4,6 +4,10 @@ ARG user=lbry ARG db_dir=/database ARG projects_dir=/home/$user +ARG DOCKER_TAG +ARG DOCKER_COMMIT=docker +ENV DOCKER_TAG=$DOCKER_TAG DOCKER_COMMIT=$DOCKER_COMMIT + RUN apt-get update && \ apt-get -y --no-install-recommends install \ wget \ @@ -29,6 +33,7 @@ WORKDIR $projects_dir RUN pip install uvloop RUN make install +RUN python3 docker/set_build.py RUN rm ~/.cache -rf # entry point diff --git a/docker/hooks/build b/docker/hooks/build new file mode 100644 index 000000000..371640d81 --- /dev/null +++ b/docker/hooks/build @@ -0,0 +1,7 @@ +#!/bin/bash + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +cd "$DIR/../.." ## make sure we're in the right place. Docker Hub screws this up sometimes +echo "docker build dir: $(pwd)" + +docker build --build-arg DOCKER_TAG=$DOCKER_TAG --build-arg DOCKER_COMMIT=$SOURCE_COMMIT -f $DOCKERFILE_PATH -t $IMAGE_NAME . From 7fd56e0add2313916705174f279c1cb741a2f9d7 Mon Sep 17 00:00:00 2001 From: Alex Grintsvayg <grin@lbry.com> Date: Thu, 23 Jan 2020 08:40:24 -0500 Subject: [PATCH 2/5] build_type.py -> build_info.py --- lbry/{build_type.py => build_info.py} | 0 lbry/extras/system_info.py | 4 ++-- lbry/wallet/server/prometheus.py | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) rename lbry/{build_type.py => build_info.py} (100%) diff --git a/lbry/build_type.py b/lbry/build_info.py similarity index 100% rename from lbry/build_type.py rename to lbry/build_info.py diff --git a/lbry/extras/system_info.py b/lbry/extras/system_info.py index 0fc8b2278..68e24f881 100644 --- a/lbry/extras/system_info.py +++ b/lbry/extras/system_info.py @@ -2,7 +2,7 @@ import platform import os import logging.handlers -from lbry import build_type, __version__ as lbrynet_version +from lbry import build_info, __version__ as lbrynet_version log = logging.getLogger(__name__) @@ -19,7 +19,7 @@ def get_platform() -> dict: "os_system": os_system, "lbrynet_version": lbrynet_version, "version": lbrynet_version, - "build": build_type.BUILD, # CI server sets this during build step + "build": build_info.BUILD, # CI server sets this during build step } if d["os_system"] == "Linux": import distro # pylint: disable=import-outside-toplevel diff --git a/lbry/wallet/server/prometheus.py b/lbry/wallet/server/prometheus.py index 84a7a3529..8872b2ae7 100644 --- a/lbry/wallet/server/prometheus.py +++ b/lbry/wallet/server/prometheus.py @@ -2,11 +2,11 @@ from aiohttp import web from prometheus_client import Counter, Info, generate_latest as prom_generate_latest from lbry.wallet.server import util from lbry import __version__ as version -from lbry.build_type import BUILD, COMMIT_HASH +from lbry.build_info import BUILD, COMMIT_HASH NAMESPACE = "wallet_server" -VERSION_INFO = Info('build_info', 'Wallet server build info (e.g. version, commit hash)', namespace=NAMESPACE) +VERSION_INFO = Info('build', 'Wallet server build info (e.g. version, commit hash)', namespace=NAMESPACE) VERSION_INFO.info({'version': version, 'build': BUILD, "commit": COMMIT_HASH}) REQUESTS_COUNT = Counter("requests_count", "Number of requests received", namespace=NAMESPACE) From fb568768c5eba85dabac5ce8e686d3a1e9fc0a17 Mon Sep 17 00:00:00 2001 From: Alex Grintsvayg <grin@lbry.com> Date: Thu, 23 Jan 2020 12:38:41 -0500 Subject: [PATCH 3/5] include docker tag in build info --- docker/set_build.py | 43 +++++++++++++++++++++++-------------------- lbry/build_info.py | 1 + 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/docker/set_build.py b/docker/set_build.py index 9bbe9bc72..77592c2ef 100644 --- a/docker/set_build.py +++ b/docker/set_build.py @@ -1,38 +1,41 @@ -"""Set the build version to be 'qa', 'rc', 'release'""" - import sys import os import re import logging +import lbry.build_info as build_info_mod log = logging.getLogger() log.addHandler(logging.StreamHandler()) log.setLevel(logging.DEBUG) -def get_build_type(ci_tag=None): - if not ci_tag: - return "qa" - log.debug("getting build type for tag: \"%s\"", ci_tag) - if re.match(r'v\d+\.\d+\.\d+rc\d+$', ci_tag): - return 'rc' - elif re.match(r'v\d+\.\d+\.\d+$', ci_tag): - return 'release' - return 'qa' +def _check_and_set(d: dict, key: str, value: str): + try: + d[key] + except KeyError: + raise Exception(f"{key} var does not exist in {build_info_mod.__file__}") + d[key] = value def main(): - root_dir = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) - build_type_path = os.path.join(root_dir, 'lbry', 'build_type.py') - log.debug("configuring build type file: %s", build_type_path) - commit_hash = os.getenv('CI_COMMIT_SHA', os.getenv('TRAVIS_COMMIT')) + build_info = {item: build_info_mod.__dict__[item] for item in dir(build_info_mod) if not item.startswith("__")} + + commit_hash = os.getenv('DOCKER_COMMIT', os.getenv('CI_COMMIT_SHA', os.getenv('TRAVIS_COMMIT'))) if commit_hash is None: raise ValueError("Commit hash not found in env vars") - commit_hash = commit_hash[:6] - build_type = get_build_type(os.getenv('CI_COMMIT_TAG', os.getenv('TRAVIS_TAG'))) - log.debug("setting build type=%s, build commit=%s", build_type, commit_hash) - with open(build_type_path, 'w') as f: - f.write(f"BUILD = \"{build_type}\"\nCOMMIT_HASH = \"{commit_hash}\"\n") + _check_and_set(build_info, "COMMIT_HASH", commit_hash[:6]) + + docker_tag = os.getenv('DOCKER_TAG') + if docker_tag: + _check_and_set(build_info, "DOCKER_TAG", docker_tag) + _check_and_set(build_info, "BUILD", "docker") + else: + ci_tag = os.getenv('CI_COMMIT_TAG', os.getenv('TRAVIS_TAG')) + _check_and_set(build_info, "BUILD", "release" if re.match(r'v\d+\.\d+\.\d+$', str(ci_tag)) else "qa") + + log.debug("build info: %s", ", ".join([f"{k}={v}" for k, v in build_info.items()])) + with open(build_info_mod.__file__, 'w') as f: + f.write("\n".join([f"{k} = \"{v}\"" for k, v in build_info.items()]) + "\n") if __name__ == '__main__': diff --git a/lbry/build_info.py b/lbry/build_info.py index d85b9593b..6dadae418 100644 --- a/lbry/build_info.py +++ b/lbry/build_info.py @@ -1,3 +1,4 @@ # don't touch this. CI server changes this during build/deployment BUILD = "dev" COMMIT_HASH = "none" +DOCKER_TAG = "none" From 0732ab6ad5eaf73fbc2b8f7d0927cc698b404474 Mon Sep 17 00:00:00 2001 From: Alex Grintsvayg <grin@lbry.com> Date: Thu, 23 Jan 2020 12:37:13 -0500 Subject: [PATCH 4/5] add min_version and method name to metrics --- lbry/wallet/server/prometheus.py | 12 +++++++++--- lbry/wallet/server/session.py | 7 ++++--- lbry/wallet/server/version.py | 3 +++ 3 files changed, 16 insertions(+), 6 deletions(-) create mode 100644 lbry/wallet/server/version.py diff --git a/lbry/wallet/server/prometheus.py b/lbry/wallet/server/prometheus.py index 8872b2ae7..59bb3964c 100644 --- a/lbry/wallet/server/prometheus.py +++ b/lbry/wallet/server/prometheus.py @@ -1,14 +1,20 @@ from aiohttp import web from prometheus_client import Counter, Info, generate_latest as prom_generate_latest -from lbry.wallet.server import util from lbry import __version__ as version from lbry.build_info import BUILD, COMMIT_HASH +from lbry.wallet.server import util +import lbry.wallet.server.version as wallet_server_version NAMESPACE = "wallet_server" VERSION_INFO = Info('build', 'Wallet server build info (e.g. version, commit hash)', namespace=NAMESPACE) -VERSION_INFO.info({'version': version, 'build': BUILD, "commit": COMMIT_HASH}) -REQUESTS_COUNT = Counter("requests_count", "Number of requests received", namespace=NAMESPACE) +VERSION_INFO.info({ + 'build': BUILD, + "commit": COMMIT_HASH, + 'version': version, + "min_version": util.version_string(wallet_server_version.PROTOCOL_MIN), +}) +REQUESTS_COUNT = Counter("requests_count", "Number of requests received", namespace=NAMESPACE, labelnames=("method",)) class PrometheusServer: diff --git a/lbry/wallet/server/session.py b/lbry/wallet/server/session.py index f373da2f1..826ed38cc 100644 --- a/lbry/wallet/server/session.py +++ b/lbry/wallet/server/session.py @@ -28,6 +28,7 @@ from lbry.wallet.server.db import reader from lbry.wallet.server.websocket import AdminWebSocket from lbry.wallet.server.metrics import ServerLoadData, APICallMetrics from lbry.wallet.server.prometheus import REQUESTS_COUNT +import lbry.wallet.server.version as VERSION from lbry.wallet.rpc import ( RPCSession, JSONRPCAutoDetect, JSONRPCConnection, @@ -708,7 +709,7 @@ class SessionBase(RPCSession): """Handle an incoming request. ElectrumX doesn't receive notifications from client sessions. """ - REQUESTS_COUNT.inc() + REQUESTS_COUNT.labels(method=request.method).inc() if isinstance(request, Request): handler = self.request_handlers.get(request.method) else: @@ -778,8 +779,8 @@ class LBRYSessionManager(SessionManager): class LBRYElectrumX(SessionBase): """A TCP server that handles incoming Electrum connections.""" - PROTOCOL_MIN = (0, 54, 0) - PROTOCOL_MAX = (0, 99, 0) + PROTOCOL_MIN = VERSION.PROTOCOL_MIN + PROTOCOL_MAX = VERSION.PROTOCOL_MAX max_errors = math.inf # don't disconnect people for errors! let them happen... session_mgr: LBRYSessionManager version = lbry.__version__ diff --git a/lbry/wallet/server/version.py b/lbry/wallet/server/version.py new file mode 100644 index 000000000..7d640996d --- /dev/null +++ b/lbry/wallet/server/version.py @@ -0,0 +1,3 @@ +# need this to avoid circular import +PROTOCOL_MIN = (0, 54, 0) +PROTOCOL_MAX = (0, 99, 0) From 2232b083510466084bd2cae0dbc402d60648fa01 Mon Sep 17 00:00:00 2001 From: Alex Grintsvayg <grin@lbry.com> Date: Thu, 23 Jan 2020 12:37:20 -0500 Subject: [PATCH 5/5] fix gitlab ci --- .gitlab-ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 4fb053c62..347183a6d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -72,8 +72,8 @@ test:json-api: script: - pip install --upgrade 'setuptools<45.0.0' - pip install pyinstaller - - python3.7 docker/set_build.py - pip install -e . + - python3.7 docker/set_build.py # must come after lbry is installed because it imports lbry - pyinstaller --onefile --name lbrynet lbry/extras/cli.py - chmod +x dist/lbrynet - zip --junk-paths ${CI_PROJECT_DIR}/lbrynet-${OS}.zip dist/lbrynet # gitlab expects artifacts to be in $CI_PROJECT_DIR @@ -129,8 +129,8 @@ build:windows: script: - pip install --upgrade 'setuptools<45.0.0' - pip install pyinstaller==3.5 - - python docker/set_build.py - pip install -e . + - python docker/set_build.py # must come after lbry is installed because it imports lbry - pyinstaller --additional-hooks-dir=scripts/. --icon=icons/lbry256.ico -F -n lbrynet lbry/extras/cli.py - 7z a -tzip $env:CI_PROJECT_DIR/lbrynet-${OS}.zip ./dist/lbrynet.exe - checksum --type=sha256 --file=$env:CI_PROJECT_DIR/lbrynet-${OS}.zip