-
Notifications
You must be signed in to change notification settings - Fork 5
/
CI.fs
81 lines (62 loc) · 1.77 KB
/
CI.fs
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
module CLI.CI
open System
open System.CommandLine
open System.CommandLine.Binding
open System.IO
open Docker
open Microsoft.Extensions.DependencyInjection
open Microsoft.Extensions.Logging
let command = Command("ci")
module Build =
let tagOpt =
Option<string>([| "-t"; "--tag" |], "image tag", IsRequired = true)
let dockerfileOpt =
Option<FileInfo>(
[| "-f"; "--dockerfile" |],
"dockerfile to build",
IsRequired = true
)
let ctxPathOpt =
Option<DirectoryInfo>(
[| "-c"; "--context-dir" |],
"docker build context dir",
IsRequired = true
)
let specOpt =
Option<string>(
[| "-s"; "--spec" |],
"build info specification file",
IsRequired = true
)
type BuildOptionBinder() =
inherit BinderBase<BuildOptions>()
override self.GetBoundValue(ctx) =
let valueOf x = ctx.ParseResult.GetValueForOption x
{ Tag = valueOf tagOpt
Dockerfile = valueOf dockerfileOpt
ContextPath = valueOf ctxPathOpt
Spec = valueOf specOpt }
type ServiceProviderBinder() =
inherit BinderBase<IServiceProvider>()
override self.GetBoundValue _ =
let services = ServiceCollection()
services.AddLogging (fun conf ->
conf.AddFilter("ci", LogLevel.Debug).AddConsole()
|> ignore)
|> ignore
services.BuildServiceProvider()
let command = Command("build")
let services =
ServiceProviderBinder.registerServices ignore
command.Add tagOpt
command.Add dockerfileOpt
command.Add ctxPathOpt
command.Add specOpt
let handler (opt: BuildOptions) (services: IServiceProvider) =
ciBuild services opt
command.SetHandler<BuildOptions, IServiceProvider>(
handler,
BuildOptionBinder(),
services
)
command.AddCommand Build.command