diff --git a/src/api.ts b/src/api.ts index 27b9f7b..78f51d3 100644 --- a/src/api.ts +++ b/src/api.ts @@ -60,6 +60,8 @@ interface TriggerRunRequest { iosBuildId?: string androidBuildId?: string tenantId?: string + prNumber?: number + prTitle?: string } interface TriggerRunResponse { diff --git a/src/ci-metadata.ts b/src/ci-metadata.ts new file mode 100644 index 0000000..2f69a0c --- /dev/null +++ b/src/ci-metadata.ts @@ -0,0 +1,52 @@ +import * as fs from 'fs' +import * as core from '@actions/core' + +export interface CiMetadata { + prNumber?: number + prTitle?: string +} + +/** + * 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 + 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 +} diff --git a/src/main.ts b/src/main.ts index 6bd72eb..2063830 100644 --- a/src/main.ts +++ b/src/main.ts @@ -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, @@ -29,6 +30,9 @@ async function run(): Promise { // ── Resolve commit title ──────────────────────────────────────── const commitTitle = getCommitTitle() + // ── Resolve CI metadata (PR / release info) ───────────────────── + const ciMetadata = getCiMetadata() + // ── Validate builds ────────────────────────────────────────────── validateAtLeastOneBuild(iosBuildPath, androidBuildPath) @@ -111,6 +115,8 @@ async function run(): Promise { iosBuildId, androidBuildId, tenantId: tenantId || undefined, + prNumber: ciMetadata.prNumber, + prTitle: ciMetadata.prTitle, }) // ── Output results ───────────────────────────────────────────────