UNPKG

@alphabin/trx

Version:

TRX reporter for Playwright tests with Azure Blob Storage upload support

336 lines (335 loc) 14.3 kB
"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;