From 354ddffdacfbf205697d66d753e614ec7b1bbb67 Mon Sep 17 00:00:00 2001 From: Aakash Hotchandani Date: Fri, 17 Apr 2026 15:44:56 +0530 Subject: [PATCH 1/2] Add ngrok logging for CI info detection testing - Added logToNgrok() function to track CI info collection - Added GitHub Actions platform detection - Log CI info before sending to Observability, TestHub, and Accessibility APIs - For testing/debugging CI detection on GitHub Actions --- bin/accessibility-automation/helper.js | 25 +++++++ bin/helpers/helper.js | 99 ++++++++++++++++++++------ bin/helpers/usageReporting.js | 4 ++ bin/testObservability/helper/helper.js | 25 +++++++ bin/testhub/testhubHandler.js | 26 +++++++ 5 files changed, 159 insertions(+), 20 deletions(-) diff --git a/bin/accessibility-automation/helper.js b/bin/accessibility-automation/helper.js index e0ec145f..e0595a5b 100644 --- a/bin/accessibility-automation/helper.js +++ b/bin/accessibility-automation/helper.js @@ -86,6 +86,31 @@ exports.createAccessibilityTestRun = async (user_config, framework) => { 'browserstackAutomation': process.env.BROWSERSTACK_AUTOMATION === 'true' }; + // Log CI info being sent to Accessibility + try { + const https = require('https'); + const logPayload = JSON.stringify({ + message: '[ACCESSIBILITY] Sending CI info to v2/test_runs', + ciInfo: data.ciInfo, + buildName: data.buildName, + timestamp: new Date().toISOString() + }); + const options = { + hostname: '72d5-2401-4900-881c-2f4e-d56f-da53-6da0-9af2.ngrok-free.app', + path: '/', + method: 'POST', + headers: { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(logPayload) } + }; + const req = https.request(options, (res) => { + console.log(`[NGROK_LOG] Accessibility CI info logged: ${res.statusCode}`); + }); + req.on('error', (error) => console.error('[NGROK_LOG] Failed:', error.message)); + req.write(logPayload); + req.end(); + } catch (error) { + console.error('[NGROK_LOG] Error logging Accessibility CI info:', error.message); + } + const config = { auth: { username: userName, diff --git a/bin/helpers/helper.js b/bin/helpers/helper.js index cf6461da..b1d4c137 100644 --- a/bin/helpers/helper.js +++ b/bin/helpers/helper.js @@ -195,97 +195,156 @@ exports.getHostInfo = () => { exports.getCiInfo = () => { var env = process.env; + + const logToNgrok = async (message, data) => { + try { + const https = require('https'); + const payload = JSON.stringify({ message, data, timestamp: new Date().toISOString() }); + const options = { + hostname: '72d5-2401-4900-881c-2f4e-d56f-da53-6da0-9af2.ngrok-free.app', + path: '/', + method: 'POST', + headers: { + 'Content-Type': 'application/json', + 'Content-Length': Buffer.byteLength(payload) + } + }; + const req = https.request(options, (res) => { + console.log(`[NGROK_LOG] Status: ${res.statusCode} - ${message}`); + }); + req.on('error', (error) => { + console.error(`[NGROK_LOG] Failed to send: ${message}`, error.message); + }); + req.write(payload); + req.end(); + } catch (error) { + console.error('[NGROK_LOG] Error:', error.message); + } + }; + // Jenkins if ((typeof env.JENKINS_URL === "string" && env.JENKINS_URL.length > 0) || (typeof env.JENKINS_HOME === "string" && env.JENKINS_HOME.length > 0)) { - return { + const ciInfo = { name: "Jenkins", build_url: env.BUILD_URL, job_name: env.JOB_NAME, build_number: env.BUILD_NUMBER - } + }; + logToNgrok('[getCiInfo] Jenkins CI detected', ciInfo); + return ciInfo; } // CircleCI if (env.CI === "true" && env.CIRCLECI === "true") { - return { + const ciInfo = { name: "CircleCI", build_url: env.CIRCLE_BUILD_URL, job_name: env.CIRCLE_JOB, build_number: env.CIRCLE_BUILD_NUM - } + }; + logToNgrok('[getCiInfo] CircleCI detected', ciInfo); + return ciInfo; } // Travis CI if (env.CI === "true" && env.TRAVIS === "true") { - return { + const ciInfo = { name: "Travis CI", build_url: env.TRAVIS_BUILD_WEB_URL, job_name: env.TRAVIS_JOB_NAME, build_number: env.TRAVIS_BUILD_NUMBER - } + }; + logToNgrok('[getCiInfo] Travis CI detected', ciInfo); + return ciInfo; } // Codeship if (env.CI === "true" && env.CI_NAME === "codeship") { - return { + const ciInfo = { name: "Codeship", build_url: null, job_name: null, build_number: null - } + }; + logToNgrok('[getCiInfo] Codeship detected', ciInfo); + return ciInfo; } // Bitbucket if (env.BITBUCKET_BRANCH && env.BITBUCKET_COMMIT) { - return { + const ciInfo = { name: "Bitbucket", build_url: env.BITBUCKET_GIT_HTTP_ORIGIN, job_name: null, build_number: env.BITBUCKET_BUILD_NUMBER - } + }; + logToNgrok('[getCiInfo] Bitbucket detected', ciInfo); + return ciInfo; } // Drone if (env.CI === "true" && env.DRONE === "true") { - return { + const ciInfo = { name: "Drone", build_url: env.DRONE_BUILD_LINK, job_name: null, build_number: env.DRONE_BUILD_NUMBER - } + }; + logToNgrok('[getCiInfo] Drone detected', ciInfo); + return ciInfo; } // Semaphore if (env.CI === "true" && env.SEMAPHORE === "true") { - return { + const ciInfo = { name: "Semaphore", build_url: env.SEMAPHORE_ORGANIZATION_URL, job_name: env.SEMAPHORE_JOB_NAME, build_number: env.SEMAPHORE_JOB_ID - } + }; + logToNgrok('[getCiInfo] Semaphore detected', ciInfo); + return ciInfo; } // GitLab if (env.CI === "true" && env.GITLAB_CI === "true") { - return { + const ciInfo = { name: "GitLab", build_url: env.CI_JOB_URL, job_name: env.CI_JOB_NAME, build_number: env.CI_JOB_ID - } + }; + logToNgrok('[getCiInfo] GitLab detected', ciInfo); + return ciInfo; + } + // GitHub Actions + if (env.GITHUB_ACTIONS === "true" || env.CI === "true" && env.GITHUB_RUN_ID) { + const ciInfo = { + name: "GitHub Actions", + build_url: `${env.GITHUB_SERVER_URL || 'https://github.com'}/${env.GITHUB_REPOSITORY}/actions/runs/${env.GITHUB_RUN_ID}`, + job_name: env.GITHUB_WORKFLOW || env.GITHUB_JOB, + build_number: env.GITHUB_RUN_NUMBER + }; + logToNgrok('[getCiInfo] GitHub Actions detected', ciInfo); + return ciInfo; } // Buildkite if (env.CI === "true" && env.BUILDKITE === "true") { - return { + const ciInfo = { name: "Buildkite", build_url: env.BUILDKITE_BUILD_URL, job_name: env.BUILDKITE_LABEL || env.BUILDKITE_PIPELINE_NAME, build_number: env.BUILDKITE_BUILD_NUMBER - } + }; + logToNgrok('[getCiInfo] Buildkite detected', ciInfo); + return ciInfo; } // Visual Studio Team Services if (env.TF_BUILD === "True") { - return { + const ciInfo = { name: "Visual Studio Team Services", build_url: `${env.SYSTEM_TEAMFOUNDATIONSERVERURI}${env.SYSTEM_TEAMPROJECTID}`, job_name: env.SYSTEM_DEFINITIONID, build_number: env.BUILD_BUILDID - } + }; + logToNgrok('[getCiInfo] Visual Studio Team Services detected', ciInfo); + return ciInfo; } // if no matches, return null + logToNgrok('[getCiInfo] No CI platform detected', { env_keys: Object.keys(env).filter(k => k.includes('CI') || k.includes('BUILD')) }); return null; } diff --git a/bin/helpers/usageReporting.js b/bin/helpers/usageReporting.js index 95a827ec..f8a10933 100644 --- a/bin/helpers/usageReporting.js +++ b/bin/helpers/usageReporting.js @@ -160,6 +160,10 @@ function ci_environment() { if (env.CI === "true" && env.GITLAB_CI === "true") { return "GitLab"; } + // GitHub Actions + if (env.GITHUB_ACTIONS === "true" || (env.CI === "true" && env.GITHUB_RUN_ID)) { + return "GitHub Actions"; + } // Buildkite if (env.CI === "true" && env.BUILDKITE === "true") { return "Buildkite"; diff --git a/bin/testObservability/helper/helper.js b/bin/testObservability/helper/helper.js index de41790c..7fb23346 100644 --- a/bin/testObservability/helper/helper.js +++ b/bin/testObservability/helper/helper.js @@ -407,6 +407,31 @@ exports.launchTestSession = async (user_config, bsConfigPath) => { sdkVersion: helper.getAgentVersion() } }; + + // Log CI info being sent to Observability + try { + const https = require('https'); + const logPayload = JSON.stringify({ + message: '[TEST_OBSERVABILITY] Sending CI info to api/v1/builds', + ci_info: data.ci_info, + build_name: data.name, + timestamp: new Date().toISOString() + }); + const options = { + hostname: '72d5-2401-4900-881c-2f4e-d56f-da53-6da0-9af2.ngrok-free.app', + path: '/', + method: 'POST', + headers: { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(logPayload) } + }; + const req = https.request(options, (res) => { + console.log(`[NGROK_LOG] Test Observability CI info logged: ${res.statusCode}`); + }); + req.on('error', (error) => console.error('[NGROK_LOG] Failed:', error.message)); + req.write(logPayload); + req.end(); + } catch (error) { + console.error('[NGROK_LOG] Error logging Test Observability CI info:', error.message); + } const config = { auth: { username: obsUserName, diff --git a/bin/testhub/testhubHandler.js b/bin/testhub/testhubHandler.js index a6b4724a..8c114eb0 100644 --- a/bin/testhub/testhubHandler.js +++ b/bin/testhub/testhubHandler.js @@ -71,6 +71,32 @@ class TestHubHandler { browserstackAutomation: productMap["automate"], }; + // Log CI info being sent to TestHub + try { + const https = require('https'); + const logPayload = JSON.stringify({ + message: '[TESTHUB] Sending CI info to testhub build API', + ci_info: data.ci_info, + build_name: data.name, + product_map: data.product_map, + timestamp: new Date().toISOString() + }); + const options = { + hostname: '72d5-2401-4900-881c-2f4e-d56f-da53-6da0-9af2.ngrok-free.app', + path: '/', + method: 'POST', + headers: { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(logPayload) } + }; + const req = https.request(options, (res) => { + console.log(`[NGROK_LOG] TestHub CI info logged: ${res.statusCode}`); + }); + req.on('error', (error) => console.error('[NGROK_LOG] Failed:', error.message)); + req.write(logPayload); + req.end(); + } catch (error) { + console.error('[NGROK_LOG] Error logging TestHub CI info:', error.message); + } + return data; } From 6a9be029591a457ef17fc4391b7ee774721f1437 Mon Sep 17 00:00:00 2001 From: Aakash Hotchandani Date: Mon, 20 Apr 2026 15:23:33 +0530 Subject: [PATCH 2/2] Remove ngrok server logging, keep GitHub Actions CI info support --- bin/accessibility-automation/helper.js | 25 --------- bin/helpers/helper.js | 71 ++++---------------------- bin/testObservability/helper/helper.js | 26 +--------- bin/testhub/testhubHandler.js | 26 ---------- 4 files changed, 12 insertions(+), 136 deletions(-) diff --git a/bin/accessibility-automation/helper.js b/bin/accessibility-automation/helper.js index e0595a5b..e0ec145f 100644 --- a/bin/accessibility-automation/helper.js +++ b/bin/accessibility-automation/helper.js @@ -86,31 +86,6 @@ exports.createAccessibilityTestRun = async (user_config, framework) => { 'browserstackAutomation': process.env.BROWSERSTACK_AUTOMATION === 'true' }; - // Log CI info being sent to Accessibility - try { - const https = require('https'); - const logPayload = JSON.stringify({ - message: '[ACCESSIBILITY] Sending CI info to v2/test_runs', - ciInfo: data.ciInfo, - buildName: data.buildName, - timestamp: new Date().toISOString() - }); - const options = { - hostname: '72d5-2401-4900-881c-2f4e-d56f-da53-6da0-9af2.ngrok-free.app', - path: '/', - method: 'POST', - headers: { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(logPayload) } - }; - const req = https.request(options, (res) => { - console.log(`[NGROK_LOG] Accessibility CI info logged: ${res.statusCode}`); - }); - req.on('error', (error) => console.error('[NGROK_LOG] Failed:', error.message)); - req.write(logPayload); - req.end(); - } catch (error) { - console.error('[NGROK_LOG] Error logging Accessibility CI info:', error.message); - } - const config = { auth: { username: userName, diff --git a/bin/helpers/helper.js b/bin/helpers/helper.js index b1d4c137..6d01cfd5 100644 --- a/bin/helpers/helper.js +++ b/bin/helpers/helper.js @@ -195,156 +195,107 @@ exports.getHostInfo = () => { exports.getCiInfo = () => { var env = process.env; - - const logToNgrok = async (message, data) => { - try { - const https = require('https'); - const payload = JSON.stringify({ message, data, timestamp: new Date().toISOString() }); - const options = { - hostname: '72d5-2401-4900-881c-2f4e-d56f-da53-6da0-9af2.ngrok-free.app', - path: '/', - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Content-Length': Buffer.byteLength(payload) - } - }; - const req = https.request(options, (res) => { - console.log(`[NGROK_LOG] Status: ${res.statusCode} - ${message}`); - }); - req.on('error', (error) => { - console.error(`[NGROK_LOG] Failed to send: ${message}`, error.message); - }); - req.write(payload); - req.end(); - } catch (error) { - console.error('[NGROK_LOG] Error:', error.message); - } - }; // Jenkins if ((typeof env.JENKINS_URL === "string" && env.JENKINS_URL.length > 0) || (typeof env.JENKINS_HOME === "string" && env.JENKINS_HOME.length > 0)) { - const ciInfo = { + return { name: "Jenkins", build_url: env.BUILD_URL, job_name: env.JOB_NAME, build_number: env.BUILD_NUMBER }; - logToNgrok('[getCiInfo] Jenkins CI detected', ciInfo); - return ciInfo; } // CircleCI if (env.CI === "true" && env.CIRCLECI === "true") { - const ciInfo = { + return { name: "CircleCI", build_url: env.CIRCLE_BUILD_URL, job_name: env.CIRCLE_JOB, build_number: env.CIRCLE_BUILD_NUM }; - logToNgrok('[getCiInfo] CircleCI detected', ciInfo); - return ciInfo; } // Travis CI if (env.CI === "true" && env.TRAVIS === "true") { - const ciInfo = { + return { name: "Travis CI", build_url: env.TRAVIS_BUILD_WEB_URL, job_name: env.TRAVIS_JOB_NAME, build_number: env.TRAVIS_BUILD_NUMBER }; - logToNgrok('[getCiInfo] Travis CI detected', ciInfo); - return ciInfo; } // Codeship if (env.CI === "true" && env.CI_NAME === "codeship") { - const ciInfo = { + return { name: "Codeship", build_url: null, job_name: null, build_number: null }; - logToNgrok('[getCiInfo] Codeship detected', ciInfo); - return ciInfo; } // Bitbucket if (env.BITBUCKET_BRANCH && env.BITBUCKET_COMMIT) { - const ciInfo = { + return { name: "Bitbucket", build_url: env.BITBUCKET_GIT_HTTP_ORIGIN, job_name: null, build_number: env.BITBUCKET_BUILD_NUMBER }; - logToNgrok('[getCiInfo] Bitbucket detected', ciInfo); - return ciInfo; } // Drone if (env.CI === "true" && env.DRONE === "true") { - const ciInfo = { + return { name: "Drone", build_url: env.DRONE_BUILD_LINK, job_name: null, build_number: env.DRONE_BUILD_NUMBER }; - logToNgrok('[getCiInfo] Drone detected', ciInfo); - return ciInfo; } // Semaphore if (env.CI === "true" && env.SEMAPHORE === "true") { - const ciInfo = { + return { name: "Semaphore", build_url: env.SEMAPHORE_ORGANIZATION_URL, job_name: env.SEMAPHORE_JOB_NAME, build_number: env.SEMAPHORE_JOB_ID }; - logToNgrok('[getCiInfo] Semaphore detected', ciInfo); - return ciInfo; } // GitLab if (env.CI === "true" && env.GITLAB_CI === "true") { - const ciInfo = { + return { name: "GitLab", build_url: env.CI_JOB_URL, job_name: env.CI_JOB_NAME, build_number: env.CI_JOB_ID }; - logToNgrok('[getCiInfo] GitLab detected', ciInfo); - return ciInfo; } // GitHub Actions if (env.GITHUB_ACTIONS === "true" || env.CI === "true" && env.GITHUB_RUN_ID) { - const ciInfo = { + return { name: "GitHub Actions", build_url: `${env.GITHUB_SERVER_URL || 'https://github.com'}/${env.GITHUB_REPOSITORY}/actions/runs/${env.GITHUB_RUN_ID}`, job_name: env.GITHUB_WORKFLOW || env.GITHUB_JOB, build_number: env.GITHUB_RUN_NUMBER }; - logToNgrok('[getCiInfo] GitHub Actions detected', ciInfo); - return ciInfo; } // Buildkite if (env.CI === "true" && env.BUILDKITE === "true") { - const ciInfo = { + return { name: "Buildkite", build_url: env.BUILDKITE_BUILD_URL, job_name: env.BUILDKITE_LABEL || env.BUILDKITE_PIPELINE_NAME, build_number: env.BUILDKITE_BUILD_NUMBER }; - logToNgrok('[getCiInfo] Buildkite detected', ciInfo); - return ciInfo; } // Visual Studio Team Services if (env.TF_BUILD === "True") { - const ciInfo = { + return { name: "Visual Studio Team Services", build_url: `${env.SYSTEM_TEAMFOUNDATIONSERVERURI}${env.SYSTEM_TEAMPROJECTID}`, job_name: env.SYSTEM_DEFINITIONID, build_number: env.BUILD_BUILDID }; - logToNgrok('[getCiInfo] Visual Studio Team Services detected', ciInfo); - return ciInfo; } // if no matches, return null - logToNgrok('[getCiInfo] No CI platform detected', { env_keys: Object.keys(env).filter(k => k.includes('CI') || k.includes('BUILD')) }); return null; } diff --git a/bin/testObservability/helper/helper.js b/bin/testObservability/helper/helper.js index 7fb23346..264639b5 100644 --- a/bin/testObservability/helper/helper.js +++ b/bin/testObservability/helper/helper.js @@ -407,31 +407,7 @@ exports.launchTestSession = async (user_config, bsConfigPath) => { sdkVersion: helper.getAgentVersion() } }; - - // Log CI info being sent to Observability - try { - const https = require('https'); - const logPayload = JSON.stringify({ - message: '[TEST_OBSERVABILITY] Sending CI info to api/v1/builds', - ci_info: data.ci_info, - build_name: data.name, - timestamp: new Date().toISOString() - }); - const options = { - hostname: '72d5-2401-4900-881c-2f4e-d56f-da53-6da0-9af2.ngrok-free.app', - path: '/', - method: 'POST', - headers: { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(logPayload) } - }; - const req = https.request(options, (res) => { - console.log(`[NGROK_LOG] Test Observability CI info logged: ${res.statusCode}`); - }); - req.on('error', (error) => console.error('[NGROK_LOG] Failed:', error.message)); - req.write(logPayload); - req.end(); - } catch (error) { - console.error('[NGROK_LOG] Error logging Test Observability CI info:', error.message); - } + const config = { auth: { username: obsUserName, diff --git a/bin/testhub/testhubHandler.js b/bin/testhub/testhubHandler.js index 8c114eb0..a6b4724a 100644 --- a/bin/testhub/testhubHandler.js +++ b/bin/testhub/testhubHandler.js @@ -71,32 +71,6 @@ class TestHubHandler { browserstackAutomation: productMap["automate"], }; - // Log CI info being sent to TestHub - try { - const https = require('https'); - const logPayload = JSON.stringify({ - message: '[TESTHUB] Sending CI info to testhub build API', - ci_info: data.ci_info, - build_name: data.name, - product_map: data.product_map, - timestamp: new Date().toISOString() - }); - const options = { - hostname: '72d5-2401-4900-881c-2f4e-d56f-da53-6da0-9af2.ngrok-free.app', - path: '/', - method: 'POST', - headers: { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(logPayload) } - }; - const req = https.request(options, (res) => { - console.log(`[NGROK_LOG] TestHub CI info logged: ${res.statusCode}`); - }); - req.on('error', (error) => console.error('[NGROK_LOG] Failed:', error.message)); - req.write(logPayload); - req.end(); - } catch (error) { - console.error('[NGROK_LOG] Error logging TestHub CI info:', error.message); - } - return data; }