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: bf6e5df1b17f042687dd22fd18486555d04b5cfe3e493f479cfa4ca1e3f392ef
4
- data.tar.gz: d03707db9075c322a007109bf0e5b73804a1f061657fc39088008623cb0ee2ce
3
+ metadata.gz: 967c8cfa2155eb777cecf7f0f4b6bb18ebe459abb93721afa2cb0110dfefc286
4
+ data.tar.gz: 24ac56d223c4f2b10bf66aedda68a6b2e131d469e5ef4365b3b1d2b3eb19a23e
5
5
  SHA512:
6
- metadata.gz: 8dc7401daf7358046bfa80d0a6bbf1cbd929d317825a1f4c70466518b99be17b6656932a735377deccc616773a832434a654ae41cb3c54012053aa81ce3a3c49
7
- data.tar.gz: 1f0197ae4d7a65f04a294b89d45dac2b9ae45a4f251630dc0664c5be090c0dcf66fe675f1b2ed120651f00f27d64cf0713065d96be39a7b19ea3c57f6cabb1fc
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: params[:current_release], per_page: params[:issue_count]
157
+ release: current_release, per_page: params[:issue_count]
154
158
  )
155
- log_issues(params[:current_release], report[:issues][:current_release])
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: params[:previous_release], per_page: params[:issue_count]
168
+ release: previous_release, per_page: params[:issue_count]
161
169
  )
162
- log_issues(params[:previous_release], report[:issues][:previous_release])
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: group.dig('by', '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|
@@ -1,5 +1,5 @@
1
1
  module Fastlane
2
2
  module SentryApi
3
- VERSION = "0.6.0"
3
+ VERSION = "0.7.0"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fastlane-plugin-sentry_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - crazymanish