fastlane-plugin-sentry_api 0.6.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 967c8cfa2155eb777cecf7f0f4b6bb18ebe459abb93721afa2cb0110dfefc286
|
|
4
|
+
data.tar.gz: 24ac56d223c4f2b10bf66aedda68a6b2e131d469e5ef4365b3b1d2b3eb19a23e
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 42f8a26e86553fcfa537adf41c509c02d59114386c2fbca86b36edadfc442a926cea9594e703ff5b5a57d6e3916aff4b0695146ac32b96654bdfab31f59444be
|
|
7
|
+
data.tar.gz: 5295a7e0512834f6cb265add060f564b553389a82c360c0221cd623806a79a94658ef00202491a8faec5166fab70217e3a48e2d472600da691c6fe8fe69c4bef
|
data/README.md
CHANGED
|
@@ -288,6 +288,8 @@ Generate a comprehensive SLO report by orchestrating multiple Sentry API calls.
|
|
|
288
288
|
- **Top Crash Issues** — Top unhandled error issues by frequency (`is:unresolved issue.category:error error.unhandled:true`)
|
|
289
289
|
- **Issues** — Issue counts and top issues per release (latest vs previous)
|
|
290
290
|
|
|
291
|
+
Release versions passed to `current_release` and `previous_release` are automatically resolved to their full Sentry release names (e.g. `5.38` → `nl.fastlane.app@5.38+26.04.03.12.22.54`) via the Releases API. This means you can pass bare version strings and the action handles the lookup.
|
|
292
|
+
|
|
291
293
|
Includes target checking with ✅/⚠️ indicators and optional JSON file output.
|
|
292
294
|
|
|
293
295
|
**Parameters:**
|
|
@@ -317,6 +319,9 @@ Includes target checking with ✅/⚠️ indicators and optional JSON file outpu
|
|
|
317
319
|
|
|
318
320
|
**Output (SharedValues):** `SENTRY_SLO_REPORT` (complete hash with `:availability`, `:latency`, `:issues`)
|
|
319
321
|
|
|
322
|
+
The `:availability` section includes:
|
|
323
|
+
- `:releases` — array of `{ release:, display_version:, crash_free_session_rate:, crash_free_user_rate:, total_sessions: }` per release (when `compare_releases` is true). The `display_version` is extracted from the full Sentry release name (e.g. `5.38` from `nl.fastlane.app@5.38+...`).
|
|
324
|
+
|
|
320
325
|
The `:latency` section includes:
|
|
321
326
|
- `:current` — array of per-screen TTID data
|
|
322
327
|
- `:overall` — aggregate TTID `{ avg:, p50:, p75:, p95:, count: }` across all screens
|
|
@@ -326,7 +331,7 @@ The `:latency` section includes:
|
|
|
326
331
|
The `:issues` section includes:
|
|
327
332
|
- `:top_crashes` — array of top unhandled error issues (always fetched, not release-scoped)
|
|
328
333
|
- `:total_crash_count` — total number of crash issues matching the query (up to 100), useful when you only display top N but want to show the full count
|
|
329
|
-
- `:current_release` — `{ version:, count:, issues: [] }` (when `current_release` is provided)
|
|
334
|
+
- `:current_release` — `{ version:, count:, issues: [] }` where `version` is the display version (e.g. `5.38`) (when `current_release` is provided)
|
|
330
335
|
- `:previous_release` — same structure (when `previous_release` is provided)
|
|
331
336
|
|
|
332
337
|
**Examples:**
|
|
@@ -148,18 +148,26 @@ module Fastlane
|
|
|
148
148
|
if params[:current_release]
|
|
149
149
|
UI.header("Issues (Release Comparison)")
|
|
150
150
|
|
|
151
|
+
current_release = resolve_sentry_release_name(
|
|
152
|
+
version: params[:current_release], auth_token: auth_token,
|
|
153
|
+
org_slug: org_slug, project_id: project_id
|
|
154
|
+
)
|
|
151
155
|
report[:issues][:current_release] = fetch_issues_for_release(
|
|
152
156
|
auth_token: auth_token, org_slug: org_slug, project_slug: project_slug,
|
|
153
|
-
release:
|
|
157
|
+
release: current_release, per_page: params[:issue_count]
|
|
154
158
|
)
|
|
155
|
-
log_issues(
|
|
159
|
+
log_issues(current_release, report[:issues][:current_release])
|
|
156
160
|
|
|
157
161
|
if params[:previous_release]
|
|
162
|
+
previous_release = resolve_sentry_release_name(
|
|
163
|
+
version: params[:previous_release], auth_token: auth_token,
|
|
164
|
+
org_slug: org_slug, project_id: project_id
|
|
165
|
+
)
|
|
158
166
|
report[:issues][:previous_release] = fetch_issues_for_release(
|
|
159
167
|
auth_token: auth_token, org_slug: org_slug, project_slug: project_slug,
|
|
160
|
-
release:
|
|
168
|
+
release: previous_release, per_page: params[:issue_count]
|
|
161
169
|
)
|
|
162
|
-
log_issues(
|
|
170
|
+
log_issues(previous_release, report[:issues][:previous_release])
|
|
163
171
|
end
|
|
164
172
|
end
|
|
165
173
|
|
|
@@ -422,8 +430,10 @@ module Fastlane
|
|
|
422
430
|
groups = response[:json]&.dig('groups') || []
|
|
423
431
|
groups.map do |group|
|
|
424
432
|
totals = group['totals'] || {}
|
|
433
|
+
release = group.dig('by', 'release')
|
|
425
434
|
{
|
|
426
|
-
release:
|
|
435
|
+
release: release,
|
|
436
|
+
display_version: extract_display_version(release),
|
|
427
437
|
crash_free_session_rate: totals['crash_free_rate(session)'],
|
|
428
438
|
crash_free_user_rate: totals['crash_free_rate(user)'],
|
|
429
439
|
total_sessions: totals['sum(session)']
|
|
@@ -442,7 +452,6 @@ module Fastlane
|
|
|
442
452
|
]
|
|
443
453
|
|
|
444
454
|
params = {
|
|
445
|
-
dataset: 'metrics',
|
|
446
455
|
field: fields,
|
|
447
456
|
project: project_id.to_s,
|
|
448
457
|
query: ttid_query(exclude_screens),
|
|
@@ -489,7 +498,6 @@ module Fastlane
|
|
|
489
498
|
]
|
|
490
499
|
|
|
491
500
|
params = {
|
|
492
|
-
dataset: 'metrics',
|
|
493
501
|
field: fields,
|
|
494
502
|
project: project_id.to_s,
|
|
495
503
|
query: ttid_query(exclude_screens),
|
|
@@ -536,7 +544,6 @@ module Fastlane
|
|
|
536
544
|
]
|
|
537
545
|
|
|
538
546
|
params = {
|
|
539
|
-
dataset: 'metrics',
|
|
540
547
|
field: fields,
|
|
541
548
|
project: project_id.to_s,
|
|
542
549
|
query: "event.type:transaction has:measurements.#{measurement}",
|
|
@@ -645,7 +652,7 @@ module Fastlane
|
|
|
645
652
|
}
|
|
646
653
|
end
|
|
647
654
|
|
|
648
|
-
{ version: release, count: issues.length, issues: issues }
|
|
655
|
+
{ version: extract_display_version(release), count: issues.length, issues: issues }
|
|
649
656
|
end
|
|
650
657
|
|
|
651
658
|
# ── Date Utilities ────────────────────────────────────────────────
|
|
@@ -699,6 +706,52 @@ module Fastlane
|
|
|
699
706
|
{ avg: nil, p50: nil, p75: nil, p95: nil, count: nil }
|
|
700
707
|
end
|
|
701
708
|
|
|
709
|
+
# Resolve a bare version string (e.g. '5.38') to the full Sentry release name
|
|
710
|
+
# (e.g. 'nl.fastlane.app@5.38+26.04.03.12.22.54') via the Releases API.
|
|
711
|
+
# Falls back to the original version if no match is found.
|
|
712
|
+
def resolve_sentry_release_name(version:, auth_token:, org_slug:, project_id:)
|
|
713
|
+
response = Helper::SentryApiHelper.api_request(
|
|
714
|
+
auth_token: auth_token,
|
|
715
|
+
path: "/organizations/#{org_slug}/releases/",
|
|
716
|
+
params: { query: version, per_page: '10', project: project_id.to_s }
|
|
717
|
+
)
|
|
718
|
+
|
|
719
|
+
if response[:status].between?(200, 299)
|
|
720
|
+
releases = response[:json] || []
|
|
721
|
+
matching = releases.find do |r|
|
|
722
|
+
v = r['version'].to_s
|
|
723
|
+
v == version || v.match?(/\A[^@]+@#{Regexp.escape(version)}\+/)
|
|
724
|
+
end
|
|
725
|
+
|
|
726
|
+
if matching
|
|
727
|
+
UI.success("Resolved Sentry release: '#{version}' \u2192 '#{matching['version']}'")
|
|
728
|
+
return matching['version']
|
|
729
|
+
end
|
|
730
|
+
else
|
|
731
|
+
UI.important("Sentry Releases API returned #{response[:status]} for '#{version}'")
|
|
732
|
+
end
|
|
733
|
+
|
|
734
|
+
UI.important("No Sentry release found for '#{version}', using bare version")
|
|
735
|
+
version
|
|
736
|
+
rescue => e
|
|
737
|
+
UI.important("Failed to query Sentry Releases API for '#{version}': #{e.message}")
|
|
738
|
+
version
|
|
739
|
+
end
|
|
740
|
+
|
|
741
|
+
# Extract the short display version from a Sentry release name.
|
|
742
|
+
# 'nl.fastlane.app@5.38+26.04.03.12.22.54' → '5.38'
|
|
743
|
+
# '5.37' → '5.37'
|
|
744
|
+
def extract_display_version(release_name)
|
|
745
|
+
return release_name if release_name.nil? || release_name.empty?
|
|
746
|
+
|
|
747
|
+
if release_name.include?('@')
|
|
748
|
+
version_part = release_name.split('@').last
|
|
749
|
+
version_part.split('+').first
|
|
750
|
+
else
|
|
751
|
+
release_name
|
|
752
|
+
end
|
|
753
|
+
end
|
|
754
|
+
|
|
702
755
|
def ttid_query(exclude_screens)
|
|
703
756
|
parts = ['event.type:transaction transaction.op:ui.load']
|
|
704
757
|
(exclude_screens || []).each do |screen|
|