mirror of
https://github.com/dorny/test-reporter.git
synced 2025-12-15 22:07:09 +01:00
The retransmission of the authentication token to the server providing the artifact caused the following errors when using Artifacts v4: HTTPError: Response code 400 (Authentication information is not given in the correct format. Check the value of Authorization header.) It looks like the service serving the artifacts does not expect the authentication header, and therefore complaines about inproper use of the authentication header. Delegating the redirect-handling to the `got` library fixes the issue according to my tsts.
114 lines
3.3 KiB
TypeScript
114 lines
3.3 KiB
TypeScript
import {createWriteStream} from 'fs'
|
|
import * as core from '@actions/core'
|
|
import * as github from '@actions/github'
|
|
import {GitHub} from '@actions/github/lib/utils'
|
|
import type {PullRequest} from '@octokit/webhooks-types'
|
|
import * as stream from 'stream'
|
|
import {promisify} from 'util'
|
|
import got from 'got'
|
|
const asyncStream = promisify(stream.pipeline)
|
|
|
|
export function getCheckRunContext(): {sha: string; runId: number} {
|
|
if (github.context.eventName === 'workflow_run') {
|
|
core.info('Action was triggered by workflow_run: using SHA and RUN_ID from triggering workflow')
|
|
const event = github.context.payload
|
|
if (!event.workflow_run) {
|
|
throw new Error("Event of type 'workflow_run' is missing 'workflow_run' field")
|
|
}
|
|
return {
|
|
sha: event.workflow_run.head_commit.id,
|
|
runId: event.workflow_run.id
|
|
}
|
|
}
|
|
|
|
const runId = github.context.runId
|
|
if (github.context.payload.pull_request) {
|
|
core.info(`Action was triggered by ${github.context.eventName}: using SHA from head of source branch`)
|
|
const pr = github.context.payload.pull_request as PullRequest
|
|
return {sha: pr.head.sha, runId}
|
|
}
|
|
|
|
return {sha: github.context.sha, runId}
|
|
}
|
|
|
|
export async function downloadArtifact(
|
|
octokit: InstanceType<typeof GitHub>,
|
|
artifactId: number,
|
|
fileName: string,
|
|
token: string
|
|
): Promise<void> {
|
|
core.startGroup(`Downloading artifact ${fileName}`)
|
|
try {
|
|
core.info(`Artifact ID: ${artifactId}`)
|
|
|
|
const req = octokit.rest.actions.downloadArtifact.endpoint({
|
|
...github.context.repo,
|
|
artifact_id: artifactId,
|
|
archive_format: 'zip'
|
|
})
|
|
|
|
const headers = {
|
|
Authorization: `Bearer ${token}`
|
|
}
|
|
|
|
const downloadStream = got.stream(req.url, {headers})
|
|
const fileWriterStream = createWriteStream(fileName)
|
|
|
|
downloadStream.on('redirect', response => {
|
|
core.info(`Downloading ${response.headers.location}`)
|
|
})
|
|
downloadStream.on('downloadProgress', ({transferred}) => {
|
|
core.info(`Progress: ${transferred} B`)
|
|
})
|
|
|
|
await asyncStream(downloadStream, fileWriterStream)
|
|
} finally {
|
|
core.endGroup()
|
|
}
|
|
}
|
|
|
|
export async function listFiles(octokit: InstanceType<typeof GitHub>, sha: string): Promise<string[]> {
|
|
core.startGroup('Fetching list of tracked files from GitHub')
|
|
try {
|
|
const commit = await octokit.rest.git.getCommit({
|
|
commit_sha: sha,
|
|
...github.context.repo
|
|
})
|
|
const files = await listGitTree(octokit, commit.data.tree.sha, '')
|
|
return files
|
|
} finally {
|
|
core.endGroup()
|
|
}
|
|
}
|
|
|
|
async function listGitTree(octokit: InstanceType<typeof GitHub>, sha: string, path: string): Promise<string[]> {
|
|
const pathLog = path ? ` at ${path}` : ''
|
|
core.info(`Fetching tree ${sha}${pathLog}`)
|
|
let truncated = false
|
|
let tree = await octokit.rest.git.getTree({
|
|
recursive: 'true',
|
|
tree_sha: sha,
|
|
...github.context.repo
|
|
})
|
|
|
|
if (tree.data.truncated) {
|
|
truncated = true
|
|
tree = await octokit.rest.git.getTree({
|
|
tree_sha: sha,
|
|
...github.context.repo
|
|
})
|
|
}
|
|
|
|
const result: string[] = []
|
|
for (const tr of tree.data.tree) {
|
|
const file = `${path}${tr.path}`
|
|
if (tr.type === 'blob') {
|
|
result.push(file)
|
|
} else if (tr.type === 'tree' && truncated) {
|
|
const files = await listGitTree(octokit, tr.sha as string, `${file}/`)
|
|
result.push(...files)
|
|
}
|
|
}
|
|
|
|
return result
|
|
}
|