UNPKG

@paschal_cheps/cypress-ms-teams-reporter

Version:

A Cypress reporter for Microsoft Teams with mochawesome support

122 lines (121 loc) 5.25 kB
// ciProviders.ts import axios from "axios"; import chalk from "chalk"; export class GitHubProvider { async getArtifactUrl() { const { GITHUB_RUN_ID, GITHUB_REPOSITORY, GITHUB_TOKEN } = process.env; if (!GITHUB_RUN_ID || !GITHUB_REPOSITORY || !GITHUB_TOKEN) { console.error(chalk.red("❌ Missing GitHub credentials. Skipping artifact retrieval.")); return null; } try { // Fetch artifacts for the current workflow run const response = await axios.get(`https://api.github.com/repos/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}/artifacts`, { headers: { Authorization: `Bearer ${GITHUB_TOKEN}`, Accept: "application/vnd.github.v3+json", }, }); // Check if any artifacts exist if (!response.data.artifacts || response.data.artifacts.length === 0) { console.error(chalk.yellow("⚠️ No artifacts found for this run.")); return null; } // Extract the first artifact's ID const artifactId = response.data.artifacts[0].id; // Construct the artifact URL in the desired format const artifactUrl = `https://github.com/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}/artifacts/${artifactId}`; console.log(chalk.green(`✅ Artifact URL: ${artifactUrl}`)); return artifactUrl; } catch (error) { console.error(chalk.red("❌ Failed to fetch GitHub artifact URL:", error)); return process.env.REPORT_URL || null; } } } export class BitbucketProvider { async getArtifactUrl() { const { BITBUCKET_WORKSPACE, BITBUCKET_REPO_SLUG, BITBUCKET_BUILD_NUMBER } = process.env; if (!BITBUCKET_WORKSPACE || !BITBUCKET_REPO_SLUG || !BITBUCKET_BUILD_NUMBER) { console.error(chalk.red("❌ Missing Bitbucket credentials. Skipping artifact retrieval.")); return null; } try { const artifactUrl = `https://bitbucket.org/${BITBUCKET_WORKSPACE}/${BITBUCKET_REPO_SLUG}/pipelines/results/${BITBUCKET_BUILD_NUMBER}`; console.log(chalk.green(`✅ Bitbucket Pipeline Results URL: ${artifactUrl}`)); return artifactUrl; } catch (error) { console.error(chalk.red("❌ Failed to construct Bitbucket Pipeline Results URL:", error)); return process.env.REPORT_URL || null; } } } export class CircleCIProvider { async getArtifactUrl() { const { CIRCLE_PROJECT_USERNAME, CIRCLE_PROJECT_REPONAME, CIRCLE_BUILD_NUM, CIRCLE_WORKFLOW_ID, CIRCLE_PROJECT_ID, } = process.env; if (!CIRCLE_PROJECT_USERNAME || !CIRCLE_PROJECT_REPONAME || !CIRCLE_BUILD_NUM || !CIRCLE_WORKFLOW_ID || !CIRCLE_PROJECT_ID) { console.error(chalk.red("❌ Missing CircleCI credentials. Skipping artifact retrieval.")); return null; } try { const artifactUrl = `https://app.circleci.com/pipelines/github/${CIRCLE_PROJECT_USERNAME}/${CIRCLE_PROJECT_REPONAME}/${CIRCLE_PROJECT_ID}/workflows/${CIRCLE_WORKFLOW_ID}/jobs/${CIRCLE_BUILD_NUM}/artifacts`; console.log(chalk.green(`✅ CircleCI Artifacts URL: ${artifactUrl}`)); return artifactUrl; } catch (error) { console.error(chalk.red("❌ Failed to construct CircleCI Artifacts URL:", error)); return process.env.REPORT_URL || null; } } } export class JenkinsProvider { async getArtifactUrl() { const { JENKINS_URL, JOB_NAME, BUILD_URL } = process.env; if (!JENKINS_URL || !JOB_NAME || !BUILD_URL) { console.error(chalk.red("❌ Missing Jenkins credentials (JENKINS_URL, JOB_NAME, BUILD_URL). Skipping artifact retrieval.")); return null; } try { const artifactUrl = BUILD_URL; console.log(chalk.green(`✅ Jenkins Pipeline Results URL: ${artifactUrl}`)); return artifactUrl; } catch (error) { console.error(chalk.red("❌ Failed to construct Jenkins Pipeline Results URL:", error)); return process.env.REPORT_URL || null; } } } export class LocalProvider { async getArtifactUrl() { console.log(chalk.blue("📄 Running locally, using REPORT_URL from environment.")); return process.env.REPORT_URL || null; } } export function getCIProvider(provider) { const ciProvider = provider?.toLowerCase() || "github"; // Default to GitHub switch (ciProvider) { case "github": return new GitHubProvider(); case "bitbucket": return new BitbucketProvider(); case "circleci": return new CircleCIProvider(); case "jenkins": return new JenkinsProvider(); case "local": case "none": return new LocalProvider(); default: console.warn(`⚠️ Unknown CI provider: ${provider}. Defaulting to GitHub.`); return new GitHubProvider(); } }