-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathbuild.fsx
149 lines (117 loc) · 4.11 KB
/
build.fsx
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
#r "paket: groupref build //"
#load "./.fake/build.fsx/intellisense.fsx"
#if !FAKE
#r "netstandard"
#r "Facades/netstandard" // https://github.com/ionide/ionide-vscode-fsharp/issues/839#issuecomment-396296095
#endif
open System
open Fake.Core
open Fake.DotNet
open Fake.IO
Target.initEnvironment ()
let serverPath = Path.getFullName "./src/Server"
let clientPath = Path.getFullName "./src/Client"
let clientDeployPath = Path.combine clientPath "deploy"
let deployDir = Path.getFullName "./deploy"
let tryGetEnv = System.Environment.GetEnvironmentVariable >> function null | "" -> None | x -> Some x
let tag = "BUILD_ID" |> tryGetEnv |> Option.defaultValue "latest"
let release = ReleaseNotes.load "RELEASE_NOTES.md"
let platformTool tool winTool =
let tool = if Environment.isUnix then tool else winTool
match ProcessUtils.tryFindFileOnPath tool with
| Some t -> t
| _ ->
let errorMsg =
tool + " was not found in path. " +
"Please install it and make sure it's available from your path. " +
"See https://safe-stack.github.io/docs/quickstart/#install-pre-requisites for more info"
failwith errorMsg
let nodeTool = platformTool "node" "node.exe"
let yarnTool = platformTool "yarn" "yarn.cmd"
let runTool cmd args workingDir =
let arguments = args |> String.split ' ' |> Arguments.OfArgs
Command.RawCommand (cmd, arguments)
|> CreateProcess.fromCommand
|> CreateProcess.withWorkingDirectory workingDir
|> CreateProcess.ensureExitCode
|> Proc.run
|> ignore
let runDotNet cmd workingDir =
let result =
DotNet.exec (DotNet.Options.withWorkingDirectory workingDir) cmd ""
if result.ExitCode <> 0 then failwithf "'dotnet %s' failed in %s" cmd workingDir
let openBrowser url =
//https://github.com/dotnet/corefx/issues/10361
Command.ShellCommand url
|> CreateProcess.fromCommand
|> CreateProcess.ensureExitCodeWithMessage "opening browser failed"
|> Proc.run
|> ignore
Target.create "Clean" (fun _ ->
[ deployDir
clientDeployPath ]
|> Shell.cleanDirs
)
Target.create "InstallClient" (fun _ ->
printfn "Node version:"
runTool nodeTool "--version" __SOURCE_DIRECTORY__
printfn "Yarn version:"
runTool yarnTool "--version" __SOURCE_DIRECTORY__
runTool yarnTool "install --frozen-lockfile" __SOURCE_DIRECTORY__
)
Target.create "Build" (fun _ ->
runDotNet "build" serverPath
// Shell.regexReplaceInFileWithEncoding
// "let app = \".+\""
// ("let app = \"" + release.NugetVersion + "\"")
// System.Text.Encoding.UTF8
// (Path.combine clientPath "Version.fs")
runTool yarnTool "webpack-cli -p" __SOURCE_DIRECTORY__
)
Target.create "Run" (fun _ ->
let server = async {
runDotNet "watch run" serverPath
}
let client = async {
runTool yarnTool "webpack-dev-server" __SOURCE_DIRECTORY__
}
let browser = async {
do! Async.Sleep 5000
openBrowser "http://localhost:8080"
}
let vsCodeSession = Environment.hasEnvironVar "vsCodeSession"
let safeClientOnly = Environment.hasEnvironVar "safeClientOnly"
let tasks =
[ if not safeClientOnly then yield server
yield client
if not vsCodeSession then yield browser ]
tasks
|> Async.Parallel
|> Async.RunSynchronously
|> ignore
)
let buildDocker tag =
let args = sprintf "build -t %s ." tag
runTool "docker" args __SOURCE_DIRECTORY__
Target.create "Bundle" (fun _ ->
let serverDir = Path.combine deployDir "Server"
let clientDir = Path.combine deployDir "Client"
let publicDir = Path.combine clientDir "public"
let publishArgs = sprintf "publish -c Release -o \"%s\"" serverDir
runDotNet publishArgs serverPath
Shell.copyDir publicDir clientDeployPath FileFilter.allFiles
)
let dockerFullName = sprintf "chestercodes/games-room:%s" tag
Target.create "Docker" (fun _ ->
buildDocker dockerFullName
)
open Fake.Core.TargetOperators
"Clean"
==> "InstallClient"
==> "Build"
==> "Bundle"
==> "Docker"
"Clean"
==> "InstallClient"
==> "Run"
Target.runOrDefaultWithArguments "Build"