@@ -6,7 +6,7 @@ the repository's top-level Dockerfile.
66*/
77pub ( crate ) mod error;
88
9- use crate :: args:: { BuildPackageArgs , BuildVariantArgs } ;
9+ use crate :: args:: { BuildPackageArgs , BuildVariantArgs , RepackVariantArgs } ;
1010use buildsys:: manifest:: {
1111 ImageFeature , ImageFormat , ImageLayout , Manifest , PartitionPlan , SupportedArch ,
1212} ;
@@ -86,7 +86,6 @@ lazy_static! {
8686
8787static DOCKER_BUILD_MAX_ATTEMPTS : NonZeroU16 = nonzero ! ( 10u16 ) ;
8888
89- #[ allow( dead_code) ]
9089enum OutputCleanup {
9190 BeforeBuild ,
9291 None ,
@@ -224,17 +223,60 @@ impl VariantBuildArgs {
224223 }
225224}
226225
226+ struct VariantRepackArgs {
227+ data_image_publish_size_gib : i32 ,
228+ data_image_size_gib : String ,
229+ image_features : HashSet < ImageFeature > ,
230+ image_format : String ,
231+ name : String ,
232+ os_image_publish_size_gib : String ,
233+ os_image_size_gib : String ,
234+ partition_plan : String ,
235+ variant : String ,
236+ version_build : String ,
237+ version_image : String ,
238+ }
239+
240+ impl VariantRepackArgs {
241+ fn build_args ( & self ) -> Vec < String > {
242+ let mut args = Vec :: new ( ) ;
243+ args. push ( "--network" . into ( ) ) ;
244+ args. push ( "host" . into ( ) ) ;
245+ args. build_arg (
246+ "DATA_IMAGE_PUBLISH_SIZE_GIB" ,
247+ self . data_image_publish_size_gib . to_string ( ) ,
248+ ) ;
249+ args. build_arg ( "DATA_IMAGE_SIZE_GIB" , & self . data_image_size_gib ) ;
250+ args. build_arg ( "IMAGE_FORMAT" , & self . image_format ) ;
251+ args. build_arg ( "IMAGE_NAME" , & self . name ) ;
252+ args. build_arg ( "OS_IMAGE_PUBLISH_SIZE_GIB" , & self . os_image_publish_size_gib ) ;
253+ args. build_arg ( "OS_IMAGE_SIZE_GIB" , & self . os_image_size_gib ) ;
254+ args. build_arg ( "PARTITION_PLAN" , & self . partition_plan ) ;
255+ args. build_arg ( "VARIANT" , & self . variant ) ;
256+ args. build_arg ( "BUILD_ID" , & self . version_build ) ;
257+ args. build_arg ( "VERSION_ID" , & self . version_image ) ;
258+
259+ for image_feature in self . image_features . iter ( ) {
260+ args. build_arg ( format ! ( "{}" , image_feature) , "1" ) ;
261+ }
262+
263+ args
264+ }
265+ }
266+
227267#[ allow( clippy:: large_enum_variant) ]
228268enum TargetBuildArgs {
229269 Package ( PackageBuildArgs ) ,
230270 Variant ( VariantBuildArgs ) ,
271+ Repack ( VariantRepackArgs ) ,
231272}
232273
233274impl TargetBuildArgs {
234275 pub ( crate ) fn build_type ( & self ) -> BuildType {
235276 match self {
236277 TargetBuildArgs :: Package ( _) => BuildType :: Package ,
237278 TargetBuildArgs :: Variant ( _) => BuildType :: Variant ,
279+ TargetBuildArgs :: Repack ( _) => BuildType :: Repack ,
238280 }
239281 }
240282}
@@ -384,6 +426,67 @@ impl DockerBuild {
384426 } )
385427 }
386428
429+ /// Create a new `DockerBuild` that can repackage a variant image.
430+ pub ( crate ) fn repack_variant ( args : RepackVariantArgs , manifest : & Manifest ) -> Result < Self > {
431+ let image_layout = manifest. info ( ) . image_layout ( ) . cloned ( ) . unwrap_or_default ( ) ;
432+ let ImageLayout {
433+ os_image_size_gib,
434+ data_image_size_gib,
435+ partition_plan,
436+ ..
437+ } = image_layout;
438+
439+ let ( os_image_publish_size_gib, data_image_publish_size_gib) =
440+ image_layout. publish_image_sizes_gib ( ) ;
441+
442+ Ok ( Self {
443+ dockerfile : args. common . tools_dir . join ( "repack.Dockerfile" ) ,
444+ context : args. common . root_dir . clone ( ) ,
445+ target : "repack" . to_string ( ) ,
446+ tag : append_token (
447+ format ! (
448+ "buildsys-repack-{variant}-{arch}" ,
449+ variant = args. variant,
450+ arch = args. common. arch
451+ ) ,
452+ & args. common . root_dir ,
453+ ) ,
454+ root_dir : args. common . root_dir . clone ( ) ,
455+ artifacts_dir : args. common . image_arch_variant_dir ,
456+ state_dir : args. common . state_dir ,
457+ artifact_name : args. variant . clone ( ) ,
458+ common_build_args : CommonBuildArgs :: new (
459+ & args. common . root_dir ,
460+ args. common . sdk_image ,
461+ args. common . arch ,
462+ OutputCleanup :: None ,
463+ ) ,
464+ target_build_args : TargetBuildArgs :: Repack ( VariantRepackArgs {
465+ data_image_publish_size_gib,
466+ data_image_size_gib : data_image_size_gib. to_string ( ) ,
467+ image_features : manifest. info ( ) . image_features ( ) . unwrap_or_default ( ) ,
468+ image_format : match manifest. info ( ) . image_format ( ) {
469+ Some ( ImageFormat :: Raw ) | None => "raw" ,
470+ Some ( ImageFormat :: Qcow2 ) => "qcow2" ,
471+ Some ( ImageFormat :: Vmdk ) => "vmdk" ,
472+ }
473+ . to_string ( ) ,
474+ name : args. name ,
475+ os_image_publish_size_gib : os_image_publish_size_gib. to_string ( ) ,
476+ os_image_size_gib : os_image_size_gib. to_string ( ) ,
477+ partition_plan : match partition_plan {
478+ PartitionPlan :: Split => "split" ,
479+ PartitionPlan :: Unified => "unified" ,
480+ }
481+ . to_string ( ) ,
482+ variant : args. variant ,
483+ version_build : args. version_build ,
484+ version_image : args. version_image ,
485+ } ) ,
486+ secrets_args : secrets_args ( ) ?,
487+ } )
488+ }
489+
387490 pub ( crate ) fn build ( & self ) -> Result < ( ) > {
388491 env:: set_current_dir ( & self . root_dir ) . context ( error:: DirectoryChangeSnafu {
389492 path : & self . root_dir ,
@@ -468,6 +571,7 @@ impl DockerBuild {
468571 let mut args = match & self . target_build_args {
469572 TargetBuildArgs :: Package ( p) => p. build_args ( ) ,
470573 TargetBuildArgs :: Variant ( v) => v. build_args ( ) ,
574+ TargetBuildArgs :: Repack ( r) => r. build_args ( ) ,
471575 } ;
472576 args. build_arg ( "ARCH" , self . common_build_args . arch . to_string ( ) ) ;
473577 args. build_arg ( "GOARCH" , self . common_build_args . arch . goarch ( ) ) ;
@@ -571,6 +675,7 @@ fn create_marker_dir(
571675 BuildType :: Package => "packages" ,
572676 BuildType :: Kit => "kits" ,
573677 BuildType :: Variant => "variants" ,
678+ BuildType :: Repack => "variants" ,
574679 } ;
575680
576681 let path = [ & state_dir. display ( ) . to_string ( ) , arch, prefix, name]
0 commit comments