tdpw
Version:
CLI tool for uploading Playwright test reports to TestDino platform with TestDino storage support
206 lines • 7.73 kB
JavaScript
"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