feat: display an activity indicator in the CLI output when uploading artifacts to cypress cloud (#28277)

* logic for activity indicator

* update snapshot & masking to handle upload duration, remove defunct mask for upload order

* update changelog

* check for existence of upload activity indicator before attempting to stop it

* updates changelog

* Update cli/CHANGELOG.md

* upload activity display improvements; configurable intervals and delays

* system test snapshots for video compression

* default delay and interval based on undefined rather than falsy

* reduce interval so upload indicator is captured in certain system tests

* Update CHANGELOG.md

* Update CHANGELOG.md

* remove initial delay for upload activity

* correctly evaluate if an upload activity interval env is set or not

* re-inserts spacing before upload activity indicator

* snapshots

---------

Co-authored-by: Jennifer Shehane <jennifer@cypress.io>
This commit is contained in:
Cacie Prins
2023-11-20 11:50:53 -05:00
committed by GitHub
parent 02d0493472
commit e3ba69781d
8 changed files with 116 additions and 14 deletions
+2 -1
View File
@@ -5,7 +5,8 @@ _Released 11/21/2023 (PENDING)_
**Features:**
- When artifacts are uploaded to the Cypress Cloud, the duration of each upload will be displayed in the console. Addresses [#28237](https://github.com/cypress-io/cypress/issues/28237).
- Added an activity indicator to CLI output when artifacts (screenshots, videos, or Test Replay) are being uploaded to the cloud. Addresses [#28239](https://github.com/cypress-io/cypress/issues/28239). Addressed in [#28277](https://github.com/cypress-io/cypress/pull/28277).
- When artifacts are uploaded to the Cypress Cloud, the duration of each upload will be displayed in the terminal. Addresses [#28237](https://github.com/cypress-io/cypress/issues/28237).
**Bugfixes:**
+12 -2
View File
@@ -21,7 +21,7 @@ const Config = require('../config')
const env = require('../util/env')
const terminal = require('../util/terminal')
const ciProvider = require('../util/ci_provider')
const { printPendingArtifactUpload, printCompletedArtifactUpload } = require('../util/print-run')
const { printPendingArtifactUpload, printCompletedArtifactUpload, beginUploadActivityOutput } = require('../util/print-run')
const testsUtils = require('../util/tests_utils')
const specWriter = require('../util/spec_writer')
const { fs } = require('../util/fs')
@@ -240,6 +240,12 @@ const uploadArtifactBatch = async (artifacts, protocolManager, quiet) => {
}
})
let stopUploadActivityOutput
if (!quiet && preparedArtifacts.filter(({ skip }) => !skip).length) {
stopUploadActivityOutput = beginUploadActivityOutput()
}
const uploadResults = await Promise.all(
preparedArtifacts.map(async (artifact) => {
if (artifact.skip) {
@@ -316,7 +322,11 @@ const uploadArtifactBatch = async (artifacts, protocolManager, quiet) => {
}
}
}),
)
).finally(() => {
if (stopUploadActivityOutput) {
stopUploadActivityOutput()
}
})
const attemptedUploadResults = uploadResults.filter(({ skipped }) => {
return !skipped
+19
View File
@@ -648,3 +648,22 @@ export const printCompletedArtifactUpload = <T extends ArtifactUploadResultLike>
process.stdout.write('\n')
}
const UPLOAD_ACTIVITY_INTERVAL = typeof env.get('CYPRESS_UPLOAD_ACTIVITY_INTERVAL') === 'undefined' ? 15000 : env.get('CYPRESS_UPLOAD_ACTIVITY_INTERVAL')
export const beginUploadActivityOutput = () => {
console.log('')
process.stdout.write(chalk.bold.blue(' Uploading Cloud Artifacts: '))
process.stdout.write(chalk.bold.blue('. '))
const uploadActivityInterval = setInterval(() => {
process.stdout.write(chalk.bold.blue('. '))
}, UPLOAD_ACTIVITY_INTERVAL)
return () => {
if (uploadActivityInterval) {
console.log('')
}
clearInterval(uploadActivityInterval)
}
}
+62
View File
@@ -67,6 +67,8 @@ Fix the error in your code and re-run your tests.
- Screenshot - Nothing to upload
- Test Replay - Nothing to upload - Test Replay is disabled for this project. Enable Test Replay in Cloud project settings
Uploading Cloud Artifacts: . . . . .
(Uploaded Cloud Artifacts)
- Video - Done Uploading 1 kB in Xm, Ys ZZ.ZZms 1/1 /XXX/XXX/XXX/cypress/videos/record_error.cy.js.mp4
@@ -130,6 +132,8 @@ Because this error occurred during a \`before each\` hook we are skipping the re
- Screenshot - 1 kB /XXX/XXX/XXX/cypress/screenshots/record_fail.cy.js/record fails -- fails 1 -- before each hook (failed).png
- Test Replay - Nothing to upload - Test Replay is disabled for this project. Enable Test Replay in Cloud project settings
Uploading Cloud Artifacts: . . . . .
(Uploaded Cloud Artifacts)
- Video - Done Uploading 1 kB in Xm, Ys ZZ.ZZms 1/2 /XXX/XXX/XXX/cypress/videos/record_fail.cy.js.mp4
@@ -178,6 +182,8 @@ plugin stdout
- Screenshot - 1 kB /XXX/XXX/XXX/cypress/screenshots/record_pass.cy.js/yay it passes.png
- Test Replay - Nothing to upload - Test Replay is disabled for this project. Enable Test Replay in Cloud project settings
Uploading Cloud Artifacts: . . . . .
(Uploaded Cloud Artifacts)
- Screenshot - Done Uploading 1 kB in Xm, Ys ZZ.ZZms 1/1 /XXX/XXX/XXX/cypress/screenshots/record_pass.cy.js/yay it passes.png
@@ -244,6 +250,8 @@ We dynamically generated a new test to display this failure.
- Screenshot - 1 kB /XXX/XXX/XXX/cypress/screenshots/record_uncaught.cy.js/An uncaught error was detected outside of a test (failed).png
- Test Replay - Nothing to upload - Test Replay is disabled for this project. Enable Test Replay in Cloud project settings
Uploading Cloud Artifacts: . . . . .
(Uploaded Cloud Artifacts)
- Video - Done Uploading 1 kB in Xm, Ys ZZ.ZZms 1/2 /XXX/XXX/XXX/cypress/videos/record_uncaught.cy.js.mp4
@@ -1060,6 +1068,8 @@ plugin stdout
- Screenshot - 1 kB /XXX/XXX/XXX/cypress/screenshots/record_pass.cy.js/yay it passes.png
- Test Replay - Nothing to upload - Test Replay is disabled for this project. Enable Test Replay in Cloud project settings
Uploading Cloud Artifacts: . . . . .
(Uploaded Cloud Artifacts)
- Screenshot - Done Uploading 1 kB in Xm, Ys ZZ.ZZms 1/1 /XXX/XXX/XXX/cypress/screenshots/record_pass.cy.js/yay it passes.png
@@ -1576,6 +1586,8 @@ exports['e2e record api interaction errors update instance stdout warns but proc
- Screenshot - 1 kB /XXX/XXX/XXX/cypress/screenshots/record_pass.cy.js/yay it passes.png
- Test Replay - Nothing to upload - Test Replay is disabled for this project. Enable Test Replay in Cloud project settings
Uploading Cloud Artifacts: . . . . .
(Uploaded Cloud Artifacts)
- Screenshot - Done Uploading 1 kB in Xm, Ys ZZ.ZZms 1/1 /XXX/XXX/XXX/cypress/screenshots/record_pass.cy.js/yay it passes.png
@@ -1669,6 +1681,8 @@ exports['e2e record api interaction errors uploading assets warns but proceeds 1
- Screenshot - 1 kB /XXX/XXX/XXX/cypress/screenshots/record_pass.cy.js/yay it passes.png
- Test Replay - Nothing to upload - Test Replay is disabled for this project. Enable Test Replay in Cloud project settings
Uploading Cloud Artifacts: . . . . .
(Uploaded Cloud Artifacts)
- Video - Failed Uploading after Xm, Ys ZZ.ZZms 1/2 /XXX/XXX/XXX/cypress/videos/record_pass.cy.js.mp4 - 500 - "Internal Server Error"
@@ -1775,6 +1789,8 @@ We will retry 3 more times in X second(s)...
- Screenshot - 1 kB /XXX/XXX/XXX/cypress/screenshots/record_pass.cy.js/yay it passes.png
- Test Replay - Nothing to upload - Test Replay is disabled for this project. Enable Test Replay in Cloud project settings
Uploading Cloud Artifacts: . . . . .
(Uploaded Cloud Artifacts)
- Screenshot - Done Uploading 1 kB in Xm, Ys ZZ.ZZms 1/1 /XXX/XXX/XXX/cypress/screenshots/record_pass.cy.js/yay it passes.png
@@ -2018,6 +2034,8 @@ https://on.cypress.io/dashboard/organizations/org-id-1234/billing
- Video - Nothing to upload
- Screenshot - 1 kB /XXX/XXX/XXX/cypress/screenshots/record_pass.cy.js/yay it passes.png
Uploading Cloud Artifacts: . . . . .
(Uploaded Cloud Artifacts)
- Screenshot - Done Uploading 1 kB in Xm, Ys ZZ.ZZms 1/1 /XXX/XXX/XXX/cypress/screenshots/record_pass.cy.js/yay it passes.png
@@ -2103,6 +2121,8 @@ https://on.cypress.io/dashboard/organizations/org-id-1234/billing
- Video - Nothing to upload
- Screenshot - 1 kB /XXX/XXX/XXX/cypress/screenshots/record_pass.cy.js/yay it passes.png
Uploading Cloud Artifacts: . . . . .
(Uploaded Cloud Artifacts)
- Screenshot - Done Uploading 1 kB in Xm, Ys ZZ.ZZms 1/1 /XXX/XXX/XXX/cypress/screenshots/record_pass.cy.js/yay it passes.png
@@ -2190,6 +2210,8 @@ https://on.cypress.io/dashboard/organizations/org-id-1234/billing
- Video - Nothing to upload
- Screenshot - 1 kB /XXX/XXX/XXX/cypress/screenshots/record_pass.cy.js/yay it passes.png
Uploading Cloud Artifacts: . . . . .
(Uploaded Cloud Artifacts)
- Screenshot - Done Uploading 1 kB in Xm, Ys ZZ.ZZms 1/1 /XXX/XXX/XXX/cypress/screenshots/record_pass.cy.js/yay it passes.png
@@ -2275,6 +2297,8 @@ https://on.cypress.io/dashboard/organizations/org-id-1234/billing
- Video - Nothing to upload
- Screenshot - 1 kB /XXX/XXX/XXX/cypress/screenshots/record_pass.cy.js/yay it passes.png
Uploading Cloud Artifacts: . . . . .
(Uploaded Cloud Artifacts)
- Screenshot - Done Uploading 1 kB in Xm, Ys ZZ.ZZms 1/1 /XXX/XXX/XXX/cypress/screenshots/record_pass.cy.js/yay it passes.png
@@ -2360,6 +2384,8 @@ https://on.cypress.io/dashboard/organizations/org-id-1234/billing
- Video - Nothing to upload
- Screenshot - 1 kB /XXX/XXX/XXX/cypress/screenshots/record_pass.cy.js/yay it passes.png
Uploading Cloud Artifacts: . . . . .
(Uploaded Cloud Artifacts)
- Screenshot - Done Uploading 1 kB in Xm, Ys ZZ.ZZms 1/1 /XXX/XXX/XXX/cypress/screenshots/record_pass.cy.js/yay it passes.png
@@ -2445,6 +2471,8 @@ https://on.cypress.io/dashboard/organizations/org-id-1234/billing
- Video - Nothing to upload
- Screenshot - 1 kB /XXX/XXX/XXX/cypress/screenshots/record_pass.cy.js/yay it passes.png
Uploading Cloud Artifacts: . . . . .
(Uploaded Cloud Artifacts)
- Screenshot - Done Uploading 1 kB in Xm, Ys ZZ.ZZms 1/1 /XXX/XXX/XXX/cypress/screenshots/record_pass.cy.js/yay it passes.png
@@ -2530,6 +2558,8 @@ https://on.cypress.io/dashboard/organizations/org-id-1234/billing
- Video - Nothing to upload
- Screenshot - 1 kB /XXX/XXX/XXX/cypress/screenshots/record_pass.cy.js/yay it passes.png
Uploading Cloud Artifacts: . . . . .
(Uploaded Cloud Artifacts)
- Screenshot - Done Uploading 1 kB in Xm, Ys ZZ.ZZms 1/1 /XXX/XXX/XXX/cypress/screenshots/record_pass.cy.js/yay it passes.png
@@ -2615,6 +2645,8 @@ https://on.cypress.io/dashboard/organizations/org-id-1234/billing
- Video - Nothing to upload
- Screenshot - 1 kB /XXX/XXX/XXX/cypress/screenshots/record_pass.cy.js/yay it passes.png
Uploading Cloud Artifacts: . . . . .
(Uploaded Cloud Artifacts)
- Screenshot - Done Uploading 1 kB in Xm, Ys ZZ.ZZms 1/1 /XXX/XXX/XXX/cypress/screenshots/record_pass.cy.js/yay it passes.png
@@ -2706,6 +2738,8 @@ Details:
- Screenshot - 1 kB /XXX/XXX/XXX/cypress/screenshots/record_pass.cy.js/yay it passes.png
- Test Replay - Nothing to upload - Test Replay is disabled for this project. Enable Test Replay in Cloud project settings
Uploading Cloud Artifacts: . . . . .
(Uploaded Cloud Artifacts)
- Screenshot - Done Uploading 1 kB in Xm, Ys ZZ.ZZms 1/1 /XXX/XXX/XXX/cypress/screenshots/record_pass.cy.js/yay it passes.png
@@ -2787,6 +2821,8 @@ exports['e2e record capture-protocol disabled messaging displays disabled messag
- Screenshot - 1 kB /XXX/XXX/XXX/cypress/screenshots/record_pass.cy.js/yay it passes.png
- Test Replay - Nothing to upload - Test Replay is only supported in Chromium browsers
Uploading Cloud Artifacts: . . . . .
(Uploaded Cloud Artifacts)
- Screenshot - Done Uploading 1 kB in Xm, Ys ZZ.ZZms 1/1 /XXX/XXX/XXX/cypress/screenshots/record_pass.cy.js/yay it passes.png
@@ -2868,6 +2904,8 @@ exports['e2e record capture-protocol enabled passing retrieves the capture proto
- Screenshot - 1 kB /XXX/XXX/XXX/cypress/screenshots/record_pass.cy.js/yay it passes.png
- Test Replay - 1 kB
Uploading Cloud Artifacts: . . . . .
(Uploaded Cloud Artifacts)
- Screenshot - Done Uploading 1 kB in Xm, Ys ZZ.ZZms 1/2 /XXX/XXX/XXX/cypress/screenshots/record_pass.cy.js/yay it passes.png
@@ -2954,6 +2992,8 @@ https://on.cypress.io/renderer-process-crashed
- Screenshot - Nothing to upload
- Test Replay - 1 kB
Uploading Cloud Artifacts: . . . . .
(Uploaded Cloud Artifacts)
- Test Replay - Done Uploading 1 kB in Xm, Ys ZZ.ZZms 1/1
@@ -3000,6 +3040,8 @@ https://on.cypress.io/renderer-process-crashed
- Screenshot - 1 kB /XXX/XXX/XXX/cypress/screenshots/record_pass.cy.js/yay it passes.png
- Test Replay
Uploading Cloud Artifacts: . . . . .
(Uploaded Cloud Artifacts)
- Screenshot - Done Uploading 1 kB in Xm, Ys ZZ.ZZms 1/2 /XXX/XXX/XXX/cypress/screenshots/record_pass.cy.js/yay it passes.png
@@ -3080,6 +3122,8 @@ Error: Async error from plugins file
- Screenshot - Nothing to upload
- Test Replay - 1 kB
Uploading Cloud Artifacts: . . . . .
(Uploaded Cloud Artifacts)
- Test Replay - Done Uploading 1 kB in Xm, Ys ZZ.ZZms 1/1
@@ -3161,6 +3205,8 @@ exports['e2e record capture-protocol enabled protocol runtime errors db size too
- Screenshot - 1 kB /XXX/XXX/XXX/cypress/screenshots/record_pass.cy.js/yay it passes.png
- Test Replay - 1 kB
Uploading Cloud Artifacts: . . . . .
(Uploaded Cloud Artifacts)
- Screenshot - Done Uploading 1 kB in Xm, Ys ZZ.ZZms 1/2 /XXX/XXX/XXX/cypress/screenshots/record_pass.cy.js/yay it passes.png
@@ -3243,6 +3289,8 @@ exports['e2e record capture-protocol enabled protocol runtime errors error initi
- Screenshot - 1 kB /XXX/XXX/XXX/cypress/screenshots/record_pass.cy.js/yay it passes.png
- Test Replay - Failed Capturing - Error instantiating Protocol Capture
Uploading Cloud Artifacts: . . . . .
(Uploaded Cloud Artifacts)
- Screenshot - Done Uploading 1 kB in Xm, Ys ZZ.ZZms 1/1 /XXX/XXX/XXX/cypress/screenshots/record_pass.cy.js/yay it passes.png
@@ -3324,6 +3372,8 @@ exports['e2e record capture-protocol enabled protocol runtime errors error in pr
- Screenshot - 1 kB /XXX/XXX/XXX/cypress/screenshots/record_pass.cy.js/yay it passes.png
- Test Replay - Failed Capturing - Error in beforeSpec
Uploading Cloud Artifacts: . . . . .
(Uploaded Cloud Artifacts)
- Screenshot - Done Uploading 1 kB in Xm, Ys ZZ.ZZms 1/1 /XXX/XXX/XXX/cypress/screenshots/record_pass.cy.js/yay it passes.png
@@ -3405,6 +3455,8 @@ exports['e2e record capture-protocol enabled protocol runtime errors error in pr
- Screenshot - 1 kB /XXX/XXX/XXX/cypress/screenshots/record_pass.cy.js/yay it passes.png
- Test Replay - Failed Capturing - error in beforeTest
Uploading Cloud Artifacts: . . . . .
(Uploaded Cloud Artifacts)
- Screenshot - Done Uploading 1 kB in Xm, Ys ZZ.ZZms 1/1 /XXX/XXX/XXX/cypress/screenshots/record_pass.cy.js/yay it passes.png
@@ -3486,6 +3538,8 @@ exports['e2e record capture-protocol enabled protocol runtime errors non-fatal e
- Screenshot - 1 kB /XXX/XXX/XXX/cypress/screenshots/record_pass.cy.js/yay it passes.png
- Test Replay - 1 kB
Uploading Cloud Artifacts: . . . . .
(Uploaded Cloud Artifacts)
- Screenshot - Done Uploading 1 kB in Xm, Ys ZZ.ZZms 1/2 /XXX/XXX/XXX/cypress/screenshots/record_pass.cy.js/yay it passes.png
@@ -3568,6 +3622,8 @@ exports['capture-protocol api errors upload 500 - retries 8 times and fails cont
- Screenshot - 1 kB /XXX/XXX/XXX/cypress/screenshots/record_pass.cy.js/yay it passes.png
- Test Replay
Uploading Cloud Artifacts: . . . . .
(Uploaded Cloud Artifacts)
- Screenshot - Done Uploading 1 kB in Xm, Ys ZZ.ZZms 1/2 /XXX/XXX/XXX/cypress/screenshots/record_pass.cy.js/yay it passes.png
@@ -3650,6 +3706,8 @@ exports['capture-protocol api errors upload 500 - retries 7 times and succeeds o
- Screenshot - 1 kB /XXX/XXX/XXX/cypress/screenshots/record_pass.cy.js/yay it passes.png
- Test Replay - 1 kB
Uploading Cloud Artifacts: . . . . .
(Uploaded Cloud Artifacts)
- Screenshot - Done Uploading 1 kB in Xm, Ys ZZ.ZZms 1/2 /XXX/XXX/XXX/cypress/screenshots/record_pass.cy.js/yay it passes.png
@@ -3738,6 +3796,8 @@ We will retry 1 more time in X second(s)...
- Screenshot - 1 kB /XXX/XXX/XXX/cypress/screenshots/record_pass.cy.js/yay it passes.png
- Test Replay - Failed Capturing - Error downloading capture code: 500 - "500 - Internal Server Error"
Uploading Cloud Artifacts: . . . . .
(Uploaded Cloud Artifacts)
- Screenshot - Done Uploading 1 kB in Xm, Ys ZZ.ZZms 1/1 /XXX/XXX/XXX/cypress/screenshots/record_pass.cy.js/yay it passes.png
@@ -3819,6 +3879,8 @@ exports['capture-protocol api errors error report 500 continues 1'] = `
- Screenshot - 1 kB /XXX/XXX/XXX/cypress/screenshots/record_pass.cy.js/yay it passes.png
- Test Replay - 1 kB
Uploading Cloud Artifacts: . . . . .
(Uploaded Cloud Artifacts)
- Screenshot - Done Uploading 1 kB in Xm, Ys ZZ.ZZms 1/2 /XXX/XXX/XXX/cypress/screenshots/record_pass.cy.js/yay it passes.png
@@ -187,6 +187,8 @@ exports['video compression true / coerces true to 32 CRF'] = `
- Screenshot - Nothing to upload
- Test Replay - Nothing to upload - Test Replay is disabled for this project. Enable Test Replay in Cloud project settings
Uploading Cloud Artifacts: . . . . .
(Uploaded Cloud Artifacts)
- Video - Done Uploading 1 kB in Xm, Ys ZZ.ZZms 1/1 /XXX/XXX/XXX/cypress/videos/video_compression.cy.js.mp4
+4 -11
View File
@@ -68,15 +68,8 @@ const replaceTime = (str: string, p1: string) => {
const replaceScreenshotDims = (str: string, p1: string) => _.padStart('(YxX)', p1.length)
const replaceUploadingResults = function (orig: string, ...rest: string[]) {
const adjustedLength = Math.max(rest.length, 2)
const match = rest.slice(0, adjustedLength - 2)
const results = match[1].split('\n').map((res) => res.replace(/\(\d+\/(\d+)\)/g, '(*/$1)'))
.sort()
.join('\n')
const ret = match[0] + results + match[3]
return ret
const replaceUploadActivityIndicator = function (str: string, preamble: string, activity: string, ..._) {
return `${preamble}. . . . .`
}
// this captures an entire stack trace and replaces it with [stack trace lines]
@@ -156,8 +149,8 @@ export const normalizeStdout = function (str: string, options: any = {}) {
// 15 seconds -> XX seconds
.replace(/((\d+ minutes?,\s+)?\d+ seconds? *)/g, replaceTime)
.replace(/\r/g, '')
// replaces multiple lines of uploading screenshots & results (since order not guaranteed)
.replace(/(Uploading Screenshots & Videos.*?\n\n)((.*-.*[\s\S\r]){2,}?)(\n\n)/g, replaceUploadingResults)
// normalizes upload indicator to a consistent number of dots
.replace(/(Uploading Cloud Artifacts\: )([\. ]*)/g, replaceUploadActivityIndicator)
// fix "Require stacks" for CI
.replace(/^(\- )(\/.*\/packages\/server\/)(.*)$/gm, '$1$3')
// Different browsers have different cross-origin error messages
+10
View File
@@ -38,6 +38,11 @@ let { runId, groupId, machineId, runUrl, tags } = postRunResponse
const { instanceId } = postRunInstanceResponse
describe('e2e record', () => {
beforeEach(() => {
// uploads happen too fast to be captured by these tests without tuning these values
process.env.CYPRESS_UPLOAD_ACTIVITY_INTERVAL = 100
})
context('passing', () => {
setupStubbedServer(createRoutes())
@@ -2511,6 +2516,11 @@ describe('e2e record', () => {
})
describe('capture-protocol api errors', () => {
beforeEach(() => {
// uploads happen too fast to be captured by these tests without tuning these values
process.env.CYPRESS_UPLOAD_ACTIVITY_INTERVAL = 100
})
enableCaptureProtocol()
const stubbedServerWithErrorOn = (endpoint, numberOfFailuresBeforeSuccess = Number.MAX_SAFE_INTEGER) => {
@@ -39,6 +39,11 @@ function outputFinalFrameAsJpg (inputFile, outputFile) {
describe('e2e video compression', () => {
systemTests.setup()
beforeEach(() => {
// uploads happen too fast to be captured by these tests without tuning these values
process.env.CYPRESS_UPLOAD_ACTIVITY_INTERVAL = 1000
})
return [
true,
false,