diff --git a/Tasks/JenkinsDownloadArtifactsV1/ArtifactDetails/JenkinsRestClient.ts b/Tasks/JenkinsDownloadArtifactsV1/ArtifactDetails/JenkinsRestClient.ts index 144929a517f3..f09de38f5dc4 100644 --- a/Tasks/JenkinsDownloadArtifactsV1/ArtifactDetails/JenkinsRestClient.ts +++ b/Tasks/JenkinsDownloadArtifactsV1/ArtifactDetails/JenkinsRestClient.ts @@ -213,7 +213,10 @@ export class JenkinsRestClient { const jobName = tl.getInput("jobName", true); const strictSSL: boolean = ('true' !== tl.getEndpointDataParameter(endpoint, 'acceptUntrustedCerts', true)); const jobUrlInfix = JenkinsJobDetails.GetJobUrlInfix(jobName); - const retryLimit = parseInt(tl.getVariable("VSTS_HTTP_RETRY")) ? parseInt(tl.getVariable("VSTS_HTTP_RETRY")) : 4; + + const retryLimitValue: string = tl.getVariable("VSTS_HTTP_RETRY"); + const retryLimit: number = (!!retryLimitValue && !isNaN(parseInt(retryLimitValue))) ? parseInt(retryLimitValue) : 4; + tl.debug(`RetryLimit set to ${retryLimit}`); let requestUrl: string = `${endpointUrl}${jobUrlInfix}/${urlPath}`; console.log(tl.loc("DownloadingContentFromJenkinsServer", requestUrl, strictSSL)); diff --git a/Tasks/JenkinsDownloadArtifactsV1/Tests/JenkinsTestHelper.ts b/Tasks/JenkinsDownloadArtifactsV1/Tests/JenkinsTestHelper.ts index 0ea0607c9dfe..64a7e97082fb 100644 --- a/Tasks/JenkinsDownloadArtifactsV1/Tests/JenkinsTestHelper.ts +++ b/Tasks/JenkinsDownloadArtifactsV1/Tests/JenkinsTestHelper.ts @@ -7,6 +7,9 @@ export interface ExpectedResult { export function RegisterHttpClientMock(tr: tmrm.TaskMockRunner, getResultCallback: any) { + // setting retry value to zero as we don't want the test to hang up + process.env['VSTS_HTTP_RETRY'] = "0" + tr.registerMock("artifact-engine/Providers/typed-rest-client/HttpClient", { HttpClient: function(name, handlers, options) { return { diff --git a/Tasks/JenkinsDownloadArtifactsV1/Tests/L0.ts b/Tasks/JenkinsDownloadArtifactsV1/Tests/L0.ts index 627a44bd339a..6a75a92ba7d6 100644 --- a/Tasks/JenkinsDownloadArtifactsV1/Tests/L0.ts +++ b/Tasks/JenkinsDownloadArtifactsV1/Tests/L0.ts @@ -515,4 +515,23 @@ describe('JenkinsDownloadArtifacts L0 Suite', function () { done(err); } }); + + it('Should retry if JenkinsClient encounters an error', (done) => { + const tp: string = path.join(__dirname, 'L0ShouldRetryCorrectlyWhenErrorHappens.js'); + const tr: ttm.MockTestRunner = new ttm.MockTestRunner(tp); + + try { + tr.run(); + + let expectedMessage: string = "RetryingOperation DownloadJsonContent 1"; + assert(tr.stdout.indexOf(expectedMessage) != -1, tr.stdout); + + done(); + } catch(err) { + console.log(tr.stdout); + console.log(tr.stderr); + console.log(err); + done(err); + } + }); }); diff --git a/Tasks/JenkinsDownloadArtifactsV1/Tests/L0ShouldRetryCorrectlyWhenErrorHappens.ts b/Tasks/JenkinsDownloadArtifactsV1/Tests/L0ShouldRetryCorrectlyWhenErrorHappens.ts new file mode 100644 index 000000000000..bbc5fd04b917 --- /dev/null +++ b/Tasks/JenkinsDownloadArtifactsV1/Tests/L0ShouldRetryCorrectlyWhenErrorHappens.ts @@ -0,0 +1,27 @@ +import tmrm = require('vsts-task-lib/mock-run'); +import path = require('path'); +import helper = require("./JenkinsTestHelper"); + +const taskPath = path.join(__dirname, '..', 'jenkinsdownloadartifacts.js'); +const tr: tmrm.TaskMockRunner = new tmrm.TaskMockRunner(taskPath); + +tr.setInput("serverEndpoint", "ID1"); +tr.setInput("jobName", "myfreestyleproject") +tr.setInput("saveTo", "jenkinsArtifacts"); +tr.setInput("filePath", "/"); +tr.setInput("jenkinsBuild", "BuildNumber"); +tr.setInput("jenkinsBuildNumber", "10"); +tr.setInput("itemPattern", "**"); +tr.setInput("downloadCommitsAndWorkItems", "false"); + +process.env['ENDPOINT_URL_ID1'] = 'http://url'; +process.env['ENDPOINT_AUTH_PARAMETER_connection1_username'] = 'dummyusername'; +process.env['ENDPOINT_AUTH_PARAMETER_connection1_password'] = 'dummypassword'; +process.env['ENDPOINT_DATA_ID1_acceptUntrustedCerts'] = 'true'; + +helper.RegisterArtifactEngineMock(tr); +helper.RegisterHttpClientMock(tr, (url: string) => { +}); + +process.env['VSTS_HTTP_RETRY'] = "1"; +tr.run();