Search code examples
continuous-integrationappveyor

Deploy a specific project to NuGet with a matrix configuration


My appveyor.yml looks like below:

environment:
  matrix:
  - solution_name: Src/App1.sln
  - solution_name: Src/App2.sln

before_build:
- cmd: dotnet restore %solution_name%

build:
  project: '%solution_name%'
  publish_nuget: true

after_build:
  - dotnet pack Src\App1.csproj
   
deploy:
  - provider: NuGet
    api_key:
      secure: [my api key]
    on:
        branch: master
    artifact: /.*(\.|\.s)nupkg/

artifacts:
- path: Out\
  name: App1
- path: '**\*.nupkg'

It works well with one catch: it seems deploy twice during the build process. Below is part of the AppVeyor log:

Collecting artifacts...
Found artifact 'Out' matching 'Out' path
Found artifact 'Out\App1\Release\App1.6.0.3.nupkg' matching '**\*.nupkg' path
Uploading artifacts...
[1/2] App1.6.0.3.nupkg (164,127 bytes)...100%
[2/2] Out\App1\Release\App1.6.0.3.nupkg (164,127 bytes)...100%
Deploying using NuGet provider
Publishing App1.6.0.3.nupkg to https://www.nuget.org/api/v2/package...OK
Publishing App1.6.0.3.nupkg to https://www.nuget.org/api/v2/package...Skipped (A package with ID 'App1' and version '6.0.3' already exists and cannot be modified.)
No packages were pushed.

So I login NuGet.org and I can see App1.6.0.3 is published successfull. However, in the above log, the same package is published twice, hence the second publish is skipped, and end up with message "No packages we pushed." But actually there was one package pushed.

Maybe it is because I have a matrix configuration under environment section, so AppVeyor runs deploy twice? If so, how can tell AppVeyor to deploy only once?


Solution

  • After some experiments, I found a fix, that is removing publish_nuget: true under build section. This line will cause AppVeyor to create a nuget package, and dotnet pack Src\App1.csproj command under after_build section will create a nuget package, too. So there will be two identical .nupkg files generated in different location, and AppVeyor will find both files and push them to nuget server.

    Result:

    build:
      project: '%solution_name%'
    
    after_build:
      - dotnet pack Src\App1.csproj