97 lines
2.7 KiB
PowerShell
Executable File
97 lines
2.7 KiB
PowerShell
Executable File
#!/usr/bin/env pwsh
|
|
#Requires -Version 7.2
|
|
|
|
<#
|
|
.SYNOPSIS
|
|
Trigger the workflow that records the tests expected outputs, wait for its execution to finish,
|
|
then bring back those results locally.
|
|
|
|
.DESCRIPTION
|
|
This script is meant to run locally outside of Actions. It relies on `gh` and `git`.
|
|
#>
|
|
|
|
# Get the repository's path (ps1 extension on the script is required for PSScriptRoot to be available 🤦)
|
|
$repositoryPath = Resolve-Path (Join-Path $PSScriptRoot '..')
|
|
|
|
# Get the test_project's path
|
|
$testProjectsPath = Resolve-Path (Join-Path $PSScriptRoot '../test_projects')
|
|
|
|
#
|
|
# Utilities
|
|
#
|
|
|
|
# Run a command and validate it returned a 0 exit code
|
|
function Invoke-Command {
|
|
param (
|
|
[ScriptBlock] $Command
|
|
)
|
|
|
|
& $Command
|
|
if ($LASTEXITCODE -ne 0) {
|
|
Write-Error "Command failed: $Command"
|
|
throw
|
|
}
|
|
}
|
|
|
|
# Get the current git ref name
|
|
function Get-GitRef {
|
|
$commitId = Invoke-Command { & git -C $repositoryPath rev-parse --abbrev-ref HEAD }
|
|
$commitId.Trim()
|
|
}
|
|
|
|
# Create a temp folder and return its path
|
|
function New-TemporaryFolder {
|
|
$path = Join-Path ([System.IO.Path]::GetTempPath()) ([System.Guid]::NewGuid())
|
|
New-Item -ItemType 'Directory' -Path $path | Out-Null
|
|
$path
|
|
}
|
|
|
|
#
|
|
# Main
|
|
#
|
|
|
|
# Init
|
|
Set-StrictMode -version 'Latest'
|
|
$ErrorActionPreference = 'Stop'
|
|
|
|
# Get git ref name
|
|
$ref = Get-GitRef
|
|
|
|
# Run the workflow
|
|
Write-Host 'Queue workflow'
|
|
$workflow = 'record.yml'
|
|
Invoke-Command { & gh workflow run $workflow --ref $ref | Out-Null }
|
|
|
|
# Wait for a few seconds for the workflow to get created
|
|
Write-Host 'Wait a few seconds...'
|
|
Start-Sleep -Seconds 5
|
|
|
|
# Lookup the run id (it is not perfect because of the APIs...)
|
|
Write-Host 'Lookup run id'
|
|
$runId = Invoke-Command { & gh run list --workflow $workflow --branch $ref --limit 1 --json databaseId --jq '.[].databaseId' }
|
|
|
|
# Wait for the workflow to finish
|
|
Write-Host "Wait for workflow $runId to complete"
|
|
Invoke-Command { & gh run watch $runId --exit-status }
|
|
|
|
# Download the artifacts in a temp folder
|
|
Write-Host 'Download artifacts'
|
|
$tempFolder = New-TemporaryFolder
|
|
Invoke-Command { & gh run download $runId --dir $tempFolder }
|
|
|
|
# Iterate over the test projects
|
|
Get-ChildItem -Path $testProjectsPath -Directory | ForEach-Object {
|
|
# Construct the artifact path and make sure a matching artifact is found
|
|
$artifactPath = Join-Path $tempFolder $_.BaseName
|
|
if (Test-Path $artifactPath -PathType 'Container') {
|
|
# Copy artifact to the expected output folder
|
|
$destinationPath = Join-Path $testProjectsPath $_.BaseName '_expected'
|
|
Copy-Item -Path (Join-Path $artifactPath '*') -Destination $destinationPath -Recurse -Force | Out-Null
|
|
}
|
|
|
|
# Ignore test project
|
|
else {
|
|
Write-Warning "Unable to find artifact for test project $($_.BaseName)"
|
|
}
|
|
}
|