From f7a0dd1a55118ae4eb4e1eb87d72c9b4af0e4267 Mon Sep 17 00:00:00 2001 From: jiasheng Date: Tue, 8 Jul 2025 10:00:17 +0800 Subject: [PATCH] chore: add CI and container detection to telemetry --- packages/schema/src/telemetry.ts | 6 ++++++ packages/schema/src/utils/is-ci.ts | 8 ++++++++ packages/schema/src/utils/is-container.ts | 23 +++++++++++++++++++++++ 3 files changed, 37 insertions(+) create mode 100644 packages/schema/src/utils/is-ci.ts create mode 100644 packages/schema/src/utils/is-container.ts diff --git a/packages/schema/src/telemetry.ts b/packages/schema/src/telemetry.ts index e00557347..9e9a764d7 100644 --- a/packages/schema/src/telemetry.ts +++ b/packages/schema/src/telemetry.ts @@ -11,6 +11,8 @@ import isDocker from './utils/is-docker'; import { isWsl } from './utils/is-wsl'; import { getMachineId } from './utils/machine-id-utils'; import { getVersion } from './utils/version-utils'; +import { isInCi } from './utils/is-ci'; +import { isInContainer } from './utils/is-container'; /** * Telemetry events @@ -44,6 +46,8 @@ export class Telemetry { private readonly prismaVersion = getPrismaVersion(); private readonly isDocker = isDocker(); private readonly isWsl = isWsl(); + private readonly isContainer = isInContainer(); + private readonly isCi = isInCi; private exitWait = 200; constructor() { @@ -108,6 +112,8 @@ export class Telemetry { prismaVersion: this.prismaVersion, isDocker: this.isDocker, isWsl: this.isWsl, + isContainer: this.isContainer, + isCi: this.isCi, ...properties, }; this.mixpanel.track(event, payload); diff --git a/packages/schema/src/utils/is-ci.ts b/packages/schema/src/utils/is-ci.ts new file mode 100644 index 000000000..4950c331e --- /dev/null +++ b/packages/schema/src/utils/is-ci.ts @@ -0,0 +1,8 @@ +import {env} from 'node:process'; +export const isInCi = env.CI !== '0' + && env.CI !== 'false' + && ( + 'CI' in env + || 'CONTINUOUS_INTEGRATION' in env + || Object.keys(env).some(key => key.startsWith('CI_')) + ); \ No newline at end of file diff --git a/packages/schema/src/utils/is-container.ts b/packages/schema/src/utils/is-container.ts new file mode 100644 index 000000000..23c94a29e --- /dev/null +++ b/packages/schema/src/utils/is-container.ts @@ -0,0 +1,23 @@ +import fs from 'node:fs'; +import isDocker from './is-docker'; + +let cachedResult: boolean | undefined; + +// Podman detection +const hasContainerEnv = () => { + try { + fs.statSync('/run/.containerenv'); + return true; + } catch { + return false; + } +}; + +export function isInContainer() { + // TODO: Use `??=` when targeting Node.js 16. + if (cachedResult === undefined) { + cachedResult = hasContainerEnv() || isDocker(); + } + + return cachedResult; +} \ No newline at end of file