Browse Source

test(appconnect): Add simple CLI for dev work (#27504)

Simple CLI script for dev work on app store connect.
Floris Bruynooghe 3 years ago
parent
commit
53b536ab26
1 changed files with 79 additions and 0 deletions
  1. 79 0
      scripts/appconnect_cli.py

+ 79 - 0
scripts/appconnect_cli.py

@@ -0,0 +1,79 @@
+#!/usr/bin/env sentry exec
+"""Dumb CLI to experiment with our App Store Connect functionality.
+
+It contains several useful tools to manipulate the database during development.  Exactly
+what it does can be easily changed based on new needs though, nothing is set in stone.
+
+Most actions assume you have only one App Store Connect source and will simply pick the
+first one found.
+"""
+import sys
+from pprint import pprint
+
+from sentry.lang.native.appconnect import SYMBOL_SOURCES_PROP_NAME
+from sentry.models import AppConnectBuild, Project
+from sentry.tasks import app_store_connect
+from sentry.utils import json
+
+PROJECT_ID = 2
+
+
+def main(argv):
+    if argv[0] == "dump-cfg":
+        # Dumps the symbolSource configuration as stored in the project option.
+        project = Project.objects.get(pk=PROJECT_ID)
+        raw_config = project.get_option(SYMBOL_SOURCES_PROP_NAME, default="[]")
+        config = json.loads(raw_config)
+        pprint(config)
+
+    elif argv[0] == "dsyms":
+        # Start the dsym_download task for first config found (needs running workers).
+        config = appconnect_config()
+        app_store_connect.dsym_download(PROJECT_ID, config["id"])
+
+    elif argv[0] == "zip":
+        # "Uploads" DIFs into sentry from a zipfile passed as argument.
+        project = Project.objects.get(pk=PROJECT_ID)
+        app_store_connect.create_difs_from_dsyms_zip(argv[1], project)
+
+    elif argv[0] == "dump-db":
+        # Dumps (part of) the AppConnectBuild table.
+        for build in AppConnectBuild.objects.all():
+            print(  # noqa: B314
+                f"{build!r} app_id={build.app_id} bundle_id={build.bundle_id} platform={build.platform} version={build.bundle_short_version} build={build.bundle_version} fetched={build.fetched}"
+            )
+
+    elif argv[0] == "reset-fetched":
+        # Resets the fetched state of the AppConnectBuild table, so dsym_download task will
+        # process the entries again.
+        for build in AppConnectBuild.objects.all():
+            build.fetched = False
+            build.save()
+
+    elif argv[0] == "task":
+        # Manually trigger the dsym_download task right now (needs running workers).
+        config = appconnect_config()
+        app_store_connect.dsym_download.apply_async(
+            kwargs={"project_id": PROJECT_ID, "config_id": config["id"]}
+        )
+
+    else:
+        raise ValueError("Unknown command")
+
+
+def appconnect_config():
+    project = Project.objects.get(pk=PROJECT_ID)
+    raw_config = project.get_option(SYMBOL_SOURCES_PROP_NAME, default="[]")
+    symbol_sources = json.loads(raw_config)
+    for config in symbol_sources:
+        if config["type"] == "appStoreConnect":
+            return config
+    else:
+        raise KeyError("appStoreConnect config not found")
+
+
+if __name__ == "__main__":
+    if sys.argv[2].startswith("--project="):
+        project_arg = sys.argv.pop(2)
+        PROJECT_ID = int(project_arg[10:])
+    main(sys.argv[2:])