仅当矩阵中的所有构建都成功时,才如何从Appveyor构建中推送NuGet软件包?

时间:2018-07-27 08:24:02

标签: appveyor

我有一个库,其源代码托管在GitHub上,并配置为基于Appveyor CI(例如https://github.com/vostok/temp-library/blob/master/appveyor.yml)。

我想在不同的平台上构建和测试该库:

  • Windows上的.NET Framework
  • Windows上的.NET Core
  • Ubuntu上的.NET Core

自然,我将配置一个构建矩阵以在不同平台上构建。但是,如果所有平台上的所有构建都成功了,我想构建并推送一个NuGet包 only

如何在Appveyor上配置类似的内容?

1 个答案:

答案 0 :(得分:0)

要在Ubuntu和Windows上运行测试,还需要先进行构建。因此,您需要做的就是让Windows作业等待其他人(我不确定哪个Windows作业,因为您有两个,但我相信您知道)。

因此,要使一个矩阵作业等待其他任务,您需要执行一些脚本编写。请将此示例用作参考。

write-host "Waiting for other jobs to complete"

$headers = @{
  "Authorization" = "Bearer $env:ApiKey"
  "Content-type" = "application/json"
}

[datetime]$stop = ([datetime]::Now).AddMinutes($env:TimeOutMins)
[bool]$success = $false

while(!$success -and ([datetime]::Now) -lt $stop) {
    $project = Invoke-RestMethod -Uri "https://ci.appveyor.com/api/projects/$env:APPVEYOR_ACCOUNT_NAME/$env:APPVEYOR_PROJECT_SLUG" -Headers $headers -Method GET
    $success = $true  
    $project.build.jobs | foreach-object {if (($_.jobId -ne $env:APPVEYOR_JOB_ID) -and ($_.status -ne "success")) {$success = $false}; $_.jobId; $_.status}
    if (!$success) {Start-sleep 5}
}

if (!$success) {throw "Test jobs were not finished in $env:TimeOutMins minutes"}

如果您有多个并发作业,则可以使其等待更长的时间。如果只有一个并发作业,请减少等待时间(因为上一个作业开始时有一个并发作业,而其他作业已经以一种或另一种方式完成了

要使此脚本和Nuget部署仅在特定的Windows作业中运行,specialize matrix job configuration

$env:ApiKey,您到达https://ci.appveyor.com/api-token,并存储为secure variable