From 6f125d3b64fda61868aca3a9227d24794bc946b0 Mon Sep 17 00:00:00 2001 From: Ryan Kienstra Date: Sun, 5 Dec 2021 20:12:54 -0600 Subject: [PATCH 01/14] Bump husky version to latest --- package-lock.json | 17 ++++++++++------- package.json | 2 +- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index b4a9bc34..5455ea3a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33,7 +33,7 @@ "eslint-config-prettier": "^8.3.0", "eslint-plugin-prettier": "^3.4.0", "glob": "^7.1.7", - "husky": "^7.0.1", + "husky": "^7.0.4", "js-yaml": "^4.1.0", "mocha": "^9.1.3", "node-run-cmd": "^1.0.1", @@ -2487,15 +2487,18 @@ } }, "node_modules/husky": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/husky/-/husky-7.0.1.tgz", - "integrity": "sha512-gceRaITVZ+cJH9sNHqx5tFwbzlLCVxtVZcusME8JYQ8Edy5mpGDOqD8QBCdMhpyo9a+JXddnujQ4rpY2Ff9SJA==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/husky/-/husky-7.0.4.tgz", + "integrity": "sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ==", "dev": true, "bin": { "husky": "lib/bin.js" }, "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" } }, "node_modules/ieee754": { @@ -7244,9 +7247,9 @@ "dev": true }, "husky": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/husky/-/husky-7.0.1.tgz", - "integrity": "sha512-gceRaITVZ+cJH9sNHqx5tFwbzlLCVxtVZcusME8JYQ8Edy5mpGDOqD8QBCdMhpyo9a+JXddnujQ4rpY2Ff9SJA==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/husky/-/husky-7.0.4.tgz", + "integrity": "sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ==", "dev": true }, "ieee754": { diff --git a/package.json b/package.json index 30580136..687d90c7 100644 --- a/package.json +++ b/package.json @@ -277,7 +277,7 @@ "eslint-config-prettier": "^8.3.0", "eslint-plugin-prettier": "^3.4.0", "glob": "^7.1.7", - "husky": "^7.0.1", + "husky": "^7.0.4", "js-yaml": "^4.1.0", "mocha": "^9.1.3", "node-run-cmd": "^1.0.1", From eb2b4bd35c5d8f3a78aed154d6db668f9889e2c0 Mon Sep 17 00:00:00 2001 From: Ryan Kienstra Date: Mon, 6 Dec 2021 14:22:54 -0600 Subject: [PATCH 02/14] Prevent a Bash error if there is no attach_workspace.at There should also be a warning that something wrong, as it's not attaching the workspace. --- src/utils/getAttachWorkspaceCommand.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/getAttachWorkspaceCommand.ts b/src/utils/getAttachWorkspaceCommand.ts index 8500c844..5ec1d7bc 100644 --- a/src/utils/getAttachWorkspaceCommand.ts +++ b/src/utils/getAttachWorkspaceCommand.ts @@ -9,5 +9,5 @@ export default function getAttachWorkspaceCommand(step: Step): string { const attachFrom = path.join(CONTAINER_STORAGE_DIRECTORY, '*'); // BusyBox doesn't have the -n option. - return `cp -rn ${attachFrom} ${step?.attach_workspace?.at} || cp -ru ${attachFrom} ${step?.attach_workspace?.at}`; + return `if [ -d ${attachFrom} ]; then cp -rn ${attachFrom} ${step?.attach_workspace?.at} || cp -ru ${attachFrom} ${step?.attach_workspace?.at}; fi`; } From bf06f5f84b45e30d842107f645198f1dd5b93464 Mon Sep 17 00:00:00 2001 From: Ryan Kienstra Date: Mon, 6 Dec 2021 14:52:36 -0600 Subject: [PATCH 03/14] Prevent an error if a directory doesn't exist Before, there was an error for /tmp/local-ci/ not existing. --- src/utils/getAttachWorkspaceCommand.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/getAttachWorkspaceCommand.ts b/src/utils/getAttachWorkspaceCommand.ts index 5ec1d7bc..3921c198 100644 --- a/src/utils/getAttachWorkspaceCommand.ts +++ b/src/utils/getAttachWorkspaceCommand.ts @@ -9,5 +9,5 @@ export default function getAttachWorkspaceCommand(step: Step): string { const attachFrom = path.join(CONTAINER_STORAGE_DIRECTORY, '*'); // BusyBox doesn't have the -n option. - return `if [ -d ${attachFrom} ]; then cp -rn ${attachFrom} ${step?.attach_workspace?.at} || cp -ru ${attachFrom} ${step?.attach_workspace?.at}; fi`; + return `if [ -d ${CONTAINER_STORAGE_DIRECTORY} ]; then cp -rn ${attachFrom} ${step?.attach_workspace?.at} || cp -ru ${attachFrom} ${step?.attach_workspace?.at}; fi`; } From 680a13f829c30c6f72da7e85e2a95f4fc115f0f0 Mon Sep 17 00:00:00 2001 From: Ryan Kienstra Date: Mon, 6 Dec 2021 15:10:21 -0600 Subject: [PATCH 04/14] Check that the directory exists and that it's not empty before copying It looks like both checks are needed, though I might be missing a simpler solution. --- src/test/suite/utils/getAttachWorkspaceCommand.test.ts | 2 +- src/utils/getAttachWorkspaceCommand.ts | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/test/suite/utils/getAttachWorkspaceCommand.test.ts b/src/test/suite/utils/getAttachWorkspaceCommand.test.ts index b8981a1f..ffef55d2 100644 --- a/src/test/suite/utils/getAttachWorkspaceCommand.test.ts +++ b/src/test/suite/utils/getAttachWorkspaceCommand.test.ts @@ -9,7 +9,7 @@ suite('getAttachWorkspaceCommand', () => { test('With attach_workspace', () => { assert.strictEqual( getAttachWorkspaceCommand({ attach_workspace: { at: '/foo/baz' } }), // eslint-disable-line @typescript-eslint/naming-convention - 'cp -rn /tmp/local-ci/* /foo/baz || cp -ru /tmp/local-ci/* /foo/baz' + 'if [ -d ! /tmp/local-ci && -z "$(ls -A /tmp/local-ci)" ]; then cp -rn /tmp/local-ci/* /foo/baz || cp -ru /tmp/local-ci/* /foo/baz; fi' ); }); }); diff --git a/src/utils/getAttachWorkspaceCommand.ts b/src/utils/getAttachWorkspaceCommand.ts index 3921c198..661c1090 100644 --- a/src/utils/getAttachWorkspaceCommand.ts +++ b/src/utils/getAttachWorkspaceCommand.ts @@ -9,5 +9,6 @@ export default function getAttachWorkspaceCommand(step: Step): string { const attachFrom = path.join(CONTAINER_STORAGE_DIRECTORY, '*'); // BusyBox doesn't have the -n option. - return `if [ -d ${CONTAINER_STORAGE_DIRECTORY} ]; then cp -rn ${attachFrom} ${step?.attach_workspace?.at} || cp -ru ${attachFrom} ${step?.attach_workspace?.at}; fi`; + // Check if the directory is empty before + return `if [[ -d ${CONTAINER_STORAGE_DIRECTORY} && ! -z "$(ls -A ${CONTAINER_STORAGE_DIRECTORY})" ]]; then cp -rn ${attachFrom} ${step?.attach_workspace?.at} || cp -ru ${attachFrom} ${step?.attach_workspace?.at}; fi`; } From 568af27cafbea0561738ca9cb997f2d2ca0c6acc Mon Sep 17 00:00:00 2001 From: Ryan Kienstra Date: Mon, 6 Dec 2021 15:25:37 -0600 Subject: [PATCH 05/14] Another approch to the Bash conditional --- src/test/suite/utils/getAttachWorkspaceCommand.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/suite/utils/getAttachWorkspaceCommand.test.ts b/src/test/suite/utils/getAttachWorkspaceCommand.test.ts index ffef55d2..00f26f60 100644 --- a/src/test/suite/utils/getAttachWorkspaceCommand.test.ts +++ b/src/test/suite/utils/getAttachWorkspaceCommand.test.ts @@ -9,7 +9,7 @@ suite('getAttachWorkspaceCommand', () => { test('With attach_workspace', () => { assert.strictEqual( getAttachWorkspaceCommand({ attach_workspace: { at: '/foo/baz' } }), // eslint-disable-line @typescript-eslint/naming-convention - 'if [ -d ! /tmp/local-ci && -z "$(ls -A /tmp/local-ci)" ]; then cp -rn /tmp/local-ci/* /foo/baz || cp -ru /tmp/local-ci/* /foo/baz; fi' + 'if [ -d ! /tmp/local-ci ] && [ -z "$(ls -A /tmp/local-ci)" ]; then cp -rn /tmp/local-ci/* /foo/baz || cp -ru /tmp/local-ci/* /foo/baz; fi' ); }); }); From 375547ca81c3b8064a5d504733a691939016dc06 Mon Sep 17 00:00:00 2001 From: Ryan Kienstra Date: Mon, 6 Dec 2021 15:48:24 -0600 Subject: [PATCH 06/14] Use 2 bracketed conditionals instead of 1 I'm still not sure of the correct way. --- package-lock.json | 4 ++-- src/test/suite/utils/getAttachWorkspaceCommand.test.ts | 2 +- src/utils/getAttachWorkspaceCommand.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index a3ee1e51..ee926026 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "local-ci", - "version": "1.0.2", + "version": "1.1.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "local-ci", - "version": "1.0.2", + "version": "1.1.0", "hasInstallScript": true, "license": "GPL-2.0-or-later", "os": [ diff --git a/src/test/suite/utils/getAttachWorkspaceCommand.test.ts b/src/test/suite/utils/getAttachWorkspaceCommand.test.ts index 00f26f60..770b6a76 100644 --- a/src/test/suite/utils/getAttachWorkspaceCommand.test.ts +++ b/src/test/suite/utils/getAttachWorkspaceCommand.test.ts @@ -9,7 +9,7 @@ suite('getAttachWorkspaceCommand', () => { test('With attach_workspace', () => { assert.strictEqual( getAttachWorkspaceCommand({ attach_workspace: { at: '/foo/baz' } }), // eslint-disable-line @typescript-eslint/naming-convention - 'if [ -d ! /tmp/local-ci ] && [ -z "$(ls -A /tmp/local-ci)" ]; then cp -rn /tmp/local-ci/* /foo/baz || cp -ru /tmp/local-ci/* /foo/baz; fi' + 'if [ -d /tmp/local-ci ] && [ ! -z "$(ls -A /tmp/local-ci)" ]; then cp -rn /tmp/local-ci/* /foo/baz || cp -ru /tmp/local-ci/* /foo/baz; fi' ); }); }); diff --git a/src/utils/getAttachWorkspaceCommand.ts b/src/utils/getAttachWorkspaceCommand.ts index 661c1090..1882e016 100644 --- a/src/utils/getAttachWorkspaceCommand.ts +++ b/src/utils/getAttachWorkspaceCommand.ts @@ -10,5 +10,5 @@ export default function getAttachWorkspaceCommand(step: Step): string { // BusyBox doesn't have the -n option. // Check if the directory is empty before - return `if [[ -d ${CONTAINER_STORAGE_DIRECTORY} && ! -z "$(ls -A ${CONTAINER_STORAGE_DIRECTORY})" ]]; then cp -rn ${attachFrom} ${step?.attach_workspace?.at} || cp -ru ${attachFrom} ${step?.attach_workspace?.at}; fi`; + return `if [ -d ${CONTAINER_STORAGE_DIRECTORY} ] && [ ! -z "$(ls -A ${CONTAINER_STORAGE_DIRECTORY})" ]; then cp -rn ${attachFrom} ${step?.attach_workspace?.at} || cp -ru ${attachFrom} ${step?.attach_workspace?.at}; fi`; } From 68b2fc18648da4789510f3b863add22e48bd7b8b Mon Sep 17 00:00:00 2001 From: Ryan Kienstra Date: Mon, 6 Dec 2021 15:55:36 -0600 Subject: [PATCH 07/14] Remove double negative, simply have the string in the conditional --- src/test/suite/utils/getAttachWorkspaceCommand.test.ts | 2 +- src/utils/getAttachWorkspaceCommand.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/suite/utils/getAttachWorkspaceCommand.test.ts b/src/test/suite/utils/getAttachWorkspaceCommand.test.ts index 770b6a76..2e95f1c4 100644 --- a/src/test/suite/utils/getAttachWorkspaceCommand.test.ts +++ b/src/test/suite/utils/getAttachWorkspaceCommand.test.ts @@ -9,7 +9,7 @@ suite('getAttachWorkspaceCommand', () => { test('With attach_workspace', () => { assert.strictEqual( getAttachWorkspaceCommand({ attach_workspace: { at: '/foo/baz' } }), // eslint-disable-line @typescript-eslint/naming-convention - 'if [ -d /tmp/local-ci ] && [ ! -z "$(ls -A /tmp/local-ci)" ]; then cp -rn /tmp/local-ci/* /foo/baz || cp -ru /tmp/local-ci/* /foo/baz; fi' + 'if [ -d /tmp/local-ci ] && [ "$(ls -A /tmp/local-ci)" ]; then cp -rn /tmp/local-ci/* /foo/baz || cp -ru /tmp/local-ci/* /foo/baz; fi' ); }); }); diff --git a/src/utils/getAttachWorkspaceCommand.ts b/src/utils/getAttachWorkspaceCommand.ts index 1882e016..c4987f72 100644 --- a/src/utils/getAttachWorkspaceCommand.ts +++ b/src/utils/getAttachWorkspaceCommand.ts @@ -9,6 +9,6 @@ export default function getAttachWorkspaceCommand(step: Step): string { const attachFrom = path.join(CONTAINER_STORAGE_DIRECTORY, '*'); // BusyBox doesn't have the -n option. - // Check if the directory is empty before - return `if [ -d ${CONTAINER_STORAGE_DIRECTORY} ] && [ ! -z "$(ls -A ${CONTAINER_STORAGE_DIRECTORY})" ]; then cp -rn ${attachFrom} ${step?.attach_workspace?.at} || cp -ru ${attachFrom} ${step?.attach_workspace?.at}; fi`; + // Check if the directory is empty before copying it. + return `if [ -d ${CONTAINER_STORAGE_DIRECTORY} ] && [ "$(ls -A ${CONTAINER_STORAGE_DIRECTORY})" ]; then cp -rn ${attachFrom} ${step?.attach_workspace?.at} || cp -ru ${attachFrom} ${step?.attach_workspace?.at}; fi`; } From fc85db5840cf9c50fae6134f7829efe7f6127097 Mon Sep 17 00:00:00 2001 From: Ryan Kienstra Date: Mon, 6 Dec 2021 23:31:55 -0600 Subject: [PATCH 08/14] Add more telemetry events The analytics show that almost nobody is using the extension, so it's important to find out why. --- README.md | 6 +++--- package.json | 4 ++-- src/classes/JobProvider.ts | 18 +++++++++++++++++- src/constants/index.ts | 3 ++- src/extension.ts | 29 ++++++++++++++++++++--------- src/utils/runJob.ts | 4 +--- 6 files changed, 45 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index bd5fb2d2..146a0502 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -[![2 day free preview](https://img.shields.io/badge/trial-2%20day-orange)](https://getlocalci.com/pricing) -[![Buy license key](https://img.shields.io/badge/%24-paid-orange)](https://getlocalci.com/pricing) +[![2 day free preview](https://img.shields.io/badge/trial-2%20day-orange)](https://getlocalci.com/pricing/?utm_medium=extension&utm_source=readme) +[![Buy license key](https://img.shields.io/badge/%24-paid-orange)](https://getlocalci.com/pricing/?utm_medium=extension&utm_source=readme) [![Platform: macOS](https://img.shields.io/badge/platform-macOS-yellow)](https://en.wikipedia.org/wiki/MacOS) [![Requires CircleCI®](https://img.shields.io/badge/requires-CirlcleCI%C2%AE-yellow)](https://circleci.com) @@ -37,7 +37,7 @@ CircleCI® is a registered trademark of Circle Internet Services, Inc. ## License -Local CI requires a [license](https://getlocalci.com/pricing/) for $70 per month. +Local CI requires a [license](https://getlocalci.com/pricing/?utm_medium=extension&utm_source=readme) for $70 per month. But first you'll get a free 2-day preview, no sign-up or credit card needed. diff --git a/package.json b/package.json index 40d5cdc4..cda09eaf 100644 --- a/package.json +++ b/package.json @@ -223,12 +223,12 @@ "badges": [ { "url": "https://img.shields.io/badge/trial-2%20day-orange", - "href": "https://getlocalci.com/pricing", + "href": "https://getlocalci.com/pricing/?utm_medium=extension&utm_source=badge", "description": "2 day free preview" }, { "url": "https://img.shields.io/badge/%24-paid-orange", - "href": "https://getlocalci.com/pricing", + "href": "https://getlocalci.com/pricing/?utm_medium=extension&utm_source=badge", "description": "Buy license key" }, { diff --git a/src/classes/JobProvider.ts b/src/classes/JobProvider.ts index 6105c101..e3444854 100644 --- a/src/classes/JobProvider.ts +++ b/src/classes/JobProvider.ts @@ -1,5 +1,6 @@ import * as fs from 'fs'; import * as vscode from 'vscode'; +import TelemetryReporter from 'vscode-extension-telemetry'; import Command from './Command'; import Job from './Job'; import Warning from './Warning'; @@ -32,7 +33,10 @@ export default class JobProvider private runningJob: string | undefined; private suppressMessage: boolean | undefined; - constructor(private readonly context: vscode.ExtensionContext) {} + constructor( + private readonly context: vscode.ExtensionContext, + private readonly reporter: TelemetryReporter + ) {} refresh(job?: Job, suppressMessage?: boolean): void { this.suppressMessage = suppressMessage; @@ -46,6 +50,8 @@ export default class JobProvider async getChildren(): Promise { const configFilePath = await getConfigFilePath(this.context); if (!configFilePath || !fs.existsSync(configFilePath)) { + this.reporter.sendTelemetryErrorEvent('configFilePath'); + return [ new Warning('Error: No jobs found'), (await getAllConfigFilePaths(this.context)).length @@ -70,6 +76,8 @@ export default class JobProvider }` ); } + + this.reporter.sendTelemetryErrorEvent('writeProcessFile'); } const shouldEnableExtension = @@ -91,6 +99,14 @@ export default class JobProvider this.runningJob = undefined; } + if (!dockerRunning) { + this.reporter.sendTelemetryErrorEvent('dockerRunning'); + } + + if (!this.jobs.length) { + this.reporter.sendTelemetryErrorEvent('noJobsFound'); + } + return shouldEnableExtension ? dockerRunning ? this.jobs diff --git a/src/constants/index.ts b/src/constants/index.ts index 0c451cb5..be2012ec 100644 --- a/src/constants/index.ts +++ b/src/constants/index.ts @@ -34,7 +34,8 @@ export const GET_PICARD_CONTAINER_FUNCTION = `get_picard_container() { fi done }`; -export const GET_LICENSE_KEY_URL = 'https://getlocalci.com/pricing'; +export const GET_LICENSE_KEY_URL = + 'https://getlocalci.com/pricing/?utm_medium=extension&utm_source=ui'; export const HELP_URL = 'https://github.com/getlocalci/local-ci/discussions'; export const JOB_TREE_VIEW_ID = 'localCiJobs'; export const LICENSE_ITEM_ID = 43; diff --git a/src/extension.ts b/src/extension.ts index 4a6ea866..4861f624 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -34,18 +34,18 @@ import runJob from './utils/runJob'; import showLicenseInput from './utils/showLicenseInput'; import writeProcessFile from './utils/writeProcessFile'; +const reporter = new TelemetryReporter( + EXTENSION_ID, + EXTENSION_VERSION, + TELEMETRY_KEY +); + export function activate(context: vscode.ExtensionContext): void { if (!context.globalState.get(TRIAL_STARTED_TIMESTAMP)) { context.globalState.update(TRIAL_STARTED_TIMESTAMP, new Date().getTime()); } - const jobProvider = new JobProvider(context); - const reporter = new TelemetryReporter( - EXTENSION_ID, - EXTENSION_VERSION, - TELEMETRY_KEY - ); + const jobProvider = new JobProvider(context, reporter); reporter.sendTelemetryEvent('activate'); - const reportRunJob = () => reporter.sendTelemetryEvent('runJob'); vscode.window.registerTreeDataProvider(JOB_TREE_VIEW_ID, jobProvider); context.subscriptions.push( @@ -57,6 +57,7 @@ export function activate(context: vscode.ExtensionContext): void { vscode.env.openExternal(vscode.Uri.parse(HELP_URL)) ), vscode.commands.registerCommand(`${JOB_TREE_VIEW_ID}.exitAllJobs`, () => { + reporter.sendTelemetryEvent('exitAllJobs'); jobProvider.refresh(); const confirmText = 'Yes'; @@ -83,6 +84,7 @@ export function activate(context: vscode.ExtensionContext): void { vscode.commands.registerCommand( `${JOB_TREE_VIEW_ID}.selectRepo`, async () => { + reporter.sendTelemetryEvent('selectRepo'); const quickPick = vscode.window.createQuickPick(); const configFilePaths = await getAllConfigFilePaths(context); quickPick.title = 'Repo to run CI on'; @@ -143,7 +145,8 @@ export function activate(context: vscode.ExtensionContext): void { jobProvider.refresh(job); } - runJob(context, jobName, reportRunJob); + reporter.sendTelemetryEvent('runJob'); + runJob(context, jobName); } ), vscode.commands.registerCommand(EXIT_JOB_COMMAND, (job: Job) => { @@ -157,11 +160,14 @@ export function activate(context: vscode.ExtensionContext): void { jobProvider.refresh(job); const jobName = job.getJobName(); disposeTerminalsForJob(jobName); - runJob(context, jobName, reportRunJob); + + reporter.sendTelemetryEvent('rerunJob'); + runJob(context, jobName); }), vscode.commands.registerCommand( 'local-ci.debug.repo', (clickedFile: vscode.Uri) => { + reporter.sendTelemetryEvent('clickDebugRepo'); if (clickedFile.fsPath) { context.globalState .update(SELECTED_CONFIG_PATH, clickedFile.fsPath) @@ -175,6 +181,7 @@ export function activate(context: vscode.ExtensionContext): void { } ), vscode.commands.registerCommand('local-ci.runWalkthroughJob', async () => { + reporter.sendTelemetryEvent('runWalkthroughJob'); const configFilePath = await getConfigFilePath(context); let processedConfig; try { @@ -271,3 +278,7 @@ export function activate(context: vscode.ExtensionContext): void { }, }); } + +export function deactivate(): void { + reporter.sendTelemetryEvent('deactivate'); +} diff --git a/src/utils/runJob.ts b/src/utils/runJob.ts index b5b9b71b..f3597c91 100644 --- a/src/utils/runJob.ts +++ b/src/utils/runJob.ts @@ -26,8 +26,7 @@ import uncommittedWarning from './uncommittedWarning'; export default async function runJob( context: vscode.ExtensionContext, - jobName: string, - reportRunJob: () => void + jobName: string ): Promise { const configFilePath = await getConfigFilePath(context); const repoPath = path.dirname(path.dirname(configFilePath)); @@ -42,7 +41,6 @@ export default async function runJob( cwd: repoPath, }); terminal.show(); - reportRunJob(); const processFilePath = getProcessFilePath(configFilePath); const parsedProcessFile = getConfigFromPath(processFilePath); From b67448009d5e7416f2d902e1471abff6cafdea85 Mon Sep 17 00:00:00 2001 From: Ryan Kienstra Date: Mon, 6 Dec 2021 23:41:27 -0600 Subject: [PATCH 09/14] Add a link in the README.md for the telemetry events --- README.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/README.md b/README.md index 146a0502..3d26217b 100644 --- a/README.md +++ b/README.md @@ -59,11 +59,7 @@ You can opt out of telemetry by adding this to your VS Code `settings.json`: `"telemetry.enableTelemetry": false` -If you haven't opted out, this will send the following events via [VS Code telemetry](https://code.visualstudio.com/docs/getstarted/telemetry): - -* This extension is activated -* There are no jobs found, like if there's no `.circleci/config.yml` file -* A CircleCI® job is run (but it sends no data about the job, not even the name) +If you haven't opted out, here are the [telemetry events](https://github.com/getlocalci/local-ci/search?q=reporter.send) sent via [VS Code telemetry](https://code.visualstudio.com/docs/getstarted/telemetry). If you haven't entered a license key, like during the free preview, this extension has no interaction with Local CI's site. From fa21ed10a471572052a242111b75aba86fa59ad5 Mon Sep 17 00:00:00 2001 From: Ryan Kienstra Date: Tue, 7 Dec 2021 00:22:18 -0600 Subject: [PATCH 10/14] Add a button on first activation to go to the walkthrough Ideally, this will help users get value out of Local CI. --- package-lock.json | 4 ++-- src/extension.ts | 21 ++++++++++++++++++++- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index a3ee1e51..ee926026 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "local-ci", - "version": "1.0.2", + "version": "1.1.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "local-ci", - "version": "1.0.2", + "version": "1.1.0", "hasInstallScript": true, "license": "GPL-2.0-or-later", "os": [ diff --git a/src/extension.ts b/src/extension.ts index 4861f624..7677b3fb 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -43,7 +43,26 @@ const reporter = new TelemetryReporter( export function activate(context: vscode.ExtensionContext): void { if (!context.globalState.get(TRIAL_STARTED_TIMESTAMP)) { context.globalState.update(TRIAL_STARTED_TIMESTAMP, new Date().getTime()); + reporter.sendTelemetryEvent('firstActivation'); + + const getStartedText = 'Get started debugging faster'; + vscode.window + .showInformationMessage( + 'Thanks for installing Local CI!', + { detail: 'Getting started with Local CI' }, + getStartedText + ) + .then((clicked) => { + if (clicked === getStartedText) { + vscode.commands.executeCommand( + 'workbench.action.openWalkthrough', + 'LocalCI.local-ci#welcomeLocalCi' + ); + reporter.sendTelemetryEvent('click.getStarted'); + } + }); } + const jobProvider = new JobProvider(context, reporter); reporter.sendTelemetryEvent('activate'); @@ -167,7 +186,7 @@ export function activate(context: vscode.ExtensionContext): void { vscode.commands.registerCommand( 'local-ci.debug.repo', (clickedFile: vscode.Uri) => { - reporter.sendTelemetryEvent('clickDebugRepo'); + reporter.sendTelemetryEvent('click.debugRepo'); if (clickedFile.fsPath) { context.globalState .update(SELECTED_CONFIG_PATH, clickedFile.fsPath) From 1b702017a9b4f1f989e277b4de81d6e59167c219 Mon Sep 17 00:00:00 2001 From: Ryan Kienstra Date: Tue, 7 Dec 2021 00:34:20 -0600 Subject: [PATCH 11/14] Add a telemetry event for a process error --- src/classes/JobProvider.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/classes/JobProvider.ts b/src/classes/JobProvider.ts index e3444854..d936ecf5 100644 --- a/src/classes/JobProvider.ts +++ b/src/classes/JobProvider.ts @@ -99,8 +99,12 @@ export default class JobProvider this.runningJob = undefined; } + if (processError) { + this.reporter.sendTelemetryErrorEvent('processError'); + } + if (!dockerRunning) { - this.reporter.sendTelemetryErrorEvent('dockerRunning'); + this.reporter.sendTelemetryErrorEvent('dockerNotRunning'); } if (!this.jobs.length) { From da1008609c6023c74ee4e2ffa6bf0d6ade7f2334 Mon Sep 17 00:00:00 2001 From: Ryan Kienstra Date: Tue, 7 Dec 2021 00:59:30 -0600 Subject: [PATCH 12/14] Change the recommmended way to opt-out of telemetry --- README.md | 4 ++-- src/classes/JobProvider.ts | 7 ++++++- src/test/suite/utils/getJobs.test.ts | 19 +++++++++++++++++-- src/utils/getJobs.ts | 8 ++------ 4 files changed, 27 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 3d26217b..246981a2 100644 --- a/README.md +++ b/README.md @@ -55,9 +55,9 @@ If there's more than one `.circleci/config.yml` file, click the gear icon to sel ## Privacy -You can opt out of telemetry by adding this to your VS Code `settings.json`: +You can opt out of all telemetry by adding this to your VS Code `settings.json`: -`"telemetry.enableTelemetry": false` +`"telemetry.telemetryLevel": "off"` If you haven't opted out, here are the [telemetry events](https://github.com/getlocalci/local-ci/search?q=reporter.send) sent via [VS Code telemetry](https://code.visualstudio.com/docs/getstarted/telemetry). diff --git a/src/classes/JobProvider.ts b/src/classes/JobProvider.ts index d936ecf5..cc39803f 100644 --- a/src/classes/JobProvider.ts +++ b/src/classes/JobProvider.ts @@ -95,7 +95,12 @@ export default class JobProvider new vscode.TreeItem(processError), new Command('Try Again', `${JOB_TREE_VIEW_ID}.refresh`), ] - : await getJobs(this.context, processedConfig, this.runningJob); + : await getJobs( + this.context, + processedConfig, + this.reporter, + this.runningJob + ); this.runningJob = undefined; } diff --git a/src/test/suite/utils/getJobs.test.ts b/src/test/suite/utils/getJobs.test.ts index f4325c52..6b52a4e2 100644 --- a/src/test/suite/utils/getJobs.test.ts +++ b/src/test/suite/utils/getJobs.test.ts @@ -6,6 +6,7 @@ import * as vscode from 'vscode'; import * as yaml from 'js-yaml'; import { Substitute } from '@fluffy-spoon/substitute'; import getJobs from '../../../utils/getJobs'; +import TelemetryReporter from 'vscode-extension-telemetry'; mocha.afterEach(() => { sinon.restore(); @@ -35,7 +36,14 @@ suite('getJobs', () => { }); assert.strictEqual( - (await getJobs(getMockContext(), 'example-path')).length, + ( + await getJobs( + getMockContext(), + 'example-path', + Substitute.for(), + 'build' + ) + ).length, 1 ); }); @@ -61,7 +69,14 @@ suite('getJobs', () => { }); assert.strictEqual( - (await getJobs(getMockContext(), 'example-path')).length, + ( + await getJobs( + getMockContext(), + 'example-path', + Substitute.for(), + 'build' + ) + ).length, 3 ); }); diff --git a/src/utils/getJobs.ts b/src/utils/getJobs.ts index 80db0658..2b1df7d3 100644 --- a/src/utils/getJobs.ts +++ b/src/utils/getJobs.ts @@ -6,11 +6,11 @@ import Command from '../classes/Command'; import getAllConfigFilePaths from './getAllConfigFilePaths'; import getConfig from './getConfig'; import isWindows from './isWindows'; -import { EXTENSION_ID, EXTENSION_VERSION, TELEMETRY_KEY } from '../constants'; export default async function getJobs( context: vscode.ExtensionContext, processedConfig: string, + reporter: TelemetryReporter, runningJob?: string ): Promise { if (isWindows()) { @@ -41,11 +41,7 @@ export default async function getJobs( : []; if (!jobs.length) { - new TelemetryReporter( - EXTENSION_ID, - EXTENSION_VERSION, - TELEMETRY_KEY - ).sendTelemetryEvent('noJobs'); + reporter.sendTelemetryEvent('noJobs'); } return jobs.length From ac5f075fcbe27ad106f7a2b5baf5db6d1a3f6fb3 Mon Sep 17 00:00:00 2001 From: Ryan Kienstra Date: Tue, 7 Dec 2021 01:07:44 -0600 Subject: [PATCH 13/14] Remove the publish step, as the VSCE_PAT seems to not work --- .circleci/config.yml | 19 ------------------- CHANGELOG.md | 10 +++++++++- package.json | 2 +- src/constants/index.ts | 2 +- 4 files changed, 11 insertions(+), 22 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 9d14cfe5..a98482e0 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -19,17 +19,6 @@ jobs: - checkout - node/install-packages - run: npm test - publish: - executor: - name: node - steps: - - browser-tools/install-browser-tools - - node/install-npm - - checkout - - node/install-packages - - run: - name: "Deploy plugin to marketplace" - command: npm run deploy workflows: test-publish: @@ -38,11 +27,3 @@ workflows: filters: tags: only: /.*/ - - publish: - requires: - - test - filters: - tags: - only: /^\d+\.\d+\.\d+$/ - branches: - ignore: /.*/ diff --git a/CHANGELOG.md b/CHANGELOG.md index 878679e0..6e2bf6dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,9 +1,17 @@ # Change Log +## 1.2.0 - 7 December 2021 + +### Added +- Telemetry for errors, like if there are no jobs. [#55](https://github.com/getlocalci/local-ci/pull/55/) + +### Fixed +- Fix cannot stat error in `tmp/`. [#54](https://github.com/getlocalci/local-ci/pull/54) + ## 1.1.0 - 6 December 2021 ### Added -- Telemetry for activating, running a job, and no jobs, opt out with `"telemetry.enableTelemetry": false`. [#50](https://github.com/getlocalci/local-ci/pull/50/) +- Telemetry for activating, running a job, and no jobs, opt out with `"telemetry.telemetryLevel": "off"`. [#50](https://github.com/getlocalci/local-ci/pull/50/) ## 1.0.2 - 5 December 2021 diff --git a/package.json b/package.json index cda09eaf..4584c405 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "local-ci", "displayName": "Local CI", "description": "Debug CircleCI® workflows locally, with Bash access during and after. Free preview, then paid.", - "version": "1.1.0", + "version": "1.2.0", "publisher": "LocalCI", "contributors": [ "Ryan Kienstra" diff --git a/src/constants/index.ts b/src/constants/index.ts index be2012ec..641d3289 100644 --- a/src/constants/index.ts +++ b/src/constants/index.ts @@ -1,4 +1,4 @@ -export const EXTENSION_VERSION = '1.1.0'; +export const EXTENSION_VERSION = '1.2.0'; export const EXTENSION_ID = 'LocalCI.local-ci'; export const COMMITTED_IMAGE_NAMESPACE = 'local-ci'; export const SELECTED_CONFIG_PATH = 'local-ci.config.path'; From 1fe8419b25ccb11a9a25032c4a17b212841d4e49 Mon Sep 17 00:00:00 2001 From: Ryan Kienstra Date: Tue, 7 Dec 2021 01:09:56 -0600 Subject: [PATCH 14/14] Make the CHANGELOG entry more accurate --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6e2bf6dc..799e13da 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ ## 1.2.0 - 7 December 2021 ### Added -- Telemetry for errors, like if there are no jobs. [#55](https://github.com/getlocalci/local-ci/pull/55/) +- Telemetry, including for errors like if there are no jobs. [#55](https://github.com/getlocalci/local-ci/pull/55/) ### Fixed - Fix cannot stat error in `tmp/`. [#54](https://github.com/getlocalci/local-ci/pull/54)