453 строки
17 KiB
Plaintext
453 строки
17 KiB
Plaintext
#I @"src/packages/FAKE/tools"
|
|
#r "FakeLib.dll"
|
|
#r "System.Xml.Linq"
|
|
|
|
open System
|
|
open System.IO
|
|
open System.Text
|
|
open System.Configuration;
|
|
open Fake
|
|
open Fake.FileUtils
|
|
open Fake.TaskRunnerHelper
|
|
open Fake.ProcessHelper
|
|
|
|
cd __SOURCE_DIRECTORY__
|
|
|
|
//--------------------------------------------------------------------------------
|
|
// Information about the project for Nuget and Assembly info files
|
|
//--------------------------------------------------------------------------------
|
|
|
|
|
|
let product = "Akka.NET"
|
|
let authors = [ "Akka.NET Team" ]
|
|
let copyright = "Copyright © 2013-2015 Akka.NET Team"
|
|
let company = "Akka.NET Team"
|
|
let description = "Akka.NET is a port of the popular Java/Scala framework Akka to .NET"
|
|
let tags = ["akka";"actors";"actor";"model";"Akka";"concurrency"]
|
|
let configuration = "Release"
|
|
|
|
// Read release notes and version
|
|
|
|
let parsedRelease =
|
|
File.ReadLines "RELEASE_NOTES.md"
|
|
|> ReleaseNotesHelper.parseReleaseNotes
|
|
|
|
let envBuildNumber = System.Environment.GetEnvironmentVariable("BUILD_NUMBER")
|
|
let buildNumber = if String.IsNullOrWhiteSpace(envBuildNumber) then "0" else envBuildNumber
|
|
|
|
let version = parsedRelease.AssemblyVersion + "." + buildNumber
|
|
let preReleaseVersion = version + "-beta"
|
|
|
|
let isUnstableDocs = hasBuildParam "unstable"
|
|
let isPreRelease = hasBuildParam "nugetprerelease"
|
|
let release = if isPreRelease then ReleaseNotesHelper.ReleaseNotes.New(version, version + "-beta", parsedRelease.Notes) else parsedRelease
|
|
|
|
printfn "Assembly version: %s\nNuget version; %s\n" release.AssemblyVersion release.NugetVersion
|
|
//--------------------------------------------------------------------------------
|
|
// Directories
|
|
|
|
let binDir = "bin"
|
|
let testOutput = "TestResults"
|
|
|
|
let nugetDir = binDir @@ "nuget"
|
|
let workingDir = binDir @@ "build"
|
|
let libDir = workingDir @@ @"lib\net45\"
|
|
let nugetExe = FullName @"src\.nuget\nuget.exe"
|
|
let slnFile = "./src/Akka.Persistence.Cassandra.sln"
|
|
|
|
open Fake.RestorePackageHelper
|
|
Target "RestorePackages" (fun _ ->
|
|
printfn "Restoring packages for %s" slnFile
|
|
slnFile
|
|
|> RestoreMSSolutionPackages (fun p ->
|
|
{ p with
|
|
OutputPath = "./src/packages"
|
|
Retries = 4 })
|
|
)
|
|
|
|
//--------------------------------------------------------------------------------
|
|
// Clean build results
|
|
|
|
Target "Clean" <| fun _ ->
|
|
DeleteDir binDir
|
|
|
|
//--------------------------------------------------------------------------------
|
|
// Generate AssemblyInfo files with the version for release notes
|
|
|
|
open AssemblyInfoFile
|
|
|
|
Target "AssemblyInfo" <| fun _ ->
|
|
CreateCSharpAssemblyInfoWithConfig "src/SharedAssemblyInfo.cs" [
|
|
Attribute.Company company
|
|
Attribute.Copyright copyright
|
|
Attribute.Trademark ""
|
|
Attribute.Version version
|
|
Attribute.FileVersion version ] <| AssemblyInfoFileConfig(false)
|
|
|
|
|
|
//--------------------------------------------------------------------------------
|
|
// Build the solution
|
|
|
|
Target "Build" <| fun _ ->
|
|
|
|
!! slnFile
|
|
|> MSBuildRelease "" "Rebuild"
|
|
|> ignore
|
|
|
|
|
|
//--------------------------------------------------------------------------------
|
|
// Copy the build output to bin directory
|
|
//--------------------------------------------------------------------------------
|
|
|
|
Target "CopyOutput" <| fun _ ->
|
|
|
|
let copyOutput project =
|
|
let src = "src" @@ project @@ @"bin/Release/"
|
|
let dst = binDir @@ project
|
|
CopyDir dst src allFiles
|
|
[ "Akka.Persistence.Cassandra"
|
|
]
|
|
|> List.iter copyOutput
|
|
|
|
Target "BuildRelease" DoNothing
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------------------
|
|
// Tests targets
|
|
//--------------------------------------------------------------------------------
|
|
|
|
//--------------------------------------------------------------------------------
|
|
// Clean test output
|
|
|
|
Target "CleanTests" <| fun _ ->
|
|
DeleteDir testOutput
|
|
//--------------------------------------------------------------------------------
|
|
// Run tests
|
|
|
|
open Fake.Testing
|
|
Target "RunTests" <| fun _ ->
|
|
let xunitTestAssemblies = !! "src/**/bin/Release/*.Tests.dll"
|
|
|
|
mkdir testOutput
|
|
|
|
let xunitToolPath = findToolInSubPath "xunit.console.exe" "src/packages/FAKE/xunit.runner.console*/tools"
|
|
printfn "Using XUnit runner: %s" xunitToolPath
|
|
xUnit2
|
|
(fun p -> { p with HtmlOutputPath = Some(testOutput @@ "xunit.html")
|
|
Parallel = NoParallelization
|
|
ForceTeamCity = true
|
|
})
|
|
xunitTestAssemblies
|
|
|
|
Target "PrepAppConfig" <| fun _ ->
|
|
let ip = environVarOrNone "CONTAINER_IP"
|
|
match ip with
|
|
| Some ip ->
|
|
log ("Preparing app.config for connection to akka-cassandra-db docker container....")
|
|
log ("CONTAINER_IP=" + ip)
|
|
let appConfig = @"src/Akka.Persistence.Cassandra.Tests/bin/Release/Akka.Persistence.Cassandra.Tests.dll.config"
|
|
updateAppSetting "cassandraContactPoint" ip appConfig
|
|
| None -> failwith "CONTAINER_IP environment variable not set, check preceding container startup logs"
|
|
|
|
//--------------------------------------------------------------------------------
|
|
// Nuget targets
|
|
//--------------------------------------------------------------------------------
|
|
|
|
module Nuget =
|
|
// add Akka dependency for other projects
|
|
let getAkkaDependency project =
|
|
match project with
|
|
| _ -> []
|
|
|
|
// used to add -pre suffix to pre-release packages
|
|
let getProjectVersion project =
|
|
match project with
|
|
| "Akka.Cluster" -> preReleaseVersion
|
|
| persistence when persistence.StartsWith("Akka.Persistence") -> preReleaseVersion
|
|
| _ -> release.NugetVersion
|
|
|
|
open Nuget
|
|
open NuGet.Update
|
|
|
|
//--------------------------------------------------------------------------------
|
|
// Upgrade nuget package versions for dev and production
|
|
|
|
let updateNugetPackages _ =
|
|
printfn "Updating NuGet dependencies"
|
|
|
|
let getConfigFile preRelease =
|
|
match preRelease with
|
|
| true -> "src/.nuget/NuGet.Dev.Config"
|
|
| false -> "src/.nuget/NuGet.Config"
|
|
|
|
let getPackages project =
|
|
match project with
|
|
| "Akka.Persistence.Cassandra" -> ["Akka.Persistence";]
|
|
| "Akka.Persistence.Cassandra.Tests" -> ["Akka.Persistence.TestKit";]
|
|
| _ -> []
|
|
|
|
for projectFile in !! "src/**/*.csproj" do
|
|
printfn "Updating packages for %s" projectFile
|
|
let project = Path.GetFileNameWithoutExtension projectFile
|
|
let projectDir = Path.GetDirectoryName projectFile
|
|
let config = projectDir @@ "packages.config"
|
|
|
|
NugetUpdate
|
|
(fun p ->
|
|
{ p with
|
|
ConfigFile = Some (getConfigFile isPreRelease)
|
|
Prerelease = true
|
|
ToolPath = nugetExe
|
|
RepositoryPath = "src/Packages"
|
|
Ids = getPackages project
|
|
}) config
|
|
|
|
Target "UpdateDependencies" <| fun _ ->
|
|
printfn "Invoking updateNugetPackages"
|
|
updateNugetPackages()
|
|
//--------------------------------------------------------------------------------
|
|
// Clean nuget directory
|
|
|
|
Target "CleanNuget" <| fun _ ->
|
|
CleanDir nugetDir
|
|
|
|
//--------------------------------------------------------------------------------
|
|
// Pack nuget for all projects
|
|
// Publish to nuget.org if nugetkey is specified
|
|
|
|
let createNugetPackages _ =
|
|
let removeDir dir =
|
|
let del _ =
|
|
DeleteDir dir
|
|
not (directoryExists dir)
|
|
runWithRetries del 3 |> ignore
|
|
|
|
ensureDirectory nugetDir
|
|
for nuspec in !! "src/**/*.nuspec" do
|
|
printfn "Creating nuget packages for %s" nuspec
|
|
|
|
CleanDir workingDir
|
|
|
|
let project = Path.GetFileNameWithoutExtension nuspec
|
|
let projectDir = Path.GetDirectoryName nuspec
|
|
let projectFile = (!! (projectDir @@ project + ".*sproj")) |> Seq.head
|
|
let releaseDir = projectDir @@ @"bin\Release"
|
|
let packages = projectDir @@ "packages.config"
|
|
let packageDependencies = if (fileExists packages) then (getDependencies packages) else []
|
|
let dependencies = packageDependencies @ getAkkaDependency project
|
|
let releaseVersion = getProjectVersion project
|
|
|
|
let pack outputDir symbolPackage =
|
|
NuGetHelper.NuGet
|
|
(fun p ->
|
|
{ p with
|
|
Description = description
|
|
Authors = authors
|
|
Copyright = copyright
|
|
Project = project
|
|
Properties = ["Configuration", "Release"]
|
|
ReleaseNotes = release.Notes |> String.concat "\n"
|
|
Version = releaseVersion
|
|
Tags = tags |> String.concat " "
|
|
OutputPath = outputDir
|
|
WorkingDir = workingDir
|
|
SymbolPackage = symbolPackage
|
|
Dependencies = dependencies })
|
|
nuspec
|
|
|
|
// Copy dll, pdb and xml to libdir = workingDir/lib/net45/
|
|
ensureDirectory libDir
|
|
!! (releaseDir @@ project + ".dll")
|
|
++ (releaseDir @@ project + ".pdb")
|
|
++ (releaseDir @@ project + ".xml")
|
|
++ (releaseDir @@ project + ".ExternalAnnotations.xml")
|
|
|> CopyFiles libDir
|
|
|
|
// Copy all src-files (.cs and .fs files) to workingDir/src
|
|
let nugetSrcDir = workingDir @@ @"src/"
|
|
// CreateDir nugetSrcDir
|
|
|
|
let isCs = hasExt ".cs"
|
|
let isFs = hasExt ".fs"
|
|
let isAssemblyInfo f = (filename f).Contains("AssemblyInfo")
|
|
let isSrc f = (isCs f || isFs f) && not (isAssemblyInfo f)
|
|
CopyDir nugetSrcDir projectDir isSrc
|
|
|
|
//Remove workingDir/src/obj and workingDir/src/bin
|
|
removeDir (nugetSrcDir @@ "obj")
|
|
removeDir (nugetSrcDir @@ "bin")
|
|
|
|
// Create both normal nuget package and symbols nuget package.
|
|
// Uses the files we copied to workingDir and outputs to nugetdir
|
|
pack nugetDir NugetSymbolPackage.Nuspec
|
|
|
|
|
|
let publishNugetPackages _ =
|
|
let rec publishPackage url accessKey trialsLeft packageFile =
|
|
let tracing = enableProcessTracing
|
|
enableProcessTracing <- false
|
|
let args p =
|
|
match p with
|
|
| (pack, key, "") -> sprintf "push \"%s\" %s" pack key
|
|
| (pack, key, url) -> sprintf "push \"%s\" %s -source %s" pack key url
|
|
|
|
tracefn "Pushing %s Attempts left: %d" (FullName packageFile) trialsLeft
|
|
try
|
|
let result = ExecProcess (fun info ->
|
|
info.FileName <- nugetExe
|
|
info.WorkingDirectory <- (Path.GetDirectoryName (FullName packageFile))
|
|
info.Arguments <- args (packageFile, accessKey,url)) (System.TimeSpan.FromMinutes 1.0)
|
|
enableProcessTracing <- tracing
|
|
if result <> 0 then failwithf "Error during NuGet symbol push. %s %s" nugetExe (args (packageFile, accessKey,url))
|
|
with exn ->
|
|
if (trialsLeft > 0) then (publishPackage url accessKey (trialsLeft-1) packageFile)
|
|
else raise exn
|
|
let shouldPushNugetPackages = hasBuildParam "nugetkey"
|
|
let shouldPushSymbolsPackages = (hasBuildParam "symbolspublishurl") && (hasBuildParam "symbolskey")
|
|
|
|
if (shouldPushNugetPackages || shouldPushSymbolsPackages) then
|
|
printfn "Pushing nuget packages"
|
|
if shouldPushNugetPackages then
|
|
let normalPackages=
|
|
!! (nugetDir @@ "*.nupkg")
|
|
-- (nugetDir @@ "*.symbols.nupkg") |> Seq.sortBy(fun x -> x.ToLower())
|
|
for package in normalPackages do
|
|
publishPackage (getBuildParamOrDefault "nugetpublishurl" "") (getBuildParam "nugetkey") 3 package
|
|
|
|
if shouldPushSymbolsPackages then
|
|
let symbolPackages= !! (nugetDir @@ "*.symbols.nupkg") |> Seq.sortBy(fun x -> x.ToLower())
|
|
for package in symbolPackages do
|
|
publishPackage (getBuildParam "symbolspublishurl") (getBuildParam "symbolskey") 3 package
|
|
|
|
|
|
Target "Nuget" <| fun _ ->
|
|
createNugetPackages()
|
|
publishNugetPackages()
|
|
|
|
Target "CreateNuget" <| fun _ ->
|
|
createNugetPackages()
|
|
|
|
Target "PublishNuget" <| fun _ ->
|
|
publishNugetPackages()
|
|
|
|
|
|
|
|
//--------------------------------------------------------------------------------
|
|
// Help
|
|
//--------------------------------------------------------------------------------
|
|
|
|
Target "Help" <| fun _ ->
|
|
List.iter printfn [
|
|
"usage:"
|
|
"build [target]"
|
|
""
|
|
" Targets for building:"
|
|
" * Build Builds"
|
|
" * Nuget Create and optionally publish nugets packages"
|
|
" * RunTests Runs tests"
|
|
" * All Builds, run tests, creates and optionally publish nuget packages"
|
|
""
|
|
" Other Targets"
|
|
" * Help Display this help"
|
|
" * HelpNuget Display help about creating and pushing nuget packages"
|
|
" * HelpDocs Display help about creating and pushing API docs"
|
|
""]
|
|
|
|
Target "HelpNuget" <| fun _ ->
|
|
List.iter printfn [
|
|
"usage: "
|
|
"build Nuget [nugetkey=<key> [nugetpublishurl=<url>]] "
|
|
" [symbolskey=<key> symbolspublishurl=<url>] "
|
|
" [nugetprerelease=<prefix>]"
|
|
""
|
|
"Arguments for Nuget target:"
|
|
" nugetprerelease=<prefix> Creates a pre-release package."
|
|
" The version will be version-prefix<date>"
|
|
" Example: nugetprerelease=dev =>"
|
|
" 0.6.3-dev1408191917"
|
|
""
|
|
"In order to publish a nuget package, keys must be specified."
|
|
"If a key is not specified the nuget packages will only be created on disk"
|
|
"After a build you can find them in bin/nuget"
|
|
""
|
|
"For pushing nuget packages to nuget.org and symbols to symbolsource.org"
|
|
"you need to specify nugetkey=<key>"
|
|
" build Nuget nugetKey=<key for nuget.org>"
|
|
""
|
|
"For pushing the ordinary nuget packages to another place than nuget.org specify the url"
|
|
" nugetkey=<key> nugetpublishurl=<url> "
|
|
""
|
|
"For pushing symbols packages specify:"
|
|
" symbolskey=<key> symbolspublishurl=<url> "
|
|
""
|
|
"Examples:"
|
|
" build Nuget Build nuget packages to the bin/nuget folder"
|
|
""
|
|
" build Nuget nugetprerelease=dev Build pre-release nuget packages"
|
|
""
|
|
" build Nuget nugetkey=123 Build and publish to nuget.org and symbolsource.org"
|
|
""
|
|
" build Nuget nugetprerelease=dev nugetkey=123 nugetpublishurl=http://abc"
|
|
" symbolskey=456 symbolspublishurl=http://xyz"
|
|
" Build and publish pre-release nuget packages to http://abc"
|
|
" and symbols packages to http://xyz"
|
|
""]
|
|
|
|
Target "HelpDocs" <| fun _ ->
|
|
List.iter printfn [
|
|
"usage: "
|
|
"build Docs"
|
|
"Just builds the API docs for Akka.NET locally. Does not attempt to publish."
|
|
""
|
|
"build PublishDocs azureKey=<key> "
|
|
" azureUrl=<url> "
|
|
" [unstable=true]"
|
|
""
|
|
"Arguments for PublishDocs target:"
|
|
" azureKey=<key> Azure blob storage key."
|
|
" Used to authenticate to the storage account."
|
|
""
|
|
" azureUrl=<url> Base URL for Azure storage container."
|
|
" FAKE will automatically set container"
|
|
" names based on build parameters."
|
|
""
|
|
" [unstable=true] Indicates that we'll publish to an Azure"
|
|
" container named 'unstable'. If this param"
|
|
" is not present we'll publish to containers"
|
|
" 'stable' and the 'release.version'"
|
|
""
|
|
"In order to publish documentation all of these values must be provided."
|
|
"Examples:"
|
|
" build PublishDocs azureKey=1s9HSAHA+..."
|
|
" azureUrl=http://fooaccount.blob.core.windows.net/docs"
|
|
" Build and publish docs to http://fooaccount.blob.core.windows.net/docs/stable"
|
|
" and http://fooaccount.blob.core.windows.net/docs/{release.version}"
|
|
""
|
|
" build PublishDocs azureKey=1s9HSAHA+..."
|
|
" azureUrl=http://fooaccount.blob.core.windows.net/docs"
|
|
" unstable=true"
|
|
" Build and publish docs to http://fooaccount.blob.core.windows.net/docs/unstable"
|
|
""]
|
|
|
|
//--------------------------------------------------------------------------------
|
|
// Target dependencies
|
|
//--------------------------------------------------------------------------------
|
|
|
|
// build dependencies
|
|
"Clean" ==> "AssemblyInfo" ==> "RestorePackages" ==> "Build" ==> "CopyOutput" ==> "BuildRelease"
|
|
|
|
// tests dependencies
|
|
"CleanTests" ==> "PrepAppConfig" ==> "RunTests"
|
|
|
|
// nuget dependencies
|
|
"CleanNuget" ==> "CreateNuget"
|
|
"CleanNuget" ==> "BuildRelease" ==> "Nuget"
|
|
|
|
Target "All" DoNothing
|
|
"BuildRelease" ==> "All"
|
|
"RunTests" ==> "All"
|
|
"Nuget" ==> "All"
|
|
|
|
RunTargetOrDefault "Help"
|