From 9475ed7689508cf8bda166ac8d7ccda544e76e2f Mon Sep 17 00:00:00 2001 From: Sebastian Rindom Date: Thu, 5 Aug 2021 13:17:17 +0200 Subject: [PATCH] fix: ci detection --- packages/medusa-telemetry/src/postinstall.js | 4 +- packages/medusa-telemetry/src/telemeter.js | 11 ++- packages/medusa-telemetry/src/util/is-ci.js | 89 ++++++++++++++++++++ 3 files changed, 100 insertions(+), 4 deletions(-) create mode 100644 packages/medusa-telemetry/src/util/is-ci.js diff --git a/packages/medusa-telemetry/src/postinstall.js b/packages/medusa-telemetry/src/postinstall.js index 80da17f2ef..44650fd628 100644 --- a/packages/medusa-telemetry/src/postinstall.js +++ b/packages/medusa-telemetry/src/postinstall.js @@ -1,3 +1,5 @@ +const { isCI } = require("./util/is-cli") + try { const showAnalyticsNotification = require(`./util/show-notification`) const Store = require(`./store`) @@ -5,7 +7,7 @@ try { const eventStorage = new Store() const disabled = eventStorage.disabled_ const enabledInConfig = eventStorage.getConfig(`telemetry.enabled`) - if (enabledInConfig === undefined && !disabled) { + if (enabledInConfig === undefined && !disabled && !isCI()) { showAnalyticsNotification() } } catch (e) { diff --git a/packages/medusa-telemetry/src/telemeter.js b/packages/medusa-telemetry/src/telemeter.js index 9c85e6351e..ad01fed4e8 100644 --- a/packages/medusa-telemetry/src/telemeter.js +++ b/packages/medusa-telemetry/src/telemeter.js @@ -5,9 +5,10 @@ import isDocker from "is-docker" import { v4 as uuidv4 } from "uuid" import createFlush from "./util/create-flush" -import showAnalyticsNotification from "./util/show-notification" -import isTruthy from "./util/is-truthy" import getTermProgram from "./util/get-term-program" +import isTruthy from "./util/is-truthy" +import showAnalyticsNotification from "./util/show-notification" +import { isCI, getCIName } from "./util/is-cli" import Store from "./store" const MEDUSA_TELEMETRY_VERBOSE = process.env.MEDUSA_TELEMETRY_VERBOSE || false @@ -45,7 +46,9 @@ class Telemeter { } let enabled = this.store_.getConfig(`telemetry.enabled`) if (enabled === undefined || enabled === null) { - showAnalyticsNotification() + if (!isCI()) { + showAnalyticsNotification() + } enabled = true this.store_.setConfig(`telemetry.enabled`, enabled) } @@ -63,6 +66,8 @@ class Telemeter { platform: os.platform(), release: os.release(), cpus: (cpus && cpus.length > 0 && cpus[0].model) || undefined, + is_ci: isCI(), + ci_name: getCIName(), arch: os.arch(), docker: isDocker(), term_program: getTermProgram(), diff --git a/packages/medusa-telemetry/src/util/is-ci.js b/packages/medusa-telemetry/src/util/is-ci.js new file mode 100644 index 0000000000..389c9e41c8 --- /dev/null +++ b/packages/medusa-telemetry/src/util/is-ci.js @@ -0,0 +1,89 @@ +import ci from "ci-info" + +const CI_DEFINITIONS = [ + getEnvDetect({ key: `NOW_BUILDER_ANNOTATE`, name: `ZEIT Now` }), + getEnvDetect({ key: `NOW_REGION`, name: `ZEIT Now v1` }), + getEnvDetect({ key: `VERCEL_URL`, name: `Vercel Now` }), + getEnvDetect({ key: `NOW_BUILDER`, name: `Vercel Now` }), + getEnvDetect({ key: `VERCEL_BUILDER`, name: `Vercel Now` }), + getEnvDetect({ key: `CODESANDBOX_SSE`, name: `CodeSandbox` }), + getEnvDetect({ key: `GITHUB_ACTIONS`, name: `GitHub Actions` }), + getEnvDetect({ key: `CIRCLE_BRANCH`, name: `CircleCI` }), + getEnvDetect({ key: `CIRCLECI`, name: `CircleCI` }), + envFromCIAndCIName, + herokuDetect, + getEnvFromCIInfo, + envFromCIWithNoName, +] + +function lookupCI() { + for (const fn of CI_DEFINITIONS) { + try { + const res = fn() + if (res) { + return res + } + } catch (e) { + // ignore + } + } + return null +} +const CIName = lookupCI() + +/** + * Determines whether the environment where the code is running is in CI + * @return true if the environment is in CI, false otherwise + */ + +export function isCI() { + return !!CIName +} + +/** + * Gets the name of the CI environment (e.g. "Vercel", "Heroku", etc.) + * @return The name of the CI if available. Defaults to null if not in CI + */ + +export function getCIName() { + if (!isCI()) { + return null + } + return CIName +} + +function getEnvFromCIInfo() { + if (ci.isCI) return ci.name || `ci-info detected w/o name` + return null +} + +function getEnvDetect({ key, name }) { + return function() { + if (process.env[key]) { + return name + } + return null + } +} + +function herokuDetect() { + return ( + typeof process.env.NODE === `string` && + /\.heroku\/node\/bin\/node/.test(process.env.NODE) && + `Heroku` + ) +} + +function envFromCIAndCIName() { + if (process.env.CI_NAME && process.env.CI) { + return process.env.CI_NAME + } + return null +} + +function envFromCIWithNoName() { + if (process.env.CI) { + return `CI detected without name` + } + return null +}