@alphabin/trx
Version:
TRX reporter for Playwright tests with Azure Blob Storage upload support
336 lines (335 loc) • 14.3 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.CICollector = void 0;
const exec_util_1 = require("../utils/exec.util");
const logger_util_1 = __importDefault(require("../utils/logger.util"));
/**
* Collector for CI/CD environment metadata
*/
class CICollector {
/**
* Collects CI/CD metadata
*/
async collect() {
try {
// Detect CI provider
const provider = this.detectProvider();
if (!provider) {
logger_util_1.default.debug('No CI provider detected');
return {};
}
// Collect data based on the provider
const pipeline = this.getPipelineInfo(provider);
const build = this.getBuildInfo(provider);
const environment = this.getEnvironmentInfo(provider);
return {
provider,
pipeline,
build,
environment
};
}
catch (error) {
logger_util_1.default.error('Failed to collect CI metadata', error);
return {};
}
}
/**
* Detects which CI/CD provider is being used
*/
detectProvider() {
if ((0, exec_util_1.getEnvVar)('GITHUB_ACTIONS')) {
return 'github-actions';
}
if ((0, exec_util_1.getEnvVar)('GITLAB_CI')) {
return 'gitlab-ci';
}
if ((0, exec_util_1.getEnvVar)('CIRCLECI')) {
return 'circle-ci';
}
if ((0, exec_util_1.getEnvVar)('JENKINS_URL')) {
return 'jenkins';
}
if ((0, exec_util_1.getEnvVar)('TRAVIS')) {
return 'travis-ci';
}
if ((0, exec_util_1.getEnvVar)('BITBUCKET_BUILD_NUMBER')) {
return 'bitbucket-pipelines';
}
if ((0, exec_util_1.getEnvVar)('AZURE_DEVOPS_BUILD_ID')) {
return 'azure-devops';
}
if ((0, exec_util_1.getEnvVar)('TEAMCITY_VERSION')) {
return 'teamcity';
}
if ((0, exec_util_1.getEnvVar)('DRONE')) {
return 'drone-ci';
}
if ((0, exec_util_1.getEnvVar)('APPVEYOR')) {
return 'appveyor';
}
if ((0, exec_util_1.getEnvVar)('CODEBUILD_BUILD_ID')) {
return 'aws-codebuild';
}
if ((0, exec_util_1.getEnvVar)('BUDDY')) {
return 'buddy-works';
}
// Check for generic CI environment variables
if ((0, exec_util_1.getEnvVar)('CI')) {
return 'generic-ci';
}
return undefined;
}
/**
* Gets information about the pipeline
*/
getPipelineInfo(provider) {
const id = this.getPipelineId(provider);
const name = this.getPipelineName(provider);
const url = this.getPipelineUrl(provider);
return {
id: id || 'unknown',
name: name || 'CI Pipeline',
url: url || ''
};
}
/**
* Gets pipeline ID based on the provider
*/
getPipelineId(provider) {
switch (provider) {
case 'github-actions':
return (0, exec_util_1.getEnvVar)('GITHUB_WORKFLOW') || (0, exec_util_1.getEnvVar)('GITHUB_RUN_ID');
case 'gitlab-ci':
return (0, exec_util_1.getEnvVar)('CI_PIPELINE_ID');
case 'circle-ci':
return (0, exec_util_1.getEnvVar)('CIRCLE_WORKFLOW_ID');
case 'jenkins':
return (0, exec_util_1.getEnvVar)('BUILD_TAG');
case 'travis-ci':
return (0, exec_util_1.getEnvVar)('TRAVIS_BUILD_ID');
case 'bitbucket-pipelines':
return (0, exec_util_1.getEnvVar)('BITBUCKET_PIPELINE_UUID');
case 'azure-devops':
return (0, exec_util_1.getEnvVar)('BUILD_BUILDID');
case 'teamcity':
return (0, exec_util_1.getEnvVar)('BUILD_ID');
case 'drone-ci':
return (0, exec_util_1.getEnvVar)('DRONE_BUILD_NUMBER');
case 'appveyor':
return (0, exec_util_1.getEnvVar)('APPVEYOR_BUILD_ID');
case 'aws-codebuild':
return (0, exec_util_1.getEnvVar)('CODEBUILD_BUILD_ID');
case 'buddy-works':
return (0, exec_util_1.getEnvVar)('BUDDY_PIPELINE_ID');
default:
return (0, exec_util_1.getEnvVar)('CI_BUILD_ID') || (0, exec_util_1.getEnvVar)('BUILD_ID');
}
}
/**
* Gets pipeline name based on the provider
*/
getPipelineName(provider) {
switch (provider) {
case 'github-actions':
return (0, exec_util_1.getEnvVar)('GITHUB_WORKFLOW');
case 'gitlab-ci':
return (0, exec_util_1.getEnvVar)('CI_PIPELINE_NAME') || (0, exec_util_1.getEnvVar)('CI_JOB_STAGE');
case 'circle-ci':
return (0, exec_util_1.getEnvVar)('CIRCLE_JOB');
case 'jenkins':
return (0, exec_util_1.getEnvVar)('JOB_NAME');
case 'travis-ci':
return 'Travis CI Build';
case 'bitbucket-pipelines':
return (0, exec_util_1.getEnvVar)('BITBUCKET_PIPELINE_NAME');
case 'azure-devops':
return (0, exec_util_1.getEnvVar)('BUILD_DEFINITIONNAME');
case 'teamcity':
return (0, exec_util_1.getEnvVar)('TEAMCITY_BUILDCONF_NAME');
case 'drone-ci':
return (0, exec_util_1.getEnvVar)('DRONE_REPO') ? `${(0, exec_util_1.getEnvVar)('DRONE_REPO')} pipeline` : undefined;
case 'appveyor':
return (0, exec_util_1.getEnvVar)('APPVEYOR_PROJECT_NAME');
case 'aws-codebuild':
return (0, exec_util_1.getEnvVar)('CODEBUILD_BUILD_ARN')?.split('/').pop();
case 'buddy-works':
return (0, exec_util_1.getEnvVar)('BUDDY_PIPELINE_NAME');
default:
return (0, exec_util_1.getEnvVar)('CI_JOB_NAME') || (0, exec_util_1.getEnvVar)('JOB_NAME');
}
}
/**
* Gets pipeline URL based on the provider
*/
getPipelineUrl(provider) {
switch (provider) {
case 'github-actions':
if ((0, exec_util_1.getEnvVar)('GITHUB_SERVER_URL') && (0, exec_util_1.getEnvVar)('GITHUB_REPOSITORY') && (0, exec_util_1.getEnvVar)('GITHUB_RUN_ID')) {
return `${(0, exec_util_1.getEnvVar)('GITHUB_SERVER_URL')}/${(0, exec_util_1.getEnvVar)('GITHUB_REPOSITORY')}/actions/runs/${(0, exec_util_1.getEnvVar)('GITHUB_RUN_ID')}`;
}
return undefined;
case 'gitlab-ci':
if ((0, exec_util_1.getEnvVar)('CI_PROJECT_URL') && (0, exec_util_1.getEnvVar)('CI_PIPELINE_ID')) {
return `${(0, exec_util_1.getEnvVar)('CI_PROJECT_URL')}/-/pipelines/${(0, exec_util_1.getEnvVar)('CI_PIPELINE_ID')}`;
}
return undefined;
case 'circle-ci':
return (0, exec_util_1.getEnvVar)('CIRCLE_BUILD_URL');
case 'travis-ci':
if ((0, exec_util_1.getEnvVar)('TRAVIS_REPO_SLUG') && (0, exec_util_1.getEnvVar)('TRAVIS_JOB_ID')) {
return `https://travis-ci.org/${(0, exec_util_1.getEnvVar)('TRAVIS_REPO_SLUG')}/jobs/${(0, exec_util_1.getEnvVar)('TRAVIS_JOB_ID')}`;
}
return undefined;
case 'bitbucket-pipelines':
return (0, exec_util_1.getEnvVar)('BITBUCKET_GIT_HTTP_ORIGIN')
? `${(0, exec_util_1.getEnvVar)('BITBUCKET_GIT_HTTP_ORIGIN')}/addon/pipelines/home#!/results/${(0, exec_util_1.getEnvVar)('BITBUCKET_BUILD_NUMBER')}`
: undefined;
case 'azure-devops':
return (0, exec_util_1.getEnvVar)('SYSTEM_TEAMFOUNDATIONCOLLECTIONURI') && (0, exec_util_1.getEnvVar)('SYSTEM_TEAMPROJECT') && (0, exec_util_1.getEnvVar)('BUILD_BUILDID')
? `${(0, exec_util_1.getEnvVar)('SYSTEM_TEAMFOUNDATIONCOLLECTIONURI')}${(0, exec_util_1.getEnvVar)('SYSTEM_TEAMPROJECT')}/_build/results?buildId=${(0, exec_util_1.getEnvVar)('BUILD_BUILDID')}`
: undefined;
default:
return (0, exec_util_1.getEnvVar)('CI_JOB_URL') || (0, exec_util_1.getEnvVar)('BUILD_URL');
}
}
/**
* Gets information about the build
*/
getBuildInfo(provider) {
const number = this.getBuildNumber(provider);
const trigger = this.getBuildTrigger(provider);
return {
number: number || 'unknown',
trigger: trigger || 'unknown'
};
}
/**
* Gets build number based on the provider
*/
getBuildNumber(provider) {
switch (provider) {
case 'github-actions':
return (0, exec_util_1.getEnvVar)('GITHUB_RUN_NUMBER') || (0, exec_util_1.getEnvVar)('GITHUB_RUN_ID');
case 'gitlab-ci':
return (0, exec_util_1.getEnvVar)('CI_JOB_ID') || (0, exec_util_1.getEnvVar)('CI_PIPELINE_IID');
case 'circle-ci':
return (0, exec_util_1.getEnvVar)('CIRCLE_BUILD_NUM');
case 'jenkins':
return (0, exec_util_1.getEnvVar)('BUILD_NUMBER');
case 'travis-ci':
return (0, exec_util_1.getEnvVar)('TRAVIS_BUILD_NUMBER');
case 'bitbucket-pipelines':
return (0, exec_util_1.getEnvVar)('BITBUCKET_BUILD_NUMBER');
case 'azure-devops':
return (0, exec_util_1.getEnvVar)('BUILD_BUILDNUMBER');
case 'teamcity':
return (0, exec_util_1.getEnvVar)('BUILD_NUMBER');
case 'drone-ci':
return (0, exec_util_1.getEnvVar)('DRONE_BUILD_NUMBER');
case 'appveyor':
return (0, exec_util_1.getEnvVar)('APPVEYOR_BUILD_NUMBER');
case 'aws-codebuild':
return (0, exec_util_1.getEnvVar)('CODEBUILD_BUILD_ID');
case 'buddy-works':
return (0, exec_util_1.getEnvVar)('BUDDY_EXECUTION_ID');
default:
return (0, exec_util_1.getEnvVar)('CI_JOB_ID') || (0, exec_util_1.getEnvVar)('BUILD_NUMBER');
}
}
/**
* Gets build trigger based on the provider
*/
getBuildTrigger(provider) {
switch (provider) {
case 'github-actions':
return (0, exec_util_1.getEnvVar)('GITHUB_EVENT_NAME');
case 'gitlab-ci':
return (0, exec_util_1.getEnvVar)('CI_PIPELINE_SOURCE');
case 'circle-ci':
return (0, exec_util_1.getEnvVar)('CIRCLE_PULL_REQUEST') ? 'pull_request' : 'push';
case 'travis-ci':
return (0, exec_util_1.getEnvVar)('TRAVIS_EVENT_TYPE');
case 'bitbucket-pipelines':
return (0, exec_util_1.getEnvVar)('BITBUCKET_TRIGGER');
case 'azure-devops':
return (0, exec_util_1.getEnvVar)('BUILD_REASON');
default:
// Try to determine from known environment variables
if ((0, exec_util_1.getEnvVar)('CI_MERGE_REQUEST_ID') || (0, exec_util_1.getEnvVar)('CI_EXTERNAL_PULL_REQUEST_IID')) {
return 'pull_request';
}
else if ((0, exec_util_1.getEnvVar)('CI_COMMIT_TAG')) {
return 'tag';
}
else {
return 'push';
}
}
}
/**
* Gets information about the environment
*/
getEnvironmentInfo(provider) {
// Get environment name
const name = this.getEnvironmentName(provider);
// Get environment type
let type = 'ci';
if ((0, exec_util_1.getEnvVar)('CI_ENVIRONMENT_NAME') === 'production' ||
(0, exec_util_1.getEnvVar)('ENVIRONMENT') === 'production' ||
(0, exec_util_1.getEnvVar)('NODE_ENV') === 'production') {
type = 'production';
}
else if ((0, exec_util_1.getEnvVar)('CI_ENVIRONMENT_NAME') === 'staging' ||
(0, exec_util_1.getEnvVar)('ENVIRONMENT') === 'staging' ||
(0, exec_util_1.getEnvVar)('NODE_ENV') === 'staging') {
type = 'staging';
}
else if ((0, exec_util_1.getEnvVar)('CI_ENVIRONMENT_NAME') === 'development' ||
(0, exec_util_1.getEnvVar)('ENVIRONMENT') === 'development' ||
(0, exec_util_1.getEnvVar)('NODE_ENV') === 'development') {
type = 'development';
}
// Get OS information
const os = `${process.platform} ${process.arch}`;
// Get Node.js version
const node = process.version;
return {
name: name || type,
type,
os,
node
};
}
/**
* Gets environment name based on the provider
*/
getEnvironmentName(provider) {
switch (provider) {
case 'github-actions':
return (0, exec_util_1.getEnvVar)('GITHUB_ENVIRONMENT');
case 'gitlab-ci':
return (0, exec_util_1.getEnvVar)('CI_ENVIRONMENT_NAME');
case 'circle-ci':
return (0, exec_util_1.getEnvVar)('CIRCLE_JOB');
case 'jenkins':
return (0, exec_util_1.getEnvVar)('ENVIRONMENT') || (0, exec_util_1.getEnvVar)('JENKINS_ENV');
case 'travis-ci':
return (0, exec_util_1.getEnvVar)('TRAVIS_ENVIRONMENT');
case 'bitbucket-pipelines':
return (0, exec_util_1.getEnvVar)('BITBUCKET_DEPLOYMENT_ENVIRONMENT');
case 'azure-devops':
return (0, exec_util_1.getEnvVar)('RELEASE_ENVIRONMENTNAME');
default:
return (0, exec_util_1.getEnvVar)('ENVIRONMENT') ||
(0, exec_util_1.getEnvVar)('ENV') ||
(0, exec_util_1.getEnvVar)('NODE_ENV') ||
'ci';
}
}
}
exports.CICollector = CICollector;
exports.default = CICollector;