UNPKG

tdpw

Version:

CLI tool for uploading Playwright test reports to TestDino platform with TestDino storage support

206 lines 7.73 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.CiCollector = void 0; const tslib_1 = require("tslib"); const os_1 = tslib_1.__importDefault(require("os")); const env_1 = require("../utils/env"); /** * Collector for CI/CD metadata from environment variables */ class CiCollector { static env = process.env; /** * Collects comprehensive CI metadata from the current environment * @returns Structured CI metadata including provider, pipeline, build, and environment info */ static collect() { const providerKey = env_1.EnvironmentUtils.detectCIProvider(); const provider = providerKey || 'unknown'; const metadata = this.getProviderMetadata(provider); const systemInfo = this.getSystemInfo(); return { provider, pipeline: { id: metadata.pipelineId, name: metadata.pipelineName, url: metadata.pipelineUrl, }, build: { number: metadata.buildNumber, trigger: metadata.buildTrigger, }, environment: { name: metadata.environmentName, type: systemInfo.platform, os: systemInfo.osRelease, node: systemInfo.nodeVersion, }, }; } /** * Extracts system information common to all CI providers */ static getSystemInfo() { return { platform: os_1.default.platform() || '', osRelease: `${os_1.default.type()} ${os_1.default.release()}`, nodeVersion: process.version || 'unknown', }; } /** * Routes to the appropriate metadata extractor based on CI provider */ static getProviderMetadata(provider) { const extractors = { 'github-actions': this.getGitHubActionsMetadata, 'gitlab-ci': this.getGitLabCIMetadata, circleci: this.getCircleCIMetadata, jenkins: this.getJenkinsMetadata, 'azure-devops': this.getAzureDevOpsMetadata, }; const extractor = extractors[provider]; return extractor ? extractor.call(this) : this.getGenericMetadata(); } /** * Extracts GitHub Actions specific metadata */ static getGitHubActionsMetadata() { const { GITHUB_SERVER_URL, GITHUB_REPOSITORY, GITHUB_RUN_ID } = this.env; const pipelineUrl = GITHUB_SERVER_URL && GITHUB_REPOSITORY && GITHUB_RUN_ID ? `${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}` : ''; return { pipelineId: this.env.GITHUB_RUN_ID || 'unknown', pipelineName: this.env.GITHUB_WORKFLOW || 'GitHub Actions', pipelineUrl, buildNumber: this.env.GITHUB_RUN_NUMBER || 'unknown', buildTrigger: this.env.GITHUB_EVENT_NAME || '', environmentName: this.env.RUNNER_OS || 'github-actions', }; } /** * Extracts GitLab CI specific metadata */ static getGitLabCIMetadata() { const pipelineName = this.getGitLabPipelineName(); const buildNumber = this.env.CI_JOB_ID || this.env.CI_PIPELINE_IID || 'unknown'; const environmentName = this.env.CI_ENVIRONMENT_NAME || this.env.CI_JOB_STAGE || 'gitlab-ci'; return { pipelineId: this.env.CI_PIPELINE_ID || 'unknown', pipelineName, pipelineUrl: this.env.CI_PIPELINE_URL || '', buildNumber, buildTrigger: this.env.CI_PIPELINE_SOURCE || '', environmentName, }; } /** * Determines GitLab pipeline name using fallback strategy */ static getGitLabPipelineName() { const { CI_PIPELINE_SOURCE, CI_COMMIT_TITLE, CI_PIPELINE_NAME } = this.env; if (CI_PIPELINE_SOURCE) { return `${CI_PIPELINE_SOURCE} pipeline`; } return CI_COMMIT_TITLE || CI_PIPELINE_NAME || 'GitLab Pipeline'; } /** * Extracts CircleCI specific metadata */ static getCircleCIMetadata() { const buildTrigger = this.getCircleCIBuildTrigger(); const pipelineId = this.env.CIRCLE_PIPELINE_ID || this.env.CIRCLE_BUILD_NUM || 'unknown'; const jobName = this.env.CIRCLE_JOB || 'CircleCI Pipeline'; return { pipelineId, pipelineName: jobName, pipelineUrl: this.env.CIRCLE_BUILD_URL || '', buildNumber: this.env.CIRCLE_BUILD_NUM || 'unknown', buildTrigger, environmentName: this.env.CIRCLE_JOB || 'circleci', }; } /** * Determines CircleCI build trigger based on environment variables */ static getCircleCIBuildTrigger() { if (this.env.CIRCLE_TAG) { return 'tag'; } if (this.env.CIRCLE_PR_NUMBER || this.env.CIRCLE_PULL_REQUEST) { return 'pr'; } return 'push'; } /** * Extracts Jenkins specific metadata */ static getJenkinsMetadata() { return { pipelineId: this.env.BUILD_ID || 'unknown', pipelineName: this.env.JOB_NAME || 'Jenkins Pipeline', pipelineUrl: this.env.BUILD_URL || '', buildNumber: this.env.BUILD_NUMBER || 'unknown', buildTrigger: this.env.BUILD_CAUSE || '', environmentName: this.env.NODE_NAME || 'jenkins', }; } /** * Extracts Azure DevOps specific metadata */ static getAzureDevOpsMetadata() { const pipelineUrl = this.buildAzureDevOpsPipelineUrl(); const environmentName = this.getAzureDevOpsEnvironmentName(); return { pipelineId: this.env.BUILD_BUILDID || 'unknown', pipelineName: this.env.BUILD_DEFINITIONNAME || 'Azure Pipeline', pipelineUrl, buildNumber: this.env.BUILD_BUILDNUMBER || 'unknown', buildTrigger: this.env.BUILD_REASON || '', environmentName, }; } /** * Constructs Azure DevOps pipeline URL from environment variables */ static buildAzureDevOpsPipelineUrl() { const { SYSTEM_TEAMFOUNDATIONSERVERURI, SYSTEM_TEAMPROJECT, BUILD_BUILDID, } = this.env; if (!SYSTEM_TEAMFOUNDATIONSERVERURI || !SYSTEM_TEAMPROJECT || !BUILD_BUILDID) { return ''; } try { const baseUrl = SYSTEM_TEAMFOUNDATIONSERVERURI.replace(/\/$/, ''); const encodedProject = encodeURIComponent(SYSTEM_TEAMPROJECT); return `${baseUrl}/${encodedProject}/_build/results?buildId=${BUILD_BUILDID}`; } catch { // Fallback if URL encoding fails return ''; } } /** * Determines Azure DevOps environment name with fallback strategy */ static getAzureDevOpsEnvironmentName() { const { SYSTEM_STAGENAME, AGENT_JOBNAME, AGENT_MACHINENAME } = this.env; return (SYSTEM_STAGENAME || AGENT_JOBNAME || AGENT_MACHINENAME || 'azure-devops'); } /** * Fallback metadata extraction for unknown or generic CI providers */ static getGenericMetadata() { const buildNumber = this.env.CI_BUILD_NUMBER || this.env.BUILD_NUMBER || 'unknown'; return { pipelineId: this.env.CI_PIPELINE_ID || 'unknown', pipelineName: this.env.CI_PIPELINE_NAME || 'CI Pipeline', pipelineUrl: this.env.CI_PIPELINE_URL || '', buildNumber, buildTrigger: this.env.CI_PIPELINE_SOURCE || '', environmentName: 'local', }; } } exports.CiCollector = CiCollector; //# sourceMappingURL=ci.js.map