@@ -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,56 @@ impl VariantBuildArgs {
224223 }
225224}
226225
226+ struct VariantRepackArgs {
227+ data_image_publish_size_gib : i32 ,
228+ image_features : HashSet < ImageFeature > ,
229+ image_format : String ,
230+ name : String ,
231+ os_image_publish_size_gib : String ,
232+ partition_plan : String ,
233+ variant : String ,
234+ version_build : String ,
235+ version_image : String ,
236+ }
237+
238+ impl VariantRepackArgs {
239+ fn build_args ( & self ) -> Vec < String > {
240+ let mut args = Vec :: new ( ) ;
241+ args. push ( "--network" . into ( ) ) ;
242+ args. push ( "host" . into ( ) ) ;
243+ args. build_arg (
244+ "DATA_IMAGE_PUBLISH_SIZE_GIB" ,
245+ self . data_image_publish_size_gib . to_string ( ) ,
246+ ) ;
247+ args. build_arg ( "IMAGE_FORMAT" , & self . image_format ) ;
248+ args. build_arg ( "IMAGE_NAME" , & self . name ) ;
249+ args. build_arg ( "OS_IMAGE_PUBLISH_SIZE_GIB" , & self . os_image_publish_size_gib ) ;
250+ args. build_arg ( "PARTITION_PLAN" , & self . partition_plan ) ;
251+ args. build_arg ( "VARIANT" , & self . variant ) ;
252+ args. build_arg ( "BUILD_ID" , & self . version_build ) ;
253+ args. build_arg ( "VERSION_ID" , & self . version_image ) ;
254+
255+ for image_feature in self . image_features . iter ( ) {
256+ args. build_arg ( format ! ( "{}" , image_feature) , "1" ) ;
257+ }
258+
259+ args
260+ }
261+ }
262+
227263#[ allow( clippy:: large_enum_variant) ]
228264enum TargetBuildArgs {
229265 Package ( PackageBuildArgs ) ,
230266 Variant ( VariantBuildArgs ) ,
267+ Repack ( VariantRepackArgs ) ,
231268}
232269
233270impl TargetBuildArgs {
234271 pub ( crate ) fn build_type ( & self ) -> BuildType {
235272 match self {
236273 TargetBuildArgs :: Package ( _) => BuildType :: Package ,
237274 TargetBuildArgs :: Variant ( _) => BuildType :: Variant ,
275+ TargetBuildArgs :: Repack ( _) => BuildType :: Repack ,
238276 }
239277 }
240278}
@@ -384,6 +422,60 @@ impl DockerBuild {
384422 } )
385423 }
386424
425+ /// Create a new `DockerBuild` that can repackage a variant image.
426+ pub ( crate ) fn repack_variant ( args : RepackVariantArgs , manifest : & Manifest ) -> Result < Self > {
427+ let image_layout = manifest. info ( ) . image_layout ( ) . cloned ( ) . unwrap_or_default ( ) ;
428+ let ImageLayout { partition_plan, .. } = image_layout;
429+
430+ let ( os_image_publish_size_gib, data_image_publish_size_gib) =
431+ image_layout. publish_image_sizes_gib ( ) ;
432+
433+ Ok ( Self {
434+ dockerfile : args. common . tools_dir . join ( "repack.Dockerfile" ) ,
435+ context : args. common . root_dir . clone ( ) ,
436+ target : "repack" . to_string ( ) ,
437+ tag : append_token (
438+ format ! (
439+ "buildsys-repack-{variant}-{arch}" ,
440+ variant = args. variant,
441+ arch = args. common. arch
442+ ) ,
443+ & args. common . root_dir ,
444+ ) ,
445+ root_dir : args. common . root_dir . clone ( ) ,
446+ artifacts_dir : args. common . image_arch_variant_dir ,
447+ state_dir : args. common . state_dir ,
448+ artifact_name : args. variant . clone ( ) ,
449+ common_build_args : CommonBuildArgs :: new (
450+ & args. common . root_dir ,
451+ args. common . sdk_image ,
452+ args. common . arch ,
453+ OutputCleanup :: None ,
454+ ) ,
455+ target_build_args : TargetBuildArgs :: Repack ( VariantRepackArgs {
456+ data_image_publish_size_gib,
457+ image_features : manifest. info ( ) . image_features ( ) . unwrap_or_default ( ) ,
458+ image_format : match manifest. info ( ) . image_format ( ) {
459+ Some ( ImageFormat :: Raw ) | None => "raw" ,
460+ Some ( ImageFormat :: Qcow2 ) => "qcow2" ,
461+ Some ( ImageFormat :: Vmdk ) => "vmdk" ,
462+ }
463+ . to_string ( ) ,
464+ name : args. name ,
465+ os_image_publish_size_gib : os_image_publish_size_gib. to_string ( ) ,
466+ partition_plan : match partition_plan {
467+ PartitionPlan :: Split => "split" ,
468+ PartitionPlan :: Unified => "unified" ,
469+ }
470+ . to_string ( ) ,
471+ variant : args. variant ,
472+ version_build : args. version_build ,
473+ version_image : args. version_image ,
474+ } ) ,
475+ secrets_args : secrets_args ( ) ?,
476+ } )
477+ }
478+
387479 pub ( crate ) fn build ( & self ) -> Result < ( ) > {
388480 env:: set_current_dir ( & self . root_dir ) . context ( error:: DirectoryChangeSnafu {
389481 path : & self . root_dir ,
@@ -468,6 +560,7 @@ impl DockerBuild {
468560 let mut args = match & self . target_build_args {
469561 TargetBuildArgs :: Package ( p) => p. build_args ( ) ,
470562 TargetBuildArgs :: Variant ( v) => v. build_args ( ) ,
563+ TargetBuildArgs :: Repack ( r) => r. build_args ( ) ,
471564 } ;
472565 args. build_arg ( "ARCH" , self . common_build_args . arch . to_string ( ) ) ;
473566 args. build_arg ( "GOARCH" , self . common_build_args . arch . goarch ( ) ) ;
@@ -571,6 +664,7 @@ fn create_marker_dir(
571664 BuildType :: Package => "packages" ,
572665 BuildType :: Kit => "kits" ,
573666 BuildType :: Variant => "variants" ,
667+ BuildType :: Repack => "repack" ,
574668 } ;
575669
576670 let path = [ & state_dir. display ( ) . to_string ( ) , arch, prefix, name]
0 commit comments