-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbuild.fsx
More file actions
169 lines (139 loc) · 5.41 KB
/
build.fsx
File metadata and controls
169 lines (139 loc) · 5.41 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
#r "paket: groupref Build //"
// include Fake modules, see Fake modules section
open Fake.IO
open Fake.IO.FileSystemOperators
open Fake.IO.Globbing.Operators
open Fake.DotNet
open Fake.Core
open Fake.Api
open Markdig
open System.Xml
//Properties
let packageName = "Dnn.Resx"
let installDir = ".install"
let buildDir = "src/bin/debug"
let packageDir = installDir </> "package"
let deployDir = installDir </> "deploy"
let changeLogFile = "RELEASENOTES.md"
let manifestFile = (sprintf "%s.dnn" packageName )
let gitOwner = "scullman"
let gitName = packageName
[<RequireQualifiedAccess>]
module Xml =
let appendChild name (parent:XmlElement) =
let el = parent.OwnerDocument.CreateElement name
parent.AppendChild (el) :?> XmlElement
let withChild name innerText (parent:XmlElement) =
let el = parent.OwnerDocument.CreateElement name
el.InnerText <- innerText
parent.AppendChild(el) |> ignore
parent
let withOptionalChild name (innerText: string option) (parent:XmlElement) =
match innerText with
| None -> parent
| Some text -> withChild name text parent
let withAttribute name value (el:XmlElement) =
el.SetAttribute (name, value)
el
//Targets
Target.create "Clean" (fun _ ->
Shell.cleanDir installDir
Shell.cleanDir buildDir
Shell.cleanDir deployDir
Shell.cleanDir packageDir
)
// Default target
Target.create "Default" (fun _ ->
Trace.trace <| sprintf "FAKE %s" packageName
)
Target.create "AssemblyInfo" (fun _ ->
let changelog = changeLogFile |> Changelog.load
AssemblyInfoFile.createCSharp "src/Properties/AssemblyInfo.cs"
[ AssemblyInfo.Product packageName
AssemblyInfo.Description packageName
AssemblyInfo.Version changelog.LatestEntry.AssemblyVersion
AssemblyInfo.FileVersion changelog.LatestEntry.AssemblyVersion
]
)
let copyAssemblies folder =
!! (buildDir </> "*.dll")
|> Shell.copyTo folder
let buildProjects projects =
let silent (par:MSBuildParams) = {par with NoWarn =Some ["MSB3245"; "MSB3243"; "FS0025"]; Verbosity=Some Minimal }
projects
|> Seq.iter (fun p -> MSBuild.build silent p)
Target.create "BuildServices" (fun _->
!! "src/**/*.csproj"
|> buildProjects
)
Target.create "PackModule" (fun _ ->
let packAssemblies () =
copyAssemblies (packageDir </> "bin")
let packReleaseNotes () =
File.readAsString changeLogFile
|> Markdown.ToHtml
|> File.writeString true (packageDir </> "releasenotes.html")
let packManifest () =
let setVersion () =
let changelog = changeLogFile |> Changelog.load
let manifest = packageDir </> manifestFile
Xml.loadDoc manifest
|> Xml.replaceXPathAttribute "/dotnetnuke/packages/package" "version" changelog.LatestEntry.AssemblyVersion
|> Xml.saveDoc manifest
let addAssemblies () =
let manifest = packageDir </> manifestFile
Xml.loadDoc manifest
|> fun doc ->
let containerElement =
doc.SelectSingleNode("/dotnetnuke/packages/package/components") :?> XmlElement
|> Xml.appendChild "component"
|> Xml.withAttribute "type" "Assembly"
|> Xml.appendChild "assemblies"
!! (sprintf "%s/*.dll" buildDir)
|> Seq.iter (fun file ->
containerElement
|> Xml.appendChild "assembly"
|> Xml.withChild "name" (FileSystemInfo.ofPath file).Name
|> Xml.withChild "path" "bin"
|> Xml.withOptionalChild "version" (File.tryGetVersion file)
|> ignore )
doc
|> Xml.saveDoc manifest
Shell.copyFile packageDir manifestFile
setVersion()
addAssemblies()
let createModulePackage () =
let changelog = changeLogFile |> Changelog.load
!! (packageDir </> "**/*" )
|> Zip.filesAsSpecs packageDir
|> Zip.moveToFolder "/"
|> Zip.zipSpec (sprintf "%s\\%s-%s-install.zip" installDir packageName (changelog.LatestEntry.AssemblyVersion) )
packAssemblies()
packReleaseNotes()
packManifest()
createModulePackage ()
)
Target.create "GitHubRelease" (fun _ ->
let token =
match Environment.environVarOrDefault "github_token" "" with
| s when not (System.String.IsNullOrWhiteSpace s) -> s
| _ -> failwith "please set the github_token environment variable to a github personal access token with repro access."
let files = !! (installDir </> "*-install.zip")
let changelog = changeLogFile |> Changelog.load
let version = changelog.LatestEntry.AssemblyVersion
let notes = [| defaultArg changelog.LatestEntry.Description "[TBD]" |]
GitHub.createClientWithToken token
|> GitHub.draftNewRelease gitOwner gitName version true notes
|> GitHub.uploadFiles files
|> GitHub.publishDraft
|> Async.RunSynchronously)
open Fake.Core.TargetOperators
"AssemblyInfo"
==> "BuildServices"
"Clean"
==> "BuildServices"
==> "PackModule"
==> "Default"
==> "GitHubRelease"
// start build
Target.runOrDefault "Default"