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

1# Copyright © Michal Čihař <michal@weblate.org> 

2# 

3# SPDX-License-Identifier: GPL-3.0-or-later 

4 

5import requests 

6from django.conf import settings 

7from django.core.management.base import CommandError 

8 

9import weblate.utils.version 

10from weblate.utils.management.base import BaseCommand 

11 

12TAGS_API = "https://api.github.com/repos/WeblateOrg/weblate/git/ref/tags/{}" 

13 

14 

15class Command(BaseCommand): 

16 help = "records a release on Sentry" 

17 

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"] 

35 

36 sentry_auth = {"Authorization": f"Bearer {settings.SENTRY_TOKEN}"} 

37 sentry_url = settings.SENTRY_RELEASES_API_URL 

38 release_url = sentry_url + version + "/" 

39 

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() 

54 

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"]))