forked from jessfraz/buildkit
-
Notifications
You must be signed in to change notification settings - Fork 0
/
llbbuild.go
110 lines (90 loc) · 2.2 KB
/
llbbuild.go
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
package llbbuild
import (
"github.com/moby/buildkit/client/llb"
"github.com/moby/buildkit/solver/pb"
digest "github.com/opencontainers/go-digest"
)
func Build(opt ...BuildOption) llb.StateOption {
return func(s llb.State) llb.State {
return s.WithOutput(NewBuildOp(s.Output(), opt...).Output())
}
}
func NewBuildOp(source llb.Output, opt ...BuildOption) llb.Vertex {
info := &BuildInfo{}
for _, o := range opt {
o(info)
}
return &build{source: source, info: info, cachedOpMetadata: info.OpMetadata}
}
type build struct {
source llb.Output
info *BuildInfo
cachedPBDigest digest.Digest
cachedPB []byte
cachedOpMetadata llb.OpMetadata
}
func (b *build) ToInput() (*pb.Input, error) {
dgst, _, _, err := b.Marshal()
if err != nil {
return nil, err
}
return &pb.Input{Digest: dgst, Index: pb.OutputIndex(0)}, nil
}
func (b *build) Vertex() llb.Vertex {
return b
}
func (b *build) Validate() error {
return nil
}
func (b *build) Marshal() (digest.Digest, []byte, *llb.OpMetadata, error) {
if b.cachedPB != nil {
return b.cachedPBDigest, b.cachedPB, &b.cachedOpMetadata, nil
}
pbo := &pb.BuildOp{
Builder: pb.LLBBuilder,
Inputs: map[string]*pb.BuildInput{
pb.LLBDefinitionInput: {pb.InputIndex(0)}},
}
pbo.Attrs = map[string]string{}
if b.info.DefinitionFilename != "" {
pbo.Attrs[pb.AttrLLBDefinitionFilename] = b.info.DefinitionFilename
}
pop := &pb.Op{
Op: &pb.Op_Build{
Build: pbo,
},
}
inp, err := b.source.ToInput()
if err != nil {
return "", nil, nil, err
}
pop.Inputs = append(pop.Inputs, inp)
dt, err := pop.Marshal()
if err != nil {
return "", nil, nil, err
}
b.cachedPB = dt
b.cachedPBDigest = digest.FromBytes(dt)
return b.cachedPBDigest, dt, &b.cachedOpMetadata, nil
}
func (b *build) Output() llb.Output {
return b
}
func (b *build) Inputs() []llb.Output {
return []llb.Output{b.source}
}
type BuildInfo struct {
llb.OpMetadata
DefinitionFilename string
}
type BuildOption func(*BuildInfo)
func WithFilename(fn string) BuildOption {
return func(b *BuildInfo) {
b.DefinitionFilename = fn
}
}
func WithMetadata(md llb.MetadataOpt) BuildOption {
return func(b *BuildInfo) {
md.SetMetadataOption(&b.OpMetadata)
}
}