AwsS3Cache.ps1

function Save-AwsS3Cache {
    [CmdletBinding()]
    param (
        [ValidatePattern('[a-zA-Z_]+')]
        [Parameter(Mandatory=$true)]
        [string] $Id,
        [Parameter(Mandatory=$true)][string[]] $Paths,
        [string[]] $PathsToComputeHash = @(),

        #configuration
        [string] $BucketName = $env:CI_CACHE_AWS_BUCKET_NAME,
        [string] $AwsAccessKeyId = $env:CI_CACHE_AWS_ACCESS_KEY_ID,
        [string] $AwsSecretAccessKey = $env:CI_CACHE_AWS_SECRET_ACCESS_KEY,
        [string] $AwsSessionToken = $env:CI_CACHE_AWS_SESSION_TOKEN,
        [int] $RepeatCount = 3
    )

    return Save-CacheInternal `
        -Id $Id `
        -Paths $Paths `
        -PathsToComputeHash $PathsToComputeHash `
        -TestHandler {
            param($key)
            $res = Get-S3Object -BucketName $BucketName -Key $key -AccessKey $AwsAccessKeyId -SecretKey $AwsSecretAccessKey -SessionToken $AwsSessionToken
            if (-not($res)) {
                throw "CI_CACHE_NOT_FOUND: $key does not exist in S3 bucket"
            }
        } `
        -SaveHandler {
            param($path)
            $key = Split-Path -Path $path -Leaf
            Write-S3Object -BucketName $BucketName -Key $key -File $path -AccessKey $AwsAccessKeyId -SecretKey $AwsSecretAccessKey -SessionToken $AwsSessionToken
        } `
        -RepeatCount $RepeatCount
}

function Test-AwsS3Cache {
    [CmdletBinding()]
    param (
        [ValidatePattern('[a-zA-Z_]+')]
        [Parameter(Mandatory=$true)]
        [string] $Id,
        [string[]] $PathsToComputeHash = @(),

        #configuration
        [string] $BucketName = $env:CI_CACHE_AWS_BUCKET_NAME,
        [string] $AwsAccessKeyId = $env:CI_CACHE_AWS_ACCESS_KEY_ID,
        [string] $AwsSecretAccessKey = $env:CI_CACHE_AWS_SECRET_ACCESS_KEY,
        [string] $AwsSessionToken = $env:CI_CACHE_AWS_SESSION_TOKEN,
        [int] $RepeatCount = 3
    )

    return Test-CacheInternal `
        -Id $Id `
        -PathsToComputeHash $PathsToComputeHash `
        -TestHandler {
            param($key)
            $res = Get-S3Object -BucketName $BucketName -Key $key -AccessKey $AwsAccessKeyId -SecretKey $AwsSecretAccessKey -SessionToken $AwsSessionToken
            if (-not($res)) {
                throw "CI_CACHE_NOT_FOUND: $key does not exist in S3 bucket"
            }
        } `
        -RepeatCount $RepeatCount
}

function Restore-AwsS3Cache {
    [CmdletBinding()]
    param (
        [ValidatePattern('[a-zA-Z_]+')]
        [Parameter(Mandatory=$true)]
        [string] $Id,
        [string[]] $PathsToComputeHash = @(),
        [string] $RestoreHashKey,
        [string] $OutputPath,

        #configuration
        [string] $BucketName = $env:CI_CACHE_AWS_BUCKET_NAME,
        [string] $AwsAccessKeyId = $env:CI_CACHE_AWS_ACCESS_KEY_ID,
        [string] $AwsSecretAccessKey = $env:CI_CACHE_AWS_SECRET_ACCESS_KEY,
        [string] $AwsSessionToken = $env:CI_CACHE_AWS_SESSION_TOKEN,
        [int] $RepeatCount = 3
    )

   return Restore-CacheInternal `
        -Id $Id `
        -PathsToComputeHash $PathsToComputeHash `
        -RestoreHashKey $RestoreHashKey `
        -OutputPath $OutputPath `
        -RestoreHandler {
            param($key)
            Read-S3Object -BucketName $BucketName -Key $key -File $key -AccessKey $AwsAccessKeyId -SecretKey $AwsSecretAccessKey -SessionToken $AwsSessionToken
        } `
        -RepeatCount $RepeatCount
}