Skip to content

Commit 1bcfb42

Browse files
committed
Add exponential backoff when retrying
1 parent b20b44f commit 1bcfb42

2 files changed

Lines changed: 15 additions & 11 deletions

File tree

packages/artifact/__tests__/retry.test.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import {retry} from '../src/internal/requestUtils'
22
import * as core from '@actions/core'
33

4+
jest.mock('../src/internal/config-variables')
5+
46
interface ITestResponse {
57
statusCode: number
68
result: string | null
@@ -52,8 +54,7 @@ async function testRetryExpectingResult(
5254
async () => handleResponse(responses.pop()),
5355
(response: ITestResponse) => response.statusCode,
5456
new Map(), // extra error message for any particular http codes
55-
2, // maxAttempts
56-
0 // delay
57+
2 // maxAttempts
5758
)
5859

5960
expect(actualResult.result).toEqual(expectedResult)
@@ -70,8 +71,7 @@ async function testRetryExpectingError(
7071
async () => handleResponse(responses.pop()),
7172
(response: ITestResponse) => response.statusCode,
7273
new Map(), // extra error message for any particular http codes
73-
2, // maxAttempts,
74-
0 // delay
74+
2 // maxAttempts,
7575
)
7676
).rejects.toBeInstanceOf(Error)
7777
}

packages/artifact/src/internal/requestUtils.ts

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,19 @@
11
import {IHttpClientResponse} from '@actions/http-client/interfaces'
2-
import {isRetryableStatusCode, isSuccessStatusCode, sleep} from './utils'
2+
import {
3+
isRetryableStatusCode,
4+
isSuccessStatusCode,
5+
sleep,
6+
getExponentialRetryTimeInMilliseconds
7+
} from './utils'
38
import * as core from '@actions/core'
9+
import {getRetryLimit} from './config-variables'
410

511
export async function retry<T>(
612
name: string,
713
operation: () => Promise<T>,
814
getStatusCode: (response: T) => number | undefined,
915
errorMessages: Map<number, string>,
10-
maxAttempts: number,
11-
delayMilliseconds: number
16+
maxAttempts: number
1217
): Promise<T> {
1318
let response: T | undefined = undefined
1419
let statusCode: number | undefined = undefined
@@ -47,7 +52,7 @@ export async function retry<T>(
4752
`${name} - Attempt ${attempt} of ${maxAttempts} failed with error: ${errorMessage}`
4853
)
4954

50-
await sleep(delayMilliseconds)
55+
await sleep(getExponentialRetryTimeInMilliseconds(attempt))
5156
attempt++
5257
}
5358

@@ -61,14 +66,13 @@ export async function retryHttpClientRequest<T>(
6166
name: string,
6267
method: () => Promise<IHttpClientResponse>,
6368
errorMessages: Map<number, string> = new Map(),
64-
maxAttempts = 3
69+
maxAttempts = getRetryLimit()
6570
): Promise<IHttpClientResponse> {
6671
return await retry(
6772
name,
6873
method,
6974
(response: IHttpClientResponse) => response.message.statusCode,
7075
errorMessages,
71-
maxAttempts,
72-
5000
76+
maxAttempts
7377
)
7478
}

0 commit comments

Comments
 (0)