Coverage for app/venv/lib/python3.14/site-packages/weblate/utils/management/commands/sentry_deploy.py: 0%
34 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 07:15 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 07:15 +0000
1# Copyright © Michal Čihař <michal@weblate.org>
2#
3# SPDX-License-Identifier: GPL-3.0-or-later
5import requests
6from django.conf import settings
7from django.core.management.base import CommandError
9import weblate.utils.version
10from weblate.utils.management.base import BaseCommand
12TAGS_API = "https://api.github.com/repos/WeblateOrg/weblate/git/ref/tags/{}"
15class Command(BaseCommand):
16 help = "records a release on Sentry"
18 def handle(self, *args, **options) -> None:
19 if weblate.utils.version.GIT_REVISION:
20 # Get release from Git
21 version = ref = weblate.utils.version.GIT_REVISION
22 else:
23 # Get commit hash from GitHub
24 version = weblate.utils.version.TAG_NAME
25 response = requests.get(TAGS_API.format(version), timeout=5)
26 response.raise_for_status()
27 data = response.json()
28 object_url = data["object"]["url"]
29 if not object_url.startswith("https://api.github.com/"):
30 msg = f"Unexpected URL from GitHub: {object_url}"
31 raise CommandError(msg)
32 response = requests.get(object_url, timeout=5)
33 response.raise_for_status()
34 ref = response.json()["object"]["sha"]
36 sentry_auth = {"Authorization": f"Bearer {settings.SENTRY_TOKEN}"}
37 sentry_url = settings.SENTRY_RELEASES_API_URL
38 release_url = sentry_url + version + "/"
40 # Ensure the release is tracked on Sentry
41 response = requests.get(release_url, headers=sentry_auth, timeout=30)
42 if response.status_code == 404:
43 data = {
44 "version": version,
45 "projects": settings.SENTRY_PROJECTS,
46 "ref": ref,
47 "refs": [{"repository": "WeblateOrg/weblate", "commit": ref}],
48 }
49 response = requests.post(
50 sentry_url, json=data, headers=sentry_auth, timeout=30
51 )
52 self.stdout.write(f"Created new release {version}")
53 response.raise_for_status()
55 # Track the deploy
56 response = requests.post(
57 release_url + "deploys/",
58 data={"environment": settings.SENTRY_ENVIRONMENT},
59 headers=sentry_auth,
60 timeout=30,
61 )
62 response.raise_for_status()
63 self.stdout.write("Created new Sentry deploy {}".format(response.json()["id"]))