Сделать так, чтобы Powershell автоматически проверял Appveyor на наличие более свежих артефактов? - PullRequest
0 голосов
/ 21 февраля 2019

Проблема: В настоящее время я использую сценарий PS, который загружает последний артефакт сборки по ссылке Appveyor, а затем извлекает этот артефакт поверх существующей программы при вызове функции независимо от того, была лиобновлять или нет .

Я использую это, чтобы поддерживать несколько проектов с открытым исходным кодом на сервере в актуальном состоянии для тестирования, и мне неудобно продолжать использовать эту же функцию для слепой загрузки и установки «обновлений» при «обновлении»"может и не быть более новой версией.Вот пример того, что я использую:

function Update-program
{
    Clear-Host
    Write-Host "Updating Program..."
    Write-Host " "
    if ( -not (Test-Path "$downloadLocation\Here" -PathType Container))
    {
        New-Item -Path "$downloadLocation\Here"  -ItemType directory -Force
    }
    $apiUrl = 'https://ci.appveyor.com/api'
    $headers = @{
      "Authorization" = "Bearer $token"
      "Content-type" = "application/json"
    }
    $accountName = 'Hello'
    $projectSlug = 'World'

    # get project with last build details
    $project = Invoke-RestMethod -Method Get -Uri "$apiUrl/projects/$accountName/$projectSlug" -Headers $headers

    # we assume here that build has a single job
    # get this job id
    $jobId = $project.build.jobs[0].jobId

    # get job artifacts (just to see what we've got)
    $artifacts = Invoke-RestMethod -Method Get -Uri "$apiUrl/buildjobs/$jobId/artifacts" -Headers $headers

    # here we just take the first artifact, but you could specify its file name
    # $artifactFileName = 'MyWebApp.zip'
    $artifactFileName = $artifacts[0].fileName

    # artifact will be downloaded as
    $localArtifactPath = "$downloadLocation\$artifactFileName"

    # download artifact
    # -OutFile - is local file name where artifact will be downloaded into
    # the Headers in this call should only contain the bearer token, and no Content-type, otherwise it will fail!
    Invoke-RestMethod -Method Get -Uri "$apiUrl/buildjobs/$jobId/artifacts/$artifactFileName" `
    -OutFile $localArtifactPath -Headers @{ "Authorization" = "Bearer $token" }
    Clear-Host
    Write-Host "Download complete, extracting..."
    Write-Host " "


    Expand-Archive -LiteralPath "$downloadLocation\$artifactFileName" -DestinationPath "$ProgramDir" -Force
    Clear-Host
    Write-Host "Program updated"
    Write-Host " "

Желаемое решение: Я бы хотел, чтобы скрипт автоматически проверял Appveyor на наличие нового артефакта (возможно,путем сравнения имен артефактов или номеров версий сборки) в настраиваемом интервале времени.Если артефакт действительно НОВЫЙ, чем загруженная в данный момент версия, он загрузит и извлечет этот артефакт поверх существующей программы.Если он не новее, он сообщит, что «более новая версия недоступна».

Возможные препятствия: Я не уверен, поддерживает ли API Appveyor это или нет.Я не смог найти никаких убедительных доказательств во время моего исследования, но я был бы удивлен, если бы он не поддерживал что-то подобное.

...