@fancode/react-native-codepush-joystick
Version:
A flexible CodePush Joystick for React Native apps
150 lines • 5.88 kB
JavaScript
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