Browse Source

feat(appconnect): New table to track when sentry last checked for new builds on App Store Connect (#27772)

This is meant to replace the project option `sentry:asc_build_refresh_dates`.
relaxolotl 3 years ago
parent
commit
1c615694be

+ 1 - 1
migrations_lockfile.txt

@@ -7,5 +7,5 @@ will then be regenerated, and you should be able to merge without conflicts.
 
 jira_ac: 0001_initial
 nodestore: 0002_nodestore_no_dictfield
-sentry: 0224_has_sessions_flag
+sentry: 0225_latest_appconnect_builds_check
 social_auth: 0001_initial

+ 1 - 0
src/sentry/deletions/defaults/project.py

@@ -29,6 +29,7 @@ class ProjectDeletionTask(ModelDeletionTask):
             models.GroupSeen,
             models.GroupShare,
             models.GroupSubscription,
+            models.LatestAppConnectBuildsCheck,
             models.ProjectBookmark,
             models.ProjectKey,
             models.ProjectTeam,

+ 67 - 0
src/sentry/migrations/0225_latest_appconnect_builds_check.py

@@ -0,0 +1,67 @@
+# Generated by Django 2.0.13 on 2021-07-27 21:38
+
+import django.db.models.deletion
+import django.utils.timezone
+from django.db import migrations, models
+
+import sentry.db.models.fields.bounded
+import sentry.db.models.fields.foreignkey
+
+
+class Migration(migrations.Migration):
+    # This flag is used to mark that a migration shouldn't be automatically run in
+    # production. We set this to True for operations that we think are risky and want
+    # someone from ops to run manually and monitor.
+    # General advice is that if in doubt, mark your migration as `is_dangerous`.
+    # Some things you should always mark as dangerous:
+    # - Large data migrations. Typically we want these to be run manually by ops so that
+    #   they can be monitored. Since data migrations will now hold a transaction open
+    #   this is even more important.
+    # - Adding columns to highly active tables, even ones that are NULL.
+    is_dangerous = False
+
+    # This flag is used to decide whether to run this migration in a transaction or not.
+    # By default we prefer to run in a transaction, but for migrations where you want
+    # to `CREATE INDEX CONCURRENTLY` this needs to be set to False. Typically you'll
+    # want to create an index concurrently when adding one to an existing table.
+    # You'll also usually want to set this to `False` if you're writing a data
+    # migration, since we don't want the entire migration to run in one long-running
+    # transaction.
+    atomic = True
+
+    dependencies = [
+        ("sentry", "0224_has_sessions_flag"),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name="LatestAppConnectBuildsCheck",
+            fields=[
+                (
+                    "id",
+                    sentry.db.models.fields.bounded.BoundedBigAutoField(
+                        primary_key=True, serialize=False
+                    ),
+                ),
+                ("date_updated", models.DateTimeField(default=django.utils.timezone.now)),
+                ("date_added", models.DateTimeField(default=django.utils.timezone.now, null=True)),
+                ("source_id", models.CharField(max_length=200)),
+                ("last_checked", models.DateTimeField(default=django.utils.timezone.now)),
+                (
+                    "project",
+                    sentry.db.models.fields.foreignkey.FlexibleForeignKey(
+                        db_constraint=False,
+                        on_delete=django.db.models.deletion.CASCADE,
+                        to="sentry.Project",
+                    ),
+                ),
+            ],
+            options={
+                "db_table": "sentry_latestappconnectbuildscheck",
+            },
+        ),
+        migrations.AlterUniqueTogether(
+            name="latestappconnectbuildscheck",
+            unique_together={("project", "source_id")},
+        ),
+    ]

+ 1 - 0
src/sentry/models/__init__.py

@@ -60,6 +60,7 @@ from .grouptombstone import *  # NOQA
 from .identity import *  # NOQA
 from .integration import *  # NOQA
 from .integrationfeature import *  # NOQA
+from .latestappconnectbuildscheck import *  # NOQA
 from .latestreporeleaseenvironment import *  # NOQA
 from .lostpasswordhash import *  # NOQA
 from .monitor import *  # NOQA

+ 34 - 0
src/sentry/models/latestappconnectbuildscheck.py

@@ -0,0 +1,34 @@
+"""Database models to keep track of the App Store Connect builds for a project.
+
+For projects using the App Store Connect symbol source this keeps track of the last time we
+did manage to check for available builds.
+"""
+
+from django.db import models
+from django.utils import timezone
+
+from sentry.db.models import DefaultFieldsModel, FlexibleForeignKey
+
+
+class LatestAppConnectBuildsCheck(DefaultFieldsModel):
+    """
+    The last date and time Sentry checked App Store Connect for new builds associated with a
+    specific appconnect source in a project.
+    """
+
+    __include_in_export__ = False
+
+    project = FlexibleForeignKey("sentry.Project", db_constraint=False)
+
+    # The symbol source's unique identifier in the project. Also known as the id on an
+    # AppStoreConnectConfig.
+    source_id = models.CharField(max_length=200)
+
+    # When sentry last checked App Store Connect for new builds. A check may return zero new builds,
+    # or no builds at all if all existing builds have expired.
+    last_checked = models.DateTimeField(default=timezone.now)
+
+    class Meta:
+        app_label = "sentry"
+        db_table = "sentry_latestappconnectbuildscheck"
+        unique_together = [("project", "source_id")]