2022-03-30 15:46:49 +05:30
import * as cache from "@actions/cache" ;
2019-10-30 14:48:49 -04:00
import * as core from "@actions/core" ;
2023-04-07 21:39:37 -04:00
import { RequestError } from "@octokit/request-error"
import { OctokitResponse } from "@octokit/types"
2019-11-13 10:54:39 -05:00
2022-12-21 19:38:44 +05:30
import { RefKey } from "../constants" ;
2023-04-07 21:39:37 -04:00
const { Octokit } = require ( "@octokit/action" ) ;
2019-10-30 14:48:49 -04:00
2020-09-29 09:58:32 -05:00
export function isGhes ( ) : boolean {
2024-10-18 13:52:16 +00:00
const ghUrl = new URL (
process . env [ "GITHUB_SERVER_URL" ] || "https://github.com"
) ;
2024-10-18 13:23:42 +02:00
2024-10-18 13:52:16 +00:00
const hostname = ghUrl . hostname . trimEnd ( ) . toUpperCase ( ) ;
const isGitHubHost = hostname === "GITHUB.COM" ;
const isGitHubEnterpriseCloudHost = hostname . endsWith ( ".GHE.COM" ) ;
const isLocalHost = hostname . endsWith ( ".LOCALHOST" ) ;
2024-10-18 13:23:42 +02:00
2024-10-18 13:52:16 +00:00
return ! isGitHubHost && ! isGitHubEnterpriseCloudHost && ! isLocalHost ;
2020-09-29 09:58:32 -05:00
}
2020-05-14 17:27:38 -04:00
export function isExactKeyMatch ( key : string , cacheKey? : string ) : boolean {
2019-10-30 14:48:49 -04:00
return ! ! (
2020-05-14 17:27:38 -04:00
cacheKey &&
cacheKey . localeCompare ( key , undefined , {
2019-10-30 14:48:49 -04:00
sensitivity : "accent"
} ) === 0
) ;
}
2025-02-03 15:18:50 -03:00
export function logWarning ( message : string ) : void {
const warningPrefix = "[warning]" ;
core . info ( ` ${ warningPrefix } ${ message } ` ) ;
}
export async function deleteCacheByKey ( key : string , owner : string , repo : string ) : Promise < number | void > {
2023-04-07 21:39:37 -04:00
const octokit = new Octokit ( ) ;
let response ;
try {
2025-02-03 15:18:50 -03:00
const gitRef = process . env [ RefKey ] ;
let cacheEntry = await octokit . rest . actions . getActionsCacheList ( {
owner : owner ,
repo : repo ,
key : key ,
ref : gitRef
} ) ;
const { data : {
total_count ,
actions_caches
}
} = cacheEntry ;
if ( total_count !== 1 || total_count !== actions_caches . length ) { // leave all find logic to the actual cache implementation. We just want to make sure we're returned a single element so we don't accidentally delete an entry that belongs to a different gitref.
if ( total_count > 1 ) {
exports . logWarning ( ` More than one cache entry found for key ${ key } ` ) ;
}
else if ( total_count === 0 || actions_caches . length === 0 ) {
exports . logWarning ( ` No cache entries for key ${ key } belong to gitref ${ gitRef } . ` ) ;
}
// This situation is likely never actually going to come up.
// Istanbul is being dumb and I can't ignore this path.
else if ( total_count !== actions_caches . length ) {
exports . logWarning ( ` Reported cache entry matches for ${ key } does not match length of 'actions_caches' array in API response. ` ) ;
}
core . info ( ` Skip trying to delete cache entry for key ${ key } . ` )
return ;
}
let id = actions_caches [ 0 ] . id ;
response = await octokit . rest . actions . deleteActionsCacheById ( {
2023-04-07 21:39:37 -04:00
owner : owner ,
repo : repo ,
2025-02-03 15:18:50 -03:00
cache_id : id
2023-04-07 21:39:37 -04:00
} ) ;
2025-02-03 15:18:50 -03:00
if ( response . status === 204 ) {
core . info ( ` Succesfully deleted cache with key: ${ key } , id: ${ id } ` ) ;
return 204 ;
2023-04-07 21:39:37 -04:00
}
} catch ( e ) {
if ( e instanceof RequestError ) {
let err = e as RequestError ;
let errData = err . response ? . data as any | undefined ;
2025-02-03 15:18:50 -03:00
exports . logWarning ( ` Github API reported error: ${ err . name } ' ${ err . status } : ${ errData ? . message } ' ` ) ;
2023-04-07 21:39:37 -04:00
}
2025-02-03 15:18:50 -03:00
core . info ( ` Couldn't delete cache entry for key ${ key } . ` )
return ;
2023-04-07 21:39:37 -04:00
}
2019-11-21 14:37:54 -05:00
}
2020-04-17 15:46:46 -04:00
// Cache token authorized for all events that are tied to a ref
2019-11-13 10:54:39 -05:00
// See GitHub Context https://help.github.com/actions/automating-your-workflow-with-github-actions/contexts-and-expression-syntax-for-github-actions#github-context
export function isValidEvent ( ) : boolean {
2020-04-20 13:44:37 -04:00
return RefKey in process . env && Boolean ( process . env [ RefKey ] ) ;
2019-11-13 10:54:39 -05:00
}
2020-06-02 10:21:03 -05:00
export function getInputAsArray (
name : string ,
options? : core.InputOptions
) : string [ ] {
return core
. getInput ( name , options )
. split ( "\n" )
2022-08-22 13:05:20 +00:00
. map ( s = > s . replace ( /^!\s+/ , "!" ) . trim ( ) )
2022-10-03 06:39:10 +00:00
. filter ( x = > x !== "" ) ;
2020-06-02 10:21:03 -05:00
}
2020-10-02 09:59:55 -05:00
export function getInputAsInt (
name : string ,
options? : core.InputOptions
) : number | undefined {
2020-10-02 10:55:30 -05:00
const value = parseInt ( core . getInput ( name , options ) ) ;
if ( isNaN ( value ) || value < 0 ) {
2020-10-02 09:59:55 -05:00
return undefined ;
}
return value ;
}
2022-03-30 15:46:49 +05:30
2023-01-05 16:49:13 +05:30
export function getInputAsBool (
name : string ,
options? : core.InputOptions
) : boolean {
const result = core . getInput ( name , options ) ;
return result . toLowerCase ( ) === "true" ;
}
2022-03-30 15:46:49 +05:30
export function isCacheFeatureAvailable ( ) : boolean {
2022-12-02 15:09:10 +09:00
if ( cache . isFeatureAvailable ( ) ) {
return true ;
}
if ( isGhes ( ) ) {
logWarning (
` Cache action is only supported on GHES version >= 3.5. If you are on version >=3.5 Please check with GHES admin if Actions cache service is enabled or not.
2022-09-20 10:47:27 +05:30
Otherwise please upgrade to GHES version >= 3.5 and If you are also using Github Connect , please unretire the actions / cache namespace before upgrade ( see https : //docs.github.com/en/enterprise-server@3.5/admin/github-actions/managing-access-to-actions-from-githubcom/enabling-automatic-access-to-githubcom-actions-using-github-connect#automatic-retirement-of-namespaces-for-actions-accessed-on-githubcom)`
2022-12-02 15:09:10 +09:00
) ;
2022-03-30 15:46:49 +05:30
return false ;
}
2022-12-02 15:09:10 +09:00
logWarning (
"An internal error has occurred in cache backend. Please check https://www.githubstatus.com/ for any ongoing issue in actions."
) ;
return false ;
2022-03-30 15:46:49 +05:30
}