Files
toolkit/packages/cache/src/options.ts
T

235 lines
6.4 KiB
TypeScript
Raw Normal View History

import * as core from '@actions/core'
/**
* Options to control cache upload
*/
export interface UploadOptions {
/**
* Indicates whether to use the Azure Blob SDK to download caches
* that are stored on Azure Blob Storage to improve reliability and
* performance
*
* @default false
*/
useAzureSdk?: boolean
/**
* Number of parallel cache upload
*
* @default 4
*/
uploadConcurrency?: number
/**
2020-05-15 12:18:50 -04:00
* Maximum chunk size in bytes for cache upload
*
* @default 32MB
*/
uploadChunkSize?: number
2024-12-02 03:55:57 -08:00
/**
* Archive size in bytes
*/
archiveSizeBytes?: number
}
/**
* Options to control cache download
*/
export interface DownloadOptions {
/**
* Indicates whether to use the Azure Blob SDK to download caches
* that are stored on Azure Blob Storage to improve reliability and
* performance
*
* @default true
*/
useAzureSdk?: boolean
/**
* Number of parallel downloads (this option only applies when using
* the Azure SDK)
*
* @default 8
*/
downloadConcurrency?: number
/**
* Indicates whether to use Actions HttpClient with concurrency
* for Azure Blob Storage
*/
concurrentBlobDownloads?: boolean
/**
* Maximum time for each download request, in milliseconds (this
* option only applies when using the Azure SDK)
*
* @default 30000
*/
2022-08-03 14:12:16 +00:00
timeoutInMs?: number
2022-08-03 10:23:42 +00:00
/**
2022-08-08 04:48:36 +00:00
* Time after which a segment download should be aborted if stuck
2022-08-03 10:23:42 +00:00
*
2022-08-05 05:44:59 +00:00
* @default 3600000
2022-08-03 10:23:42 +00:00
*/
2022-08-08 04:48:36 +00:00
segmentTimeoutInMs?: number
2022-12-23 12:44:35 +01:00
/**
* Weather to skip downloading the cache entry.
2023-01-17 17:12:42 +01:00
* If lookupOnly is set to true, the restore function will only check if
2022-12-23 12:44:35 +01:00
* a matching cache entry exists and return the cache key if it does.
*
* @default false
*/
2023-01-17 17:12:42 +01:00
lookupOnly?: boolean
/**
* Whether to validate that every entry in the downloaded cache archive
* resolves to a path under one of the declared cache `paths` before
* extraction. Symlink and hardlink targets are also validated.
*
* - 'off' (default): no validation, identical to legacy behavior.
* - 'warn': validate before extraction; log a single aggregated
* `core.warning()` summary (with full per-entry detail in
* `core.debug()`) if violations are found, then extract anyway.
* - 'error': validate before extraction; throw `CacheIntegrityError`
* (with `code: 'PATH_VIOLATION'`) on any violation. Extraction
* does not run when this throws.
*
* Parse / decompression failures encountered while validating are
* handled per-mode:
* - 'warn': logged via `core.warning()`; validation is skipped and
* extraction proceeds (the system `tar` invoked for the actual
* extraction is more lenient than the validator and may still
* succeed).
* - 'error': surfaced as `CacheIntegrityError` with `code: 'PARSE_ERROR'`
* and extraction does not run.
*
* @default 'off'
*/
pathValidation?: 'off' | 'warn' | 'error'
}
/**
* Returns a copy of the upload options with defaults filled in.
*
* @param copy the original upload options
*/
export function getUploadOptions(copy?: UploadOptions): UploadOptions {
2024-12-02 07:32:33 -08:00
// Defaults if not overriden
const result: UploadOptions = {
useAzureSdk: false,
uploadConcurrency: 4,
uploadChunkSize: 32 * 1024 * 1024
}
if (copy) {
if (typeof copy.useAzureSdk === 'boolean') {
result.useAzureSdk = copy.useAzureSdk
}
if (typeof copy.uploadConcurrency === 'number') {
result.uploadConcurrency = copy.uploadConcurrency
}
if (typeof copy.uploadChunkSize === 'number') {
result.uploadChunkSize = copy.uploadChunkSize
}
}
2024-12-02 07:32:33 -08:00
/**
* Add env var overrides
*/
// Cap the uploadConcurrency at 32
result.uploadConcurrency = !isNaN(
Number(process.env['CACHE_UPLOAD_CONCURRENCY'])
)
? Math.min(32, Number(process.env['CACHE_UPLOAD_CONCURRENCY']))
: result.uploadConcurrency
// Cap the uploadChunkSize at 128MiB
result.uploadChunkSize = !isNaN(
Number(process.env['CACHE_UPLOAD_CHUNK_SIZE'])
)
? Math.min(
128 * 1024 * 1024,
Number(process.env['CACHE_UPLOAD_CHUNK_SIZE']) * 1024 * 1024
)
: result.uploadChunkSize
core.debug(`Use Azure SDK: ${result.useAzureSdk}`)
core.debug(`Upload concurrency: ${result.uploadConcurrency}`)
core.debug(`Upload chunk size: ${result.uploadChunkSize}`)
return result
}
/**
* Returns a copy of the download options with defaults filled in.
*
* @param copy the original download options
*/
export function getDownloadOptions(copy?: DownloadOptions): DownloadOptions {
const result: DownloadOptions = {
useAzureSdk: false,
concurrentBlobDownloads: true,
downloadConcurrency: 8,
2022-08-03 10:23:42 +00:00
timeoutInMs: 30000,
2023-03-08 19:14:15 +00:00
segmentTimeoutInMs: 600000,
lookupOnly: false,
pathValidation: 'off'
}
if (copy) {
if (typeof copy.useAzureSdk === 'boolean') {
result.useAzureSdk = copy.useAzureSdk
}
if (typeof copy.concurrentBlobDownloads === 'boolean') {
result.concurrentBlobDownloads = copy.concurrentBlobDownloads
}
if (typeof copy.downloadConcurrency === 'number') {
result.downloadConcurrency = copy.downloadConcurrency
}
if (typeof copy.timeoutInMs === 'number') {
result.timeoutInMs = copy.timeoutInMs
}
2022-08-03 10:23:42 +00:00
2022-08-08 04:48:36 +00:00
if (typeof copy.segmentTimeoutInMs === 'number') {
result.segmentTimeoutInMs = copy.segmentTimeoutInMs
2022-08-03 10:23:42 +00:00
}
2022-12-23 12:44:35 +01:00
2023-01-17 17:12:42 +01:00
if (typeof copy.lookupOnly === 'boolean') {
result.lookupOnly = copy.lookupOnly
2022-12-23 12:44:35 +01:00
}
if (
copy.pathValidation === 'off' ||
copy.pathValidation === 'warn' ||
copy.pathValidation === 'error'
) {
result.pathValidation = copy.pathValidation
}
}
2022-08-18 05:32:49 +00:00
const segmentDownloadTimeoutMins =
process.env['SEGMENT_DOWNLOAD_TIMEOUT_MINS']
2022-08-16 04:14:27 +00:00
if (
2022-08-18 05:32:49 +00:00
segmentDownloadTimeoutMins &&
!isNaN(Number(segmentDownloadTimeoutMins)) &&
isFinite(Number(segmentDownloadTimeoutMins))
2022-08-16 04:14:27 +00:00
) {
2022-08-18 05:32:49 +00:00
result.segmentTimeoutInMs = Number(segmentDownloadTimeoutMins) * 60 * 1000
2022-08-16 04:14:27 +00:00
}
core.debug(`Use Azure SDK: ${result.useAzureSdk}`)
core.debug(`Download concurrency: ${result.downloadConcurrency}`)
core.debug(`Request timeout (ms): ${result.timeoutInMs}`)
2022-08-16 04:14:27 +00:00
core.debug(
2022-08-18 05:32:49 +00:00
`Cache segment download timeout mins env var: ${process.env['SEGMENT_DOWNLOAD_TIMEOUT_MINS']}`
2022-08-16 04:14:27 +00:00
)
2022-08-08 04:48:36 +00:00
core.debug(`Segment download timeout (ms): ${result.segmentTimeoutInMs}`)
2023-01-17 17:12:42 +01:00
core.debug(`Lookup only: ${result.lookupOnly}`)
core.debug(`Path validation: ${result.pathValidation}`)
return result
}