@@ -340,26 +340,46 @@ impl Bakefile {
340340
341341 for ( image_name, ( image_config, is_entry) ) in targets. into_iter ( ) {
342342 for ( image_version, image_options) in image_config. versions {
343- let image_repository_uri = utils:: format_image_repository_uri (
343+ let (
344+ image_repository_uri,
345+ image_index_manifest_tag,
346+ image_manifest_tag,
347+ image_manifest_uri,
348+ ) = utils:: format_image_tag_parts (
344349 image_registry,
345350 & cli_args. registry_namespace ,
346351 & image_name,
347- ) ;
348-
349- let image_index_manifest_tag = utils:: format_image_index_manifest_tag (
350- & image_version,
352+ & cli_args. image_version ,
351353 & metadata. vendor_tag_prefix ,
352354 & cli_args. image_version ,
353- ) ;
354-
355- let image_manifest_tag = utils:: format_image_manifest_tag (
356- & image_index_manifest_tag,
357355 cli_args. target_platform . architecture ( ) ,
358356 cli_args. strip_architecture ,
359357 ) ;
360358
361- let image_manifest_uri =
362- utils:: format_image_manifest_uri ( & image_repository_uri, & image_manifest_tag) ;
359+ let cache_image_manifest_uri =
360+ cli_args. cache_registry . as_ref ( ) . map ( |cache_registry| {
361+ let uri = utils:: format_image_cache_repository_uri (
362+ cache_registry,
363+ cli_args. cache_namespace . as_deref ( ) ,
364+ & cli_args. registry_namespace ,
365+ & image_name,
366+ ) ;
367+
368+ let cache_image_index_manifest_tag =
369+ utils:: format_image_cache_index_manifest_tag (
370+ & image_version,
371+ & metadata. vendor_tag_prefix ,
372+ & cli_args. image_version ,
373+ ) ;
374+
375+ let cache_image_manifest_tag = utils:: format_image_manifest_tag (
376+ & cache_image_index_manifest_tag,
377+ cli_args. target_platform . architecture ( ) ,
378+ cli_args. strip_architecture ,
379+ ) ;
380+
381+ utils:: format_image_manifest_uri ( & uri, & cache_image_manifest_tag)
382+ } ) ;
363383
364384 // TODO (@Techassi): Clean this up
365385 // TODO (@Techassi): Move the arg formatting into functions
@@ -449,6 +469,23 @@ impl Bakefile {
449469 & cli_args. image_version ,
450470 ) ;
451471
472+ let cache_to =
473+ cache_image_manifest_uri
474+ . clone ( )
475+ . map_or_else ( Vec :: new, |reference| {
476+ vec ! [ CacheStorageBackend :: Registry {
477+ reference,
478+ mode: Some ( CacheMode :: Max ) ,
479+ } ]
480+ } ) ;
481+
482+ let cache_from = cache_image_manifest_uri. map_or_else ( Vec :: new, |reference| {
483+ vec ! [ CacheStorageBackend :: Registry {
484+ reference,
485+ mode: None ,
486+ } ]
487+ } ) ;
488+
452489 let target = BakefileTarget {
453490 tags : vec ! [ image_manifest_uri] ,
454491 arguments : build_arguments,
@@ -459,6 +496,8 @@ impl Bakefile {
459496 inherits : vec ! [ COMMON_TARGET_NAME . to_owned( ) ] ,
460497 annotations,
461498 contexts,
499+ cache_from,
500+ cache_to,
462501 ..Default :: default ( )
463502 } ;
464503
@@ -577,6 +616,12 @@ pub struct BakefileTarget {
577616 /// Image names and tags to use for the build target.
578617 #[ serde( skip_serializing_if = "Vec::is_empty" ) ]
579618 pub tags : Vec < String > ,
619+
620+ #[ serde( skip_serializing_if = "Vec::is_empty" ) ]
621+ pub cache_from : Vec < CacheStorageBackend > ,
622+
623+ #[ serde( skip_serializing_if = "Vec::is_empty" ) ]
624+ pub cache_to : Vec < CacheStorageBackend > ,
580625}
581626
582627impl BakefileTarget {
@@ -668,3 +713,23 @@ impl BakefileTarget {
668713pub struct BakefileGroup {
669714 targets : Vec < String > ,
670715}
716+
717+ #[ derive( Clone , Debug , Serialize ) ]
718+ #[ serde( tag = "type" , rename_all = "lowercase" ) ]
719+ pub enum CacheStorageBackend {
720+ Registry {
721+ /// Full name of the cache image to import.
722+ #[ serde( rename = "ref" ) ]
723+ reference : String ,
724+
725+ #[ serde( skip_serializing_if = "Option::is_none" ) ]
726+ mode : Option < CacheMode > ,
727+ } ,
728+ }
729+
730+ #[ derive( Clone , Copy , Debug , Serialize ) ]
731+ #[ serde( rename_all = "lowercase" ) ]
732+ pub enum CacheMode {
733+ // We currently only support max, because we want to cache every layer
734+ Max ,
735+ }
0 commit comments