Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,8 @@ interface TriggerRunRequest {
iosBuildId?: string
androidBuildId?: string
tenantId?: string
prNumber?: number
prTitle?: string
}

interface TriggerRunResponse {
Expand Down
52 changes: 52 additions & 0 deletions src/ci-metadata.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import * as fs from 'fs'
import * as core from '@actions/core'

export interface CiMetadata {
prNumber?: number
prTitle?: string
}
Comment on lines +4 to +7
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Missing releaseName extraction required by the new CI contract.

CiMetadata and getCiMetadata() currently only support PR fields. The PR objective includes releaseName (with fallback to tag_name when name is empty), so release-triggered runs will silently drop required metadata.

💡 Proposed patch
 export interface CiMetadata {
   prNumber?: number
   prTitle?: string
+  releaseName?: string
 }
@@
- * - `pull_request` / `pull_request_target` events → `prNumber`, `prTitle`
+ * - `pull_request` / `pull_request_target` events → `prNumber`, `prTitle`
+ * - `release` events → `releaseName` (fallback to `tag_name` when `name` is empty)
@@
   const pr = event?.pull_request as
     | { number?: number; title?: string }
     | undefined
@@
   }
+
+  const release = event?.release as
+    | { name?: string; tag_name?: string }
+    | undefined
+  if (release) {
+    const name =
+      typeof release.name === 'string' ? release.name.trim() : ''
+    const tagName =
+      typeof release.tag_name === 'string' ? release.tag_name.trim() : ''
+    if (name) metadata.releaseName = name
+    else if (tagName) metadata.releaseName = tagName
+  }

Also applies to: 9-16, 29-51

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/ci-metadata.ts` around lines 4 - 7, Update the CiMetadata type and the
getCiMetadata() extractor to include an optional releaseName string and ensure
release-triggered runs populate it: add releaseName?: string to the CiMetadata
interface and in getCiMetadata() detect release payloads (or the release object)
and set releaseName = release.name || release.tag_name (falling back to tag_name
when name is empty); keep existing prNumber/prTitle handling for PR runs and
ensure callers expecting releaseName will receive undefined for non-release
runs.


/**
* Extract pull request metadata from the GitHub event payload.
*
* - `pull_request` / `pull_request_target` events → `prNumber`, `prTitle`
*
* Returns an empty object for events that don't carry PR metadata (e.g. push,
* workflow_dispatch). Never throws — metadata is best-effort and optional.
*/
export function getCiMetadata(): CiMetadata {
const eventPath = process.env.GITHUB_EVENT_PATH
if (!eventPath) return {}

let event: Record<string, unknown>
try {
event = JSON.parse(fs.readFileSync(eventPath, 'utf-8'))
} catch {
core.warning('Failed to read GitHub event payload for CI metadata')
return {}
}

const metadata: CiMetadata = {}

const pr = event?.pull_request as
| { number?: number; title?: string }
| undefined
if (pr) {
if (typeof pr.number === 'number') {
metadata.prNumber = pr.number
}
if (typeof pr.title === 'string' && pr.title.trim()) {
metadata.prTitle = pr.title.trim()
}
}

if (metadata.prNumber !== undefined || metadata.prTitle) {
core.info(
`Detected pull request metadata: #${metadata.prNumber ?? '?'} ${
metadata.prTitle ?? ''
}`.trim(),
)
}

return metadata
}
6 changes: 6 additions & 0 deletions src/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import * as fs from 'fs'
import * as path from 'path'
import * as core from '@actions/core'
import { uploadBuild, triggerRun } from './api'
import { getCiMetadata } from './ci-metadata'
import { getCommitTitle } from './commit-title'
import {
validateAtLeastOneBuild,
Expand Down Expand Up @@ -29,6 +30,9 @@ async function run(): Promise<void> {
// ── Resolve commit title ────────────────────────────────────────
const commitTitle = getCommitTitle()

// ── Resolve CI metadata (PR / release info) ─────────────────────
const ciMetadata = getCiMetadata()

// ── Validate builds ──────────────────────────────────────────────
validateAtLeastOneBuild(iosBuildPath, androidBuildPath)

Expand Down Expand Up @@ -111,6 +115,8 @@ async function run(): Promise<void> {
iosBuildId,
androidBuildId,
tenantId: tenantId || undefined,
prNumber: ciMetadata.prNumber,
prTitle: ciMetadata.prTitle,
})

// ── Output results ───────────────────────────────────────────────
Expand Down