How do I deploy nuget packages in Travis CI?

After much fiddling and experimentation, I finally found a solution.

.travis.yml

language: csharp
solution: TreasureGen.sln
install:
  - nuget restore TreasureGen.sln
  - nuget install NUnit.Runners -OutputDirectory testrunner
script:
  - xbuild TreasureGen.sln /p:TargetFrameworkVersion="v4.5" /p:Configuration=Stress
  - mono ./testrunner/NUnit.ConsoleRunner.*/tools/nunit3-console.exe ./TreasureGen.Tests.Unit/bin/Stress/TreasureGen.Tests.Unit.dll
  - mono ./testrunner/NUnit.ConsoleRunner.*/tools/nunit3-console.exe ./TreasureGen.Tests.Integration.IoC/bin/Stress/TreasureGen.Tests.Integration.IoC.dll
  - mono ./testrunner/NUnit.ConsoleRunner.*/tools/nunit3-console.exe ./TreasureGen.Tests.Integration.Tables/bin/Stress/TreasureGen.Tests.Integration.Tables.dll
  - mono ./testrunner/NUnit.ConsoleRunner.*/tools/nunit3-console.exe ./TreasureGen.Tests.Integration.Stress/bin/Stress/TreasureGen.Tests.Integration.Stress.dll
deploy:
  skip_cleanup: true
  provider: script
  script: chmod +x ./deploy/deploy.sh && ./deploy/deploy.sh $NUGET_API_KEY $NUGET_SOURCE
  on:
    branch: master

deploy.sh

ApiKey=$1
Source=$2

nuget pack ./TreasureGen/TreasureGen.nuspec -Verbosity detailed
nuget pack ./TreasureGen.Domain/TreasureGen.Domain.nuspec -Verbosity detailed

nuget push ./DnDGen.TreasureGen.*.nupkg -Verbosity detailed -ApiKey $ApiKey -Source $Source
nuget push ./DnDGen.TreasureGen.Domain.*.nupkg -Verbosity detailed -ApiKey $ApiKey -Source $Source

Here are some of the key things to remember:

  1. Do not forget the skip_cleanup: true - this allows you to reuse your previous build command results for your nuget package
  2. The chmod +x ./deploy/deploy.sh allows for the script to be executable
  3. Place your API Key and Source as Travis environment variables. Especially for the API Key, make sure they are marked to not show in the output
  4. Your build may differ (not using nunit for tests, only 1 package to publish, etc.), but the deployment process should be similar.

Accepted answer didn't work for me (I don't know why). Following is what worked.

language: csharp
solution: [SolutionName].sln
install:
  - curl -L -o nuget.exe https://dist.nuget.org/win-x86-commandline/latest/nuget.exe
  - mono nuget.exe restore [SolutionName].sln
script:
  - xbuild /p:Configuration=Release [SolutionName].sln
  - mono nuget.exe pack ./[NuspecName].nuspec
  - mono nuget.exe setApiKey $NUGET_API_KEY -Source $NUGET_SOURCE -Verbosity quiet
  - mono nuget.exe push [SolutionName].*.nupkg -Source $NUGET_SOURCE

$NUGET_SOURCE, $NUGET_API_KEY are environment variables defined in Travis.


My .travis.yml is as below, it deploys correctly to nuget and only does the deploy from master branch. The NUGET_API environment variable is setup to only apply to master branch and not be visible in the build.

language: csharp
mono: none
dotnet: 3.1
before_install:
- sudo apt-get -y install libpam0g-dev
install:
- dotnet restore
script:
- dotnet build -c Release
after_success:
- ./test/setup_test_account.sh
- sudo dotnet test test/Npam.Tests/Npam.Tests.csproj
before_deploy:
- dotnet pack -c Release
deploy:
  skip_cleanup: true
  provider: script
  script: dotnet nuget push ./src/Npam/bin/Release/Npam.*.nupkg  -k $NUGET_API -s https://api.nuget.org/v3/index.json
  on:
    branch: master

https://github.com/CamW/npam/blob/master/.travis.yml