UNPKG

@netlify/build

Version:
95 lines (94 loc) 3.54 kB
import { platform } from 'process'; import got from 'got'; import osName from 'os-name'; import { addErrorInfo } from '../error/info.js'; import { roundTimerToMillisecs } from '../time/measure.js'; import { ROOT_PACKAGE_JSON } from '../utils/json.js'; const DEFAULT_TELEMETRY_TIMEOUT = 1200; const DEFAULT_TELEMETRY_CONFIG = { origin: 'https://api.segment.io/v1', writeKey: 'dWhlM1lYSlpNd1k5Uk9rcjFra2JSOEoybnRjZjl0YTI6', timeout: { request: DEFAULT_TELEMETRY_TIMEOUT }, }; // Send telemetry request when build completes export const trackBuildComplete = async function ({ deployId, buildId, status, stepsCount, pluginsOptions, durationNs, siteInfo, telemetry, userNodeVersion, framework, testOpts: { telemetryOrigin = DEFAULT_TELEMETRY_CONFIG.origin, telemetryTimeout = DEFAULT_TELEMETRY_CONFIG.timeout }, }) { if (!telemetry) { return; } try { const payload = getPayload({ deployId, buildId, status, stepsCount, pluginsOptions, durationNs, siteInfo, userNodeVersion, framework, }); await track(payload, { ...DEFAULT_TELEMETRY_CONFIG, origin: telemetryOrigin, timeout: telemetryTimeout }); } catch (error) { addErrorInfo(error, { type: 'telemetry' }); throw error; } }; // Send track HTTP request to telemetry. const track = async function (payload, { origin, writeKey, timeout }) { const url = `${origin}/track`; await got.post(url, { json: payload, timeout, retry: { limit: 0 }, headers: { Authorization: `Basic ${writeKey}` }, }); }; // Retrieve telemetry information // siteInfo can be empty if the build fails during the get config step const getPayload = function ({ deployId, buildId, status, stepsCount, pluginsOptions, durationNs, userNodeVersion, siteInfo = { id: undefined }, framework, }) { return { userId: 'buildbot_user', event: 'build:ci_build_process_completed', timestamp: Date.now(), properties: { deployId, buildId, status, steps: stepsCount, buildVersion: ROOT_PACKAGE_JSON.version, // We're passing the node version set by the buildbot/user which will run the `build.command` and // the `package.json`/locally defined plugins nodeVersion: userNodeVersion, osPlatform: OS_TYPES[platform], osName: osName(), framework, siteId: siteInfo.id, ...(pluginsOptions !== undefined && { plugins: pluginsOptions.map(getPlugin), pluginCount: pluginsOptions.length, }), ...(durationNs !== undefined && { duration: roundTimerToMillisecs(durationNs) }), }, }; }; const OS_TYPES = { linux: 'Linux', darwin: 'MacOS', win32: 'Windows', android: 'Android', sunos: 'SunOS', aix: 'AIX', freebsd: 'FreeBSD', openbsd: 'OpenBSD', }; const getPlugin = function ({ packageName, origin, loadedFrom, nodeVersion, pinnedVersion, pluginPackageJson: { version } = { version: undefined }, }) { const installType = getInstallType(origin, loadedFrom); return { name: packageName, installType, nodeVersion, pinnedVersion, version }; }; const getInstallType = function (origin, loadedFrom) { if (loadedFrom === 'auto_install') { return origin === 'ui' ? 'ui' : 'netlify_toml'; } return loadedFrom; };