@@ -5,9 +5,12 @@ use crate::detect::{DetectContext, InnerDetectResult};
5
5
use crate :: error:: Error ;
6
6
use crate :: platform:: Platform ;
7
7
use crate :: sbom:: cnb_sbom_path;
8
+ #[ cfg( feature = "trace" ) ]
9
+ use crate :: tracing:: start_trace;
8
10
use crate :: util:: is_not_found_error_kind;
9
11
use crate :: { exit_code, TomlFileError , LIBCNB_SUPPORTED_BUILDPACK_API } ;
10
12
use libcnb_common:: toml_file:: { read_toml_file, write_toml_file} ;
13
+ use libcnb_data:: buildpack:: ComponentBuildpackDescriptor ;
11
14
use libcnb_data:: store:: Store ;
12
15
use serde:: de:: DeserializeOwned ;
13
16
use serde:: Deserialize ;
@@ -121,31 +124,63 @@ pub fn libcnb_runtime_detect<B: Buildpack>(
121
124
) -> crate :: Result < i32 , B :: Error > {
122
125
let app_dir = env:: current_dir ( ) . map_err ( Error :: CannotDetermineAppDirectory ) ?;
123
126
127
+ let buildpack_dir = read_buildpack_dir ( ) ?;
128
+
129
+ let buildpack_descriptor: ComponentBuildpackDescriptor < <B as Buildpack >:: Metadata > =
130
+ read_buildpack_descriptor ( ) ?;
131
+
132
+ #[ cfg( feature = "trace" ) ]
133
+ let mut trace = start_trace ( & buildpack_descriptor. buildpack , "detect" ) ;
134
+
135
+ let mut trace_error = |err : & dyn std:: error:: Error | {
136
+ #[ cfg( feature = "trace" ) ]
137
+ trace. set_error ( err) ;
138
+ } ;
124
139
let stack_id: StackId = env:: var ( "CNB_STACK_ID" )
125
140
. map_err ( Error :: CannotDetermineStackId )
126
- . and_then ( |stack_id_string| stack_id_string. parse ( ) . map_err ( Error :: StackIdError ) ) ?;
127
-
128
- let platform = B :: Platform :: from_path ( & args. platform_dir_path )
129
- . map_err ( Error :: CannotCreatePlatformFromPath ) ?;
141
+ . and_then ( |stack_id_string| stack_id_string. parse ( ) . map_err ( Error :: StackIdError ) )
142
+ . map_err ( |err| {
143
+ trace_error ( & err) ;
144
+ err
145
+ } ) ?;
146
+
147
+ let platform = B :: Platform :: from_path ( & args. platform_dir_path ) . map_err ( |inner_err| {
148
+ let err = Error :: CannotCreatePlatformFromPath ( inner_err) ;
149
+ trace_error ( & err) ;
150
+ err
151
+ } ) ?;
130
152
131
153
let build_plan_path = args. build_plan_path ;
132
154
133
155
let detect_context = DetectContext {
134
156
app_dir,
157
+ buildpack_dir,
135
158
stack_id,
136
159
platform,
137
- buildpack_dir : read_buildpack_dir ( ) ?,
138
- buildpack_descriptor : read_buildpack_descriptor ( ) ?,
160
+ buildpack_descriptor,
139
161
} ;
140
162
141
- match buildpack. detect ( detect_context) ?. 0 {
142
- InnerDetectResult :: Fail => Ok ( exit_code:: DETECT_DETECTION_FAILED ) ,
163
+ let detect_result = buildpack. detect ( detect_context) . map_err ( |err| {
164
+ trace_error ( & err) ;
165
+ err
166
+ } ) ?;
167
+
168
+ match detect_result. 0 {
169
+ InnerDetectResult :: Fail => {
170
+ #[ cfg( feature = "trace" ) ]
171
+ trace. add_event ( "detect-failed" ) ;
172
+ Ok ( exit_code:: DETECT_DETECTION_FAILED )
173
+ }
143
174
InnerDetectResult :: Pass { build_plan } => {
144
175
if let Some ( build_plan) = build_plan {
145
- write_toml_file ( & build_plan, build_plan_path)
146
- . map_err ( Error :: CannotWriteBuildPlan ) ?;
176
+ write_toml_file ( & build_plan, build_plan_path) . map_err ( |inner_err| {
177
+ let err = Error :: CannotWriteBuildPlan ( inner_err) ;
178
+ trace_error ( & err) ;
179
+ err
180
+ } ) ?;
147
181
}
148
-
182
+ #[ cfg( feature = "trace" ) ]
183
+ trace. add_event ( "detect-passed" ) ;
149
184
Ok ( exit_code:: DETECT_DETECTION_PASSED )
150
185
}
151
186
}
@@ -163,31 +198,63 @@ pub fn libcnb_runtime_build<B: Buildpack>(
163
198
164
199
let app_dir = env:: current_dir ( ) . map_err ( Error :: CannotDetermineAppDirectory ) ?;
165
200
201
+ let buildpack_dir = read_buildpack_dir ( ) ?;
202
+
203
+ let buildpack_descriptor: ComponentBuildpackDescriptor < <B as Buildpack >:: Metadata > =
204
+ read_buildpack_descriptor ( ) ?;
205
+
206
+ #[ cfg( feature = "trace" ) ]
207
+ let mut trace = start_trace ( & buildpack_descriptor. buildpack , "build" ) ;
208
+
209
+ let mut trace_error = |err : & dyn std:: error:: Error | {
210
+ #[ cfg( feature = "trace" ) ]
211
+ trace. set_error ( err) ;
212
+ } ;
213
+
166
214
let stack_id: StackId = env:: var ( "CNB_STACK_ID" )
167
215
. map_err ( Error :: CannotDetermineStackId )
168
- . and_then ( |stack_id_string| stack_id_string. parse ( ) . map_err ( Error :: StackIdError ) ) ?;
169
-
170
- let platform = Platform :: from_path ( & args. platform_dir_path )
171
- . map_err ( Error :: CannotCreatePlatformFromPath ) ?;
216
+ . and_then ( |stack_id_string| stack_id_string. parse ( ) . map_err ( Error :: StackIdError ) )
217
+ . map_err ( |err| {
218
+ trace_error ( & err) ;
219
+ err
220
+ } ) ?;
221
+
222
+ let platform = Platform :: from_path ( & args. platform_dir_path ) . map_err ( |inner_err| {
223
+ let err = Error :: CannotCreatePlatformFromPath ( inner_err) ;
224
+ trace_error ( & err) ;
225
+ err
226
+ } ) ?;
172
227
173
- let buildpack_plan =
174
- read_toml_file ( & args. buildpack_plan_path ) . map_err ( Error :: CannotReadBuildpackPlan ) ?;
228
+ let buildpack_plan = read_toml_file ( & args. buildpack_plan_path ) . map_err ( |inner_err| {
229
+ let err = Error :: CannotReadBuildpackPlan ( inner_err) ;
230
+ trace_error ( & err) ;
231
+ err
232
+ } ) ?;
175
233
176
234
let store = match read_toml_file :: < Store > ( layers_dir. join ( "store.toml" ) ) {
177
235
Err ( TomlFileError :: IoError ( io_error) ) if is_not_found_error_kind ( & io_error) => Ok ( None ) ,
178
236
other => other. map ( Some ) ,
179
237
}
180
- . map_err ( Error :: CannotReadStore ) ?;
238
+ . map_err ( Error :: CannotReadStore )
239
+ . map_err ( |err| {
240
+ trace_error ( & err) ;
241
+ err
242
+ } ) ?;
181
243
182
- let build_result = buildpack . build ( BuildContext {
244
+ let build_context = BuildContext {
183
245
layers_dir : layers_dir. clone ( ) ,
184
246
app_dir,
185
247
stack_id,
186
248
platform,
187
249
buildpack_plan,
188
- buildpack_dir : read_buildpack_dir ( ) ? ,
189
- buildpack_descriptor : read_buildpack_descriptor ( ) ? ,
250
+ buildpack_dir,
251
+ buildpack_descriptor,
190
252
store,
253
+ } ;
254
+
255
+ let build_result = buildpack. build ( build_context) . map_err ( |err| {
256
+ trace_error ( & err) ;
257
+ err
191
258
} ) ?;
192
259
193
260
match build_result. 0 {
@@ -198,31 +265,47 @@ pub fn libcnb_runtime_build<B: Buildpack>(
198
265
launch_sboms,
199
266
} => {
200
267
if let Some ( launch) = launch {
201
- write_toml_file ( & launch, layers_dir. join ( "launch.toml" ) )
202
- . map_err ( Error :: CannotWriteLaunch ) ?;
268
+ write_toml_file ( & launch, layers_dir. join ( "launch.toml" ) ) . map_err ( |inner_err| {
269
+ let err = Error :: CannotWriteLaunch ( inner_err) ;
270
+ trace_error ( & err) ;
271
+ err
272
+ } ) ?;
203
273
} ;
204
274
205
275
if let Some ( store) = store {
206
- write_toml_file ( & store, layers_dir. join ( "store.toml" ) )
207
- . map_err ( Error :: CannotWriteStore ) ?;
276
+ write_toml_file ( & store, layers_dir. join ( "store.toml" ) ) . map_err ( |inner_err| {
277
+ let err = Error :: CannotWriteStore ( inner_err) ;
278
+ trace_error ( & err) ;
279
+ err
280
+ } ) ?;
208
281
} ;
209
282
210
283
for build_sbom in build_sboms {
211
284
fs:: write (
212
285
cnb_sbom_path ( & build_sbom. format , & layers_dir, "build" ) ,
213
286
& build_sbom. data ,
214
287
)
215
- . map_err ( Error :: CannotWriteBuildSbom ) ?;
288
+ . map_err ( Error :: CannotWriteBuildSbom )
289
+ . map_err ( |err| {
290
+ trace_error ( & err) ;
291
+ err
292
+ } ) ?;
216
293
}
217
294
218
295
for launch_sbom in launch_sboms {
219
296
fs:: write (
220
297
cnb_sbom_path ( & launch_sbom. format , & layers_dir, "launch" ) ,
221
298
& launch_sbom. data ,
222
299
)
223
- . map_err ( Error :: CannotWriteLaunchSbom ) ?;
300
+ . map_err ( Error :: CannotWriteLaunchSbom )
301
+ . map_err ( |err| {
302
+ trace_error ( & err) ;
303
+ err
304
+ } ) ?;
224
305
}
225
306
307
+ #[ cfg( feature = "trace" ) ]
308
+ trace. add_event ( "build-success" ) ;
226
309
Ok ( exit_code:: GENERIC_SUCCESS )
227
310
}
228
311
}
0 commit comments