PowerShellForGitHub icon indicating copy to clipboard operation
PowerShellForGitHub copied to clipboard

Feature Request: Artifacts API

Open JustinGrote opened this issue 4 years ago • 2 comments

Feature Idea Summary

Implement the artifacts API for Github Actions primarily to download artifacts. This is useful for grabbing commit builds, etc. quickly using scripts, or updating a test to the latest commit

Feature Idea Additional Details

https://docs.github.com/en/rest/reference/actions#artifacts Conventions would match other cmdlets. Of primary interest are list, get, download

Requested Assignment

If tagged as up-for-grabs I will attempt to implement this.

JustinGrote avatar Jan 27 '21 03:01 JustinGrote

Thanks for the request, @JustinGrote! The end goal is to fully support the entire API surface in this module. The only limiting factor has been time. You are more then welcome to begin work on this part of the API if it interests you. Just please respond back to let me know you are starting work on it so that I can change the tags to prevent duplicated efforts from anyone else seeing them.

HowardWolosky avatar Jan 27 '21 16:01 HowardWolosky

A basic POC, obviously it needs to be boilerplated out to the format used by the other functions

function get-GHWorkflow {
    param(
        [ValidateNotNullOrEmpty()]$User = 'twpayne',
        [ValidateNotNullOrEmpty()]$Repository = 'chezmoi',
        [uri]$Uri = 'https://api.github.com/repos'
    )

    (Invoke-GHRestMethod -Method Get -UriFragment "$uri/$User/$Repository/actions/workflows").workflows
}

function get-GHWorkflowRun {
    param(
        [PSObject][Parameter(ValueFromPipeline)]$Workflow,
        [Switch]$Successful
    )
    
    process {
        $irmParams = @{
            UriFragment     = $Workflow.url + '/runs'
            Method          = 'GET'
        }
        if ($Successful) { $irmParams.Body = @{status = 'success'} }
        (Invoke-GHRestMethod @irmParams).workflow_runs
    }
}

function get-GHWorkflowArtifactUrl {
    param(
        [PSObject][Parameter(ValueFromPipeline)]$Run,
        [Switch]$Successful
    )
    
    process {
        $irmParams = @{
            UriFragment     = $Run.artifacts_url
            Method = 'GET'
        }
        $artifacts = (Invoke-GHRestMethod @irmParams).artifacts
        $baseUri = 'https://github.com/twpayne/chezmoi/suites/' + $Run.check_suite_id + '/artifacts/'
        
        $artifacts.foreach{
            $PSItem | FL | out-string | WRite-Host -fore magenta
            [PSCustomObject][ordered]@{
                Name = $PSItem.name
                Uri = [String]($baseUri + $PSItem.id)
            }
        }
    }
}

function Get-GHLatestArtifact {
    param(
        #Name of the workflow
        [Parameter(Mandatory)]$Name
    )

    Get-GHWorkflow 
    | Where-Object name -EQ $Name 
    | get-GHWorkflowRun -Successful 
    | Sort-Object created_at -Descending
    | Select-Object -First 1
    | get-GHWorkflowArtifactUrl
}

Example result of Get-GHLatestArtifact

Name                      Uri
----                      ---
chezmoi2-linux-amd64      https://github.com/twpayne/chezmoi/suites/1905681601/artifacts/37406762
chezmoi2-linux-musl-amd64 https://github.com/twpayne/chezmoi/suites/1905681601/artifacts/37406763
chezmoi2-macos-amd64      https://github.com/twpayne/chezmoi/suites/1905681601/artifacts/37406764
chezmoi2-windows-amd64    https://github.com/twpayne/chezmoi/suites/1905681601/artifacts/37406765
chezmoi-linux-amd64       https://github.com/twpayne/chezmoi/suites/1905681601/artifacts/37406766
chezmoi-linux-musl-amd64  https://github.com/twpayne/chezmoi/suites/1905681601/artifacts/37406767
chezmoi-macos-amd64       https://github.com/twpayne/chezmoi/suites/1905681601/artifacts/37406768
chezmoi-windows-amd64     https://github.com/twpayne/chezmoi/suites/1905681601/artifacts/37406769

JustinGrote avatar Jan 28 '21 00:01 JustinGrote