diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 000000000..9ebaa5259 --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,55 @@ +# http://www.appveyor.com/docs/appveyor-yml + +#---------------------------------# +# general configuration # +#---------------------------------# + +# branches to build +branches: + + # blacklist + except: + - gh-pages + +#---------------------------------# +# environment configuration # +#---------------------------------# + +# Operating system (build VM template) +os: Windows Server 2012 + +# this is how to allow failing jobs in the matrix +matrix: + fast_finish: true # set this flag to immediately finish build once one of the jobs fails. + +#---------------------------------# +# build configuration # +#---------------------------------# + +# to run your custom scripts instead of automatic MSBuild +build_script: + - ps: Import-Module .\build\psake.psm1 + - ps: Invoke-Psake .\build\build.ps1 -properties @{"BuildNumber"=$env:APPVEYOR_BUILD_NUMBER} + +#---------------------------------# +# tests configuration # +#---------------------------------# + +# to disable automatic tests (they're included in the build process) +test: off + +#---------------------------------# +# artifacts configuration # +#---------------------------------# + +artifacts: + - path: build\_BuildOutput\NuGets\*.nupkg + +#---------------------------------# +# global handlers # +#---------------------------------# + +# on successful build +on_success: + - ps: Import-Module .\build\psake.psm1 + - ps: Invoke-Psake .\build\build.ps1 Publish-Nuget -properties @{"NugetApiKey"=$env:APIKEY;"NugetSource"=$env:SOURCE} diff --git a/build/build.ps1 b/build/build.ps1 index f4dad22c3..62cb65435 100644 --- a/build/build.ps1 +++ b/build/build.ps1 @@ -1,7 +1,14 @@ Properties { + # call nuget.bat with these values as parameters + $NugetApiKey = $null + $NugetSource = $null + + # see appveyor.yml for usage + $BuildNumber = $null + # Input and output paths $BUILD_PATH = Resolve-Path "." - $SRC_PATH = Resolve-Path "..\src" + $SRC_PATH = Join-Path $BUILD_PATH "..\src" $PLUGINS_PATH = Join-Path $SRC_PATH "Plugins\ImageProcessor" $NUSPECS_PATH = Join-Path $BUILD_PATH "NuSpecs" $BIN_PATH = Join-Path $BUILD_PATH "_BuildOutput" @@ -16,7 +23,8 @@ Properties { $NUNITREPORT_EXE = Join-Path $BUILD_PATH "tools\NUnitHTMLReportGenerator.exe" # list of projects - [xml]$PROJECTS = Get-Content ".\build.xml" + $PROJECTS_PATH = (Join-Path $BUILD_PATH "build.xml") + [xml]$PROJECTS = Get-Content $PROJECTS_PATH $TestProjects = @( "ImageProcessor.UnitTests", @@ -27,7 +35,7 @@ Properties { Framework "4.0x86" FormatTaskName "-------- {0} --------" -task default -depends Cleanup-Binaries, Build-Solution, Run-Tests, Generate-Package +task default -depends Cleanup-Binaries, Set-VersionNumber, Build-Solution, Run-Tests, Generate-Package # cleans up the binaries output folder task Cleanup-Binaries { @@ -45,8 +53,22 @@ task Cleanup-Binaries { } } +# sets the version number from the build number in the build.xml file +task Set-VersionNumber { + if ($BuildNumber -eq $null -or $BuildNumber -eq "") { + return + } + + $PROJECTS.projects.project | % { + if ($_.version -match "([\d+\.]*)[\d+|\*]") { # get numbers of current version except last one + $_.version = "$($Matches[1])$BuildNumber" + } + } + $PROJECTS.Save($PROJECTS_PATH) +} + # builds the solutions -task Build-Solution -depends Cleanup-Binaries { +task Build-Solution -depends Cleanup-Binaries, Set-VersionNumber { Write-Host "Building projects" # build the projects @@ -87,7 +109,6 @@ task Build-Tests -depends Cleanup-Binaries { msbuild (Join-Path $SRC_PATH "$_\$_.csproj") /t:Build /p:Configuration=Release /p:Platform="AnyCPU" /p:Warnings=true /clp:WarningsOnly /clp:ErrorsOnly /v:Normal /nologo } } - } # runs the unit tests @@ -128,7 +149,7 @@ task Run-Coverage -depends Build-Tests { } # generates a Nuget package -task Generate-Package -depends Build-Solution { +task Generate-Package -depends Set-VersionNumber, Build-Solution { Write-Host "Generating Nuget packages for each project" # Nuget doesn't create the output dir automatically... @@ -146,11 +167,30 @@ task Generate-Package -depends Build-Solution { $nuspec_contents.package.metadata.version = $_.version $nuspec_contents.Save($nuspec_local_path) + if ((-not (Test-Path $nuspec_local_path)) -or (-not (Test-Path $NUGET_OUTPUT))) { + throw New-Object [System.IO.FileNotFoundException] "The file $nuspec_local_path or $NUGET_OUTPUT could not be found" + } + # pack the nuget & $NUGET_EXE Pack $nuspec_local_path -OutputDirectory $NUGET_OUTPUT } } +# publishes the nuget on a feed +task Publish-Nuget { + if ($NugetApiKey -eq $null -or $NugetApiKey -eq "") { + throw New-Object [System.ArgumentException] "You must provide an API key as parameter: 'Invoke-psake Publish-Nuget -properties @{`"NugetApiKey`"=`"YOURAPIKEY`"}' ; or add a APIKEY environment variable to AppVeyor" + } + + Get-ChildItem $NUGET_OUTPUT -Filter "*.nugpkg" | % { + if ($NugetSource -eq $null -or $NugetSource -eq "") { + & $NUGET_EXE push $_ -ApiKey $apikey -Source $NugetSource + } else { + & $NUGET_EXE push $_ -ApiKey $apikey + } + } +} + # updates the AssemblyInfo file with the specified version # http://www.luisrocha.net/2009/11/setting-assembly-version-with-windows.html function Update-AssemblyInfo ([string]$file, [string] $version) { diff --git a/build/build.xml b/build/build.xml index 98376c30b..40409b732 100644 --- a/build/build.xml +++ b/build/build.xml @@ -20,7 +20,7 @@ ImageProcessor Web.config sample 2.0.0.0 - ImageProcessor.Web.nuspec + ImageProcessor.Web.Config.nuspec