UNPKG

@fancode/react-native-codepush-joystick

Version:
150 lines 5.88 kB
import { GithubWorkflowStatus, } from "../types"; export class GitHubActionsCICDProvider { config; constructor(config) { this.config = config; } async makeRequest(endpoint, options = {}, expectedStatus = 200, timeoutMs) { const url = `https://api.github.com/repos/${this.config.owner}/${this.config.repo}${endpoint}`; let controller; let signal; if (timeoutMs) { controller = new AbortController(); signal = controller.signal; setTimeout(() => controller.abort(), timeoutMs); } const response = await fetch(url, { ...options, signal, headers: { Authorization: `Bearer ${this.config.token}`, Accept: "application/vnd.github+json", "X-GitHub-Api-Version": "2022-11-28", "Content-Type": "application/json", ...options.headers, }, }); if (response.status !== expectedStatus) { throw new Error(`GitHub API error: ${response.status} ${response.statusText}`); } if (response.status === 204 || response.status === 202) { return null; } const contentType = response.headers.get("content-type"); if (contentType && contentType.includes("application/json")) { return response.json(); } else { return response.text(); } } async triggerBuild(params) { const workflowFile = this.config.workflowFile; const body = { ref: params.branch, inputs: { APP_VERSION: params.version, ...this.config.workflowInputs, }, }; await this.makeRequest(`/actions/workflows/${workflowFile}/dispatches`, { method: "POST", body: JSON.stringify(body), }, 204, 5000); const runs = await this.makeRequest(`/actions/workflows/${workflowFile}/runs?branch=${params.branch}&per_page=1`, {}, 200, 5000); const latestRun = runs.workflow_runs[0]; if (!latestRun) { return { buildId: "", status: { status: this.mapWorkflowStatus("completed", "success"), conclusion: "success", }, startedAt: new Date().toUTCString(), }; } return { buildId: latestRun.id.toString(), status: { status: this.mapWorkflowStatus(latestRun.status, latestRun.conclusion), conclusion: latestRun.conclusion, }, startedAt: latestRun.run_started_at, }; } async cancelBuild(buildId) { await this.makeRequest(`/actions/runs/${buildId}/cancel`, { method: "POST", }, 202, 5000); } async getWorkflowRuns(branchName) { const response = await this.makeRequest(`/actions/workflows/${this.config.workflowFile}/runs?branch=${branchName}&per_page=10`); return response.workflow_runs.map((run) => ({ id: run.id, name: run.name, head_branch: run.head_branch, head_sha: run.head_sha, run_number: run.run_number, status: run.status, conclusion: run.conclusion, created_at: run.created_at, updated_at: run.updated_at, run_started_at: run.run_started_at, })); } findWorkflowStatus(workflowRun) { if (!workflowRun) return null; return { buildInfo: { buildId: workflowRun.id.toString(), status: { status: this.mapWorkflowStatus(workflowRun.status, workflowRun.conclusion), conclusion: workflowRun.conclusion, }, startedAt: workflowRun.run_started_at, }, workflowStatus: { isRunning: [ GithubWorkflowStatus.IN_PROGRESS, GithubWorkflowStatus.QUEUED, GithubWorkflowStatus.PENDING, GithubWorkflowStatus.WAITING, ].includes(workflowRun.status), isFailed: workflowRun.status === GithubWorkflowStatus.COMPLETED && workflowRun.conclusion === GithubWorkflowStatus.FAILURE, isCancelled: workflowRun.status === GithubWorkflowStatus.COMPLETED && workflowRun.conclusion === GithubWorkflowStatus.CANCELLED, isCompleted: workflowRun.status === GithubWorkflowStatus.COMPLETED, rawStatus: workflowRun.status, rawConclusion: workflowRun.conclusion, id: workflowRun.id, startedAt: new Date(workflowRun.run_started_at), }, }; } mapWorkflowStatus(status, conclusion) { switch (status) { case "queued": case "waiting": case "requested": return GithubWorkflowStatus.QUEUED; case "in_progress": return GithubWorkflowStatus.IN_PROGRESS; case "completed": if (conclusion === "success") return GithubWorkflowStatus.COMPLETED; if (conclusion === "failure") return GithubWorkflowStatus.FAILURE; if (conclusion === "cancelled") return GithubWorkflowStatus.CANCELLED; return GithubWorkflowStatus.COMPLETED; default: return GithubWorkflowStatus.QUEUED; } } } export function createGitHubActionsCICDProvider(config) { return new GitHubActionsCICDProvider(config); } //# sourceMappingURL=github-actions-cicd-provider.js.map