diff --git a/package-lock.json b/package-lock.json index 01394ebaa..5fd4a067e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,6 +25,7 @@ "deep-eql": "^4.1.3", "dotenv": "^16.0.0", "fs-extra": "^8.1.0", + "p-retry": "^4.6.2", "semver": "^7.5.2", "vscode-nls": "^4.1.1", "vscode-uri": "^3.0.2" @@ -1377,6 +1378,11 @@ "node": ">= 6" } }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" + }, "node_modules/@types/semver": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", @@ -8556,6 +8562,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", @@ -9445,6 +9463,14 @@ "node": ">=0.12" } }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "engines": { + "node": ">= 4" + } + }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -12953,6 +12979,11 @@ } } }, + "@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" + }, "@types/semver": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", @@ -18498,6 +18529,15 @@ "aggregate-error": "^3.0.0" } }, + "p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "requires": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + } + }, "pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", @@ -19186,6 +19226,11 @@ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" }, + "retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==" + }, "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", diff --git a/package.json b/package.json index 7d7ac739f..23f5d0aaf 100644 --- a/package.json +++ b/package.json @@ -631,6 +631,7 @@ "dotenv": "^16.0.0", "fs-extra": "^8.1.0", "semver": "^7.5.2", + "p-retry": "^4.6.2", "vscode-nls": "^4.1.1", "vscode-uri": "^3.0.2" }, diff --git a/src/commands/image/imageSource/buildImageInAzure/RunStep.ts b/src/commands/image/imageSource/buildImageInAzure/RunStep.ts index 6394c42b3..40e17afea 100644 --- a/src/commands/image/imageSource/buildImageInAzure/RunStep.ts +++ b/src/commands/image/imageSource/buildImageInAzure/RunStep.ts @@ -5,8 +5,10 @@ import { type DockerBuildRequest as AcrDockerBuildRequest } from "@azure/arm-containerregistry"; import { AzExtFsExtra, GenericParentTreeItem, activityFailContext, activityFailIcon } from "@microsoft/vscode-azext-utils"; +import * as retry from 'p-retry'; import * as path from 'path'; import { type Progress } from "vscode"; +import { ext } from "../../../../extensionVariables"; import { ExecuteActivityOutputStepBase, type ExecuteActivityOutput } from "../../../../utils/activity/ExecuteActivityOutputStepBase"; import { createActivityChildContext } from "../../../../utils/activity/activityUtils"; import { localize } from "../../../../utils/localize"; @@ -27,10 +29,20 @@ export class RunStep extends ExecuteActivityOutputStepBase => { + const message: string = currentAttempt === 1 ? + localize('buildingImage', 'Building image...') : + localize('buildingImageAttempt', 'Building image (Attempt {0}/{1})...', currentAttempt, retries + 1); + progress.report({ message: message }); + ext.outputChannel.appendLog(message); - context.run = await context.client.registries.beginScheduleRunAndWait(context.resourceGroupName, context.registryName, runRequest); + context.run = await context.client.registries.beginScheduleRunAndWait(context.resourceGroupName, context.registryName, runRequest); + + }, + { retries, minTimeout: 2 * 1000 } + ); } finally { if (await AzExtFsExtra.pathExists(context.tarFilePath)) { await AzExtFsExtra.deleteResource(context.tarFilePath);