@@ -19,9 +19,10 @@ const (
19
19
)
20
20
21
21
type worker interface {
22
- Base (resolver llb. ImageMetaResolver , opts ... llb.ConstraintsOpt ) llb.State
22
+ Base (sOpt dalec. SourceOpts , opts ... llb.ConstraintsOpt ) ( llb.State , error )
23
23
Install (pkgs []string , opts ... installOpt ) llb.RunOption
24
24
DefaultImageConfig (context.Context , llb.ImageMetaResolver , * ocispecs.Platform ) (* dalec.DockerImageSpec , error )
25
+ WorkerImageConfig (context.Context , llb.ImageMetaResolver , * ocispecs.Platform ) (* dalec.DockerImageSpec , error )
25
26
}
26
27
27
28
func newHandler (w worker ) gwclient.BuildFunc {
@@ -44,18 +45,30 @@ func newHandler(w worker) gwclient.BuildFunc {
44
45
Description : "Builds a container image with only the runtime dependencies installed." ,
45
46
})
46
47
48
+ mux .Add ("worker" , handleBaseImg (w ), & targets.Target {
49
+ Name : "worker" ,
50
+ Description : "Builds the base worker image responsible for building the rpm" ,
51
+ })
52
+
47
53
return mux .Handle
48
54
}
49
55
50
56
func handleDebug (w worker ) gwclient.BuildFunc {
51
57
return func (ctx context.Context , client gwclient.Client ) (* gwclient.Result , error ) {
52
- return rpm .HandleDebug (getSpecWorker (w ))(ctx , client )
58
+ sOpt , err := frontend .SourceOptFromClient (ctx , client )
59
+ if err != nil {
60
+ return nil , err
61
+ }
62
+ return rpm .HandleDebug (getSpecWorker (w , sOpt ))(ctx , client )
53
63
}
54
64
}
55
65
56
- func getSpecWorker (w worker ) rpm.WorkerFunc {
66
+ func getSpecWorker (w worker , sOpt dalec. SourceOpts ) rpm.WorkerFunc {
57
67
return func (resolver llb.ImageMetaResolver , spec * dalec.Spec , targetKey string , opts ... llb.ConstraintsOpt ) (llb.State , error ) {
58
- st := w .Base (resolver , opts ... )
68
+ st , err := w .Base (sOpt , opts ... )
69
+ if err != nil {
70
+ return llb .Scratch (), err
71
+ }
59
72
if spec .HasGomods () {
60
73
deps := spec .GetBuildDeps (targetKey )
61
74
hasGolang := func (s string ) bool {
@@ -70,3 +83,46 @@ func getSpecWorker(w worker) rpm.WorkerFunc {
70
83
return st , nil
71
84
}
72
85
}
86
+
87
+ func handleBaseImg (w worker ) gwclient.BuildFunc {
88
+ return func (ctx context.Context , client gwclient.Client ) (* gwclient.Result , error ) {
89
+ return frontend .BuildWithPlatform (ctx , client , func (ctx context.Context , client gwclient.Client , platform * ocispecs.Platform , spec * dalec.Spec , targetKey string ) (gwclient.Reference , * dalec.DockerImageSpec , error ) {
90
+
91
+ sOpt , err := frontend .SourceOptFromClient (ctx , client )
92
+ if err != nil {
93
+ return nil , nil , err
94
+ }
95
+
96
+ st , err := w .Base (sOpt )
97
+ if err != nil {
98
+ return nil , nil , err
99
+ }
100
+
101
+ def , err := st .Marshal (ctx )
102
+ if err != nil {
103
+ return nil , nil , err
104
+ }
105
+
106
+ req := gwclient.SolveRequest {
107
+ Definition : def .ToPB (),
108
+ }
109
+
110
+ res , err := client .Solve (ctx , req )
111
+ if err != nil {
112
+ return nil , nil , err
113
+ }
114
+
115
+ ref , err := res .SingleRef ()
116
+ if err != nil {
117
+ return nil , nil , err
118
+ }
119
+
120
+ cfg , err := w .DefaultImageConfig (ctx , client , platform )
121
+ if err != nil {
122
+ return nil , nil , err
123
+ }
124
+
125
+ return ref , cfg , nil
126
+ })
127
+ }
128
+ }
0 commit comments