Skip to content

Commit

Permalink
Merge pull request #1721 from actions/robherley/retry-502-invalid-body
Browse files Browse the repository at this point in the history
artifact client: retry on non-JSON response
  • Loading branch information
robherley committed Apr 19, 2024
2 parents 5a73664 + b384fe1 commit eb1cb36
Show file tree
Hide file tree
Showing 4 changed files with 60 additions and 5 deletions.
12 changes: 10 additions & 2 deletions packages/artifact/RELEASES.md
@@ -1,5 +1,13 @@
# @actions/artifact Releases

### 2.1.6

- Will retry on invalid request responses.

### 2.1.5

- Bumped `archiver` dependency to 7.0.1

### 2.1.4

- Adds info-level logging for zip extraction
Expand All @@ -11,9 +19,9 @@
### 2.1.2

- Updated the stream extract functionality to use `unzip.Parse()` instead of `unzip.Extract()` for greater control of unzipping artifacts

### 2.1.1

- Updated `isGhes` check to include `.ghe.com` and `.ghe.localhost` as accepted hosts

### 2.1.0
Expand Down
48 changes: 48 additions & 0 deletions packages/artifact/__tests__/artifact-http-client.test.ts
Expand Up @@ -116,6 +116,54 @@ describe('artifact-http-client', () => {
expect(mockPost).toHaveBeenCalledTimes(2)
})

it('should retry if invalid body response', async () => {
const mockPost = jest
.fn(() => {
const msgSucceeded = new http.IncomingMessage(new net.Socket())
msgSucceeded.statusCode = 200
return {
message: msgSucceeded,
readBody: async () => {
return Promise.resolve(
`{"ok": true, "signedUploadUrl": "http://localhost:8080/upload"}`
)
}
}
})
.mockImplementationOnce(() => {
const msgFailed = new http.IncomingMessage(new net.Socket())
msgFailed.statusCode = 502
msgFailed.statusMessage = 'Bad Gateway'
return {
message: msgFailed,
readBody: async () => {
return Promise.resolve('💥')
}
}
})
const mockHttpClient = (
HttpClient as unknown as jest.Mock
).mockImplementation(() => {
return {
post: mockPost
}
})

const client = internalArtifactTwirpClient(clientOptions)
const artifact = await client.CreateArtifact({
workflowRunBackendId: '1234',
workflowJobRunBackendId: '5678',
name: 'artifact',
version: 4
})

expect(mockHttpClient).toHaveBeenCalledTimes(1)
expect(artifact).toBeDefined()
expect(artifact.ok).toBe(true)
expect(artifact.signedUploadUrl).toBe('http://localhost:8080/upload')
expect(mockPost).toHaveBeenCalledTimes(2)
})

it('should fail if the request fails 5 times', async () => {
const mockPost = jest.fn(() => {
const msgFailed = new http.IncomingMessage(new net.Socket())
Expand Down
4 changes: 2 additions & 2 deletions packages/artifact/package.json
@@ -1,6 +1,6 @@
{
"name": "@actions/artifact",
"version": "2.1.5",
"version": "2.1.6",
"preview": true,
"description": "Actions artifact lib",
"keywords": [
Expand Down Expand Up @@ -62,4 +62,4 @@
"typedoc-plugin-markdown": "^3.17.1",
"typescript": "^5.2.2"
}
}
}
Expand Up @@ -102,7 +102,6 @@ class ArtifactHttpClient implements Rpc {
} catch (error) {
if (error instanceof SyntaxError) {
debug(`Raw Body: ${rawBody}`)
throw error
}

if (error instanceof UsageError) {
Expand Down

0 comments on commit eb1cb36

Please sign in to comment.