From 4fb1230163994a6db630fc706b0fd5f84016132b Mon Sep 17 00:00:00 2001 From: Jenny Danzmayr Date: Mon, 11 Dec 2023 18:31:11 +0100 Subject: [PATCH] added version information to sentry and the about page --- docker/Dockerfile | 2 ++ docker/build.sh | 6 +++-- docker/tileserver.dockerfile | 2 ++ src/c3nav/__init__.py | 29 ++++++++++++++++++++++++ src/c3nav/settings.py | 2 ++ src/c3nav/site/templates/site/about.html | 1 + src/c3nav/site/views.py | 2 ++ 7 files changed, 42 insertions(+), 2 deletions(-) diff --git a/docker/Dockerfile b/docker/Dockerfile index cb910b40..6bc05536 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -71,6 +71,7 @@ RUN --mount=type=cache,target=/pip-cache \ pip install --cache-dir /pip-cache uwsgi FROM base as final +ARG COMMIT RUN groupadd -r -g 500 c3nav && useradd -r -u 500 -g 500 -G www-data c3nav RUN mkdir /data /etc/c3nav && chown -R c3nav:c3nav /data /etc/c3nav VOLUME /data @@ -83,6 +84,7 @@ ENV C3NAV_DEBUG="" \ C3NAV_LOGLEVEL="INFO" \ C3NAV_DATA_DIR="/data" \ C3NAV_AUTOMIGRATE="yes" \ + C3NAV_VERSION="${COMMIT}" \ MPLBACKEND="agg" \ UWSGI_WORKERS="4" \ PATH="/app/env/bin/:$PATH" diff --git a/docker/build.sh b/docker/build.sh index 717b8124..eca474f4 100755 --- a/docker/build.sh +++ b/docker/build.sh @@ -14,24 +14,26 @@ fi docker buildx build -f docker/Dockerfile \ --platform linux/arm64,linux/amd64 \ + --build-arg "COMMIT=${COMMIT}" \ --label "org.opencontainers.image.version=${COMMIT}" \ - -t "ghcr.io/c3nav/c3nav:${COMMIT}" \ --annotation org.opencontainers.image.source="https://github.com/c3nav/c3nav" \ --annotation org.opencontainers.image.url="https://c3nav.de" \ --annotation org.opencontainers.image.authors="c3nav team" \ --annotation org.opencontainers.image.description="Indoor navigation for the Chaos Communication Congress and other events. - Core" \ + --tag "ghcr.io/c3nav/c3nav:${COMMIT}" \ --cache-from "type=registry,ref=ghcr.io/c3nav/c3nav_cache:main" \ --cache-to "type=registry,ref=ghcr.io/c3nav/c3nav_cache:main,mode=max" \ --push "${CONTEXT}" docker buildx build -f docker/tileserver.dockerfile \ --platform linux/arm64,linux/amd64 \ + --build-arg "COMMIT=${COMMIT}" \ --label "org.opencontainers.image.version=${COMMIT}" \ - -t "ghcr.io/c3nav/c3nav-tileserver:${COMMIT}" \ --annotation org.opencontainers.image.source="https://github.com/c3nav/c3nav" \ --annotation org.opencontainers.image.url="https://c3nav.de" \ --annotation org.opencontainers.image.authors="c3nav team" \ --annotation org.opencontainers.image.description="Indoor navigation for the Chaos Communication Congress and other events. - Tileserver" \ + --tag "ghcr.io/c3nav/c3nav-tileserver:${COMMIT}" \ --cache-from "type=registry,ref=ghcr.io/c3nav/c3nav_cache:tileserver_main" \ --cache-to "type=registry,ref=ghcr.io/c3nav/c3nav_cache:tileserver_main,mode=max" \ --push "${CONTEXT}" diff --git a/docker/tileserver.dockerfile b/docker/tileserver.dockerfile index 21e870a7..c3d0b2c4 100644 --- a/docker/tileserver.dockerfile +++ b/docker/tileserver.dockerfile @@ -50,6 +50,7 @@ RUN --mount=type=cache,target=/pip-cache \ pip install --cache-dir /pip-cache uwsgi FROM base as final +ARG COMMIT RUN groupadd -r -g 500 c3nav && useradd -r -u 500 -g 500 -G www-data c3nav RUN mkdir /data && chown -R c3nav:c3nav /data VOLUME /data @@ -61,6 +62,7 @@ ENV C3NAV_DEBUG="" \ C3NAV_LOGLEVEL="INFO" \ C3NAV_DATA_DIR="/data" \ C3NAV_RELOAD_INTERVAL="60" \ + C3NAV_VERSION="${COMMIT}" UWSGI_WORKERS="4" # The following environment variables need to be set to start the tileserver diff --git a/src/c3nav/__init__.py b/src/c3nav/__init__.py index e69de29b..7674a4fc 100644 --- a/src/c3nav/__init__.py +++ b/src/c3nav/__init__.py @@ -0,0 +1,29 @@ +import os +import subprocess +from contextlib import suppress +from pathlib import Path + + +def _get_version(): + # first check for the environment variable that is set inside docker containers we build + if version := os.environ.get('C3NAV_VERSION', None): + return version.strip() + + # alternatively check if there is a `.version` file at the root of the c3nav module + version_file = Path(__file__).resolve().parent / '.version' + with suppress(FileNotFoundError): + if version := version_file.read_text().strip(): + return version + + # last check if this a checkout of c3nav git repo and get the current HEAD + if (Path(__file__).resolve().parent.parent.parent / '.git').exists(): + with suppress(FileNotFoundError, subprocess.SubprocessError): + run = subprocess.run(['git', 'rev-parse', 'HEAD'], capture_output=True, encoding='utf-8') + if run.returncode == 0: + return run.stdout.strip() + + # if everything fails return None + return None + + +__version__ = _get_version() diff --git a/src/c3nav/settings.py b/src/c3nav/settings.py index e0b217f4..fbd9344d 100644 --- a/src/c3nav/settings.py +++ b/src/c3nav/settings.py @@ -13,6 +13,7 @@ from django.core.exceptions import ImproperlyConfigured from django.utils.crypto import get_random_string from django.utils.translation import gettext_lazy as _ +from c3nav import __version__ as c3nav_version from c3nav.utils.config import C3navConfigParser from c3nav.utils.environ import Env @@ -61,6 +62,7 @@ with suppress(ImportError): denylist = DEFAULT_DENYLIST + sensitive_env_vars + sensitive_vars sentry_sdk.init( dsn=SENTRY_DSN, + release=c3nav_version, integrations=[CeleryIntegration(), DjangoIntegration()], event_scrubber=EventScrubber(denylist=denylist), enable_tracing=bool(config.getfloat('sentry', 'traces_sample_rate', fallback=0.0)), diff --git a/src/c3nav/site/templates/site/about.html b/src/c3nav/site/templates/site/about.html index 04a51e79..9e64ed92 100644 --- a/src/c3nav/site/templates/site/about.html +++ b/src/c3nav/site/templates/site/about.html @@ -19,6 +19,7 @@ {% if patrons %}

{% blocktrans %}Development of the software was supported by the following patrons on Patreon:{% endblocktrans %} {{ patrons }}

{% endif %} +

Version: {{ version }}

{% if address %}

{% trans 'Responsible for this website:' %}

diff --git a/src/c3nav/site/views.py b/src/c3nav/site/views.py index d8f612ec..1e39f826 100644 --- a/src/c3nav/site/views.py +++ b/src/c3nav/site/views.py @@ -25,6 +25,7 @@ from django.views.decorators.cache import cache_control, never_cache from django.views.decorators.clickjacking import xframe_options_exempt from django.views.decorators.http import etag +from c3nav import __version__ as c3nav_version from c3nav.api.models import Secret from c3nav.control.forms import AccessPermissionForm, SignedPermissionDataError from c3nav.mapdata.grid import grid @@ -362,6 +363,7 @@ def about_view(request): 'patrons': settings.IMPRINT_PATRONS, 'team': settings.IMPRINT_TEAM, 'hosting': settings.IMPRINT_HOSTING, + 'version': c3nav_version, })