Skip to content

Commit f6eba80

Browse files
authored
Merge pull request #227 from bottlerocket-os/build-kit
buildsys build-kit
2 parents 74b8ad7 + 46d5bec commit f6eba80

File tree

5 files changed

+130
-11
lines changed

5 files changed

+130
-11
lines changed

tools/buildsys/src/args.rs

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,21 @@ use url::Url;
1515
/// variable changes. The build type is represented with bit flags so that we can easily list
1616
/// multiple build types for a single variable. See `[BuildType]` and `[rerun_for_envs]` below to
1717
/// see how this list is used.
18-
const REBUILD_VARS: [(&str, u8); 13] = [
19-
("BUILDSYS_ARCH", PACKAGE | VARIANT),
20-
("BUILDSYS_OUTPUT_GENERATION_ID", PACKAGE | VARIANT),
18+
const REBUILD_VARS: [(&str, u8); 14] = [
19+
("BUILDSYS_ARCH", PACKAGE | KIT | VARIANT),
20+
("BUILDSYS_KITS_DIR", KIT),
2121
("BUILDSYS_NAME", VARIANT),
2222
("BUILDSYS_OUTPUT_DIR", VARIANT),
23+
("BUILDSYS_OUTPUT_GENERATION_ID", PACKAGE | KIT | VARIANT),
2324
("BUILDSYS_PACKAGES_DIR", PACKAGE),
2425
("BUILDSYS_PRETTY_NAME", VARIANT),
25-
("BUILDSYS_ROOT_DIR", PACKAGE | VARIANT),
26-
("BUILDSYS_STATE_DIR", PACKAGE | VARIANT),
26+
("BUILDSYS_ROOT_DIR", PACKAGE | KIT | VARIANT),
27+
("BUILDSYS_STATE_DIR", PACKAGE | KIT | VARIANT),
2728
("BUILDSYS_TIMESTAMP", VARIANT),
2829
("BUILDSYS_VARIANT", VARIANT),
2930
("BUILDSYS_VERSION_BUILD", VARIANT),
3031
("BUILDSYS_VERSION_IMAGE", VARIANT),
31-
("TLPRIVATE_SDK_IMAGE", PACKAGE | VARIANT),
32+
("TLPRIVATE_SDK_IMAGE", PACKAGE | KIT | VARIANT),
3233
];
3334

3435
/// A tool for building Bottlerocket images and artifacts.
@@ -41,6 +42,7 @@ pub(crate) struct Buildsys {
4142
#[derive(Subcommand, Debug)]
4243
pub(crate) enum Command {
4344
BuildPackage(Box<BuildPackageArgs>),
45+
BuildKit(Box<BuildKitArgs>),
4446
BuildVariant(Box<BuildVariantArgs>),
4547
RepackVariant(Box<RepackVariantArgs>),
4648
}
@@ -49,6 +51,7 @@ impl Command {
4951
pub(crate) fn build_type(&self) -> BuildType {
5052
match self {
5153
Command::BuildPackage(_) => BuildType::Package,
54+
Command::BuildKit(_) => BuildType::Kit,
5255
Command::BuildVariant(_) => BuildType::Variant,
5356
Command::RepackVariant(_) => BuildType::Repack,
5457
}
@@ -126,6 +129,21 @@ pub(crate) struct BuildPackageArgs {
126129
pub(crate) common: Common,
127130
}
128131

132+
/// Place the required RPMs into a kit (directory) and make a yum repo.
133+
#[derive(Debug, Parser)]
134+
pub(crate) struct BuildKitArgs {
135+
/// The directory where built RPMs go, e.g. build/rpms
136+
#[arg(long, env = "BUILDSYS_PACKAGES_DIR")]
137+
pub(crate) packages_dir: PathBuf,
138+
139+
/// The directory where built kits go, e.g. build/kits
140+
#[arg(long, env = "BUILDSYS_KITS_DIR")]
141+
pub(crate) kits_dir: PathBuf,
142+
143+
#[command(flatten)]
144+
pub(crate) common: Common,
145+
}
146+
129147
/// Build filesystem and disk images from RPMs.
130148
#[derive(Debug, Parser)]
131149
pub(crate) struct BuildVariantArgs {
@@ -230,6 +248,7 @@ impl BuildFlags {
230248
#[allow(dead_code)]
231249
const REPACK: u8 = BuildFlags::Repack as u8;
232250
const PACKAGE: u8 = BuildFlags::Package as u8;
251+
const KIT: u8 = BuildFlags::Kit as u8;
233252
const VARIANT: u8 = BuildFlags::Variant as u8;
234253

235254
#[test]

tools/buildsys/src/builder.rs

Lines changed: 55 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ the repository's top-level Dockerfile.
66
*/
77
pub(crate) mod error;
88

9-
use crate::args::{BuildPackageArgs, BuildVariantArgs, RepackVariantArgs};
9+
use crate::args::{BuildKitArgs, BuildPackageArgs, BuildVariantArgs, RepackVariantArgs};
1010
use buildsys::manifest::{
1111
ImageFeature, ImageFormat, ImageLayout, Manifest, PartitionPlan, SupportedArch,
1212
};
@@ -142,7 +142,23 @@ struct PackageBuildArgs {
142142
variant_runtime: String,
143143
}
144144

145-
impl PackageBuildArgs {
145+
impl KitBuildArgs {
146+
fn build_args(&self) -> Vec<String> {
147+
let mut args = Vec::new();
148+
args.push("--network".into());
149+
args.push("none".into());
150+
args.build_arg("KIT", &self.kit);
151+
args.build_arg("PACKAGE_DEPENDENCIES", self.package_dependencies.join(" "));
152+
args
153+
}
154+
}
155+
156+
struct KitBuildArgs {
157+
kit: String,
158+
package_dependencies: Vec<String>,
159+
}
160+
161+
impl crate::builder::PackageBuildArgs {
146162
fn build_args(&self) -> Vec<String> {
147163
let mut args = Vec::new();
148164
args.push("--network".into());
@@ -267,6 +283,7 @@ impl RepackVariantBuildArgs {
267283
#[allow(clippy::large_enum_variant)]
268284
enum TargetBuildArgs {
269285
Package(PackageBuildArgs),
286+
Kit(KitBuildArgs),
270287
Variant(VariantBuildArgs),
271288
Repack(RepackVariantBuildArgs),
272289
}
@@ -275,6 +292,7 @@ impl TargetBuildArgs {
275292
pub(crate) fn build_type(&self) -> BuildType {
276293
match self {
277294
TargetBuildArgs::Package(_) => BuildType::Package,
295+
TargetBuildArgs::Kit(_) => BuildType::Kit,
278296
TargetBuildArgs::Variant(_) => BuildType::Variant,
279297
TargetBuildArgs::Repack(_) => BuildType::Repack,
280298
}
@@ -343,6 +361,40 @@ impl DockerBuild {
343361
})
344362
}
345363

364+
pub(crate) fn new_kit(args: BuildKitArgs, manifest: &Manifest) -> Result<Self> {
365+
let kit = manifest.info().kit_name();
366+
let per_kit_dir = format!("{}/{}", args.kits_dir.display(), kit).into();
367+
368+
Ok(Self {
369+
dockerfile: args.common.tools_dir.join("build.Dockerfile"),
370+
context: args.common.root_dir.clone(),
371+
target: "kit".to_string(),
372+
tag: append_token(
373+
format!(
374+
"buildsys-kit-{kit}-{arch}",
375+
kit = kit,
376+
arch = args.common.arch,
377+
),
378+
&args.common.root_dir,
379+
),
380+
root_dir: args.common.root_dir.clone(),
381+
artifacts_dir: per_kit_dir,
382+
state_dir: args.common.state_dir,
383+
artifact_name: kit.to_string(),
384+
common_build_args: CommonBuildArgs::new(
385+
&args.common.root_dir,
386+
args.common.sdk_image,
387+
args.common.arch,
388+
OutputCleanup::BeforeBuild,
389+
),
390+
target_build_args: TargetBuildArgs::Kit(KitBuildArgs {
391+
kit: kit.to_string(),
392+
package_dependencies: manifest.package_dependencies().context(error::GraphSnafu)?,
393+
}),
394+
secrets_args: Vec::new(),
395+
})
396+
}
397+
346398
/// Create a new `DockerBuild` that can build a variant image.
347399
pub(crate) fn new_variant(args: BuildVariantArgs, manifest: &Manifest) -> Result<Self> {
348400
let image_layout = manifest.info().image_layout().cloned().unwrap_or_default();
@@ -567,6 +619,7 @@ impl DockerBuild {
567619
fn build_args(&self) -> Vec<String> {
568620
let mut args = match &self.target_build_args {
569621
TargetBuildArgs::Package(p) => p.build_args(),
622+
TargetBuildArgs::Kit(k) => k.build_args(),
570623
TargetBuildArgs::Variant(v) => v.build_args(),
571624
TargetBuildArgs::Repack(r) => r.build_args(),
572625
};

tools/buildsys/src/main.rs

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@ mod gomod;
1515
mod project;
1616
mod spec;
1717

18-
use crate::args::{BuildPackageArgs, BuildVariantArgs, Buildsys, Command, RepackVariantArgs};
18+
use crate::args::{
19+
BuildKitArgs, BuildPackageArgs, BuildVariantArgs, Buildsys, Command, RepackVariantArgs,
20+
};
1921
use crate::builder::DockerBuild;
2022
use buildsys::manifest::{BundleModule, ImageFeature, Manifest, ManifestInfo, SupportedArch};
2123
use cache::LookasideCache;
@@ -112,6 +114,7 @@ fn run(args: Buildsys) -> Result<()> {
112114
args::rerun_for_envs(args.command.build_type());
113115
match args.command {
114116
Command::BuildPackage(args) => build_package(*args),
117+
Command::BuildKit(args) => build_kit(*args),
115118
Command::BuildVariant(args) => build_variant(*args),
116119
Command::RepackVariant(args) => repack_variant(*args),
117120
}
@@ -199,6 +202,22 @@ fn build_package(args: BuildPackageArgs) -> Result<()> {
199202
.context(error::BuildAttemptSnafu)
200203
}
201204

205+
fn build_kit(args: BuildKitArgs) -> Result<()> {
206+
let manifest_file = "Cargo.toml";
207+
println!("cargo:rerun-if-changed={}", manifest_file);
208+
209+
let manifest = Manifest::new(
210+
args.common.cargo_manifest_dir.join(manifest_file),
211+
&args.common.cargo_metadata_path,
212+
)
213+
.context(error::ManifestParseSnafu)?;
214+
215+
DockerBuild::new_kit(args, &manifest)
216+
.context(error::BuilderInstantiationSnafu)?
217+
.build()
218+
.context(error::BuildAttemptSnafu)
219+
}
220+
202221
fn build_variant(args: BuildVariantArgs) -> Result<()> {
203222
let manifest_file = "Cargo.toml";
204223
println!("cargo:rerun-if-changed={}", manifest_file);

tools/buildsys/src/manifest.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -369,6 +369,15 @@ impl ManifestInfo {
369369
.unwrap_or_else(|| self.manifest_name())
370370
}
371371

372+
/// Convenience method to return the kit name. If the manifest has an override in the
373+
/// `package.metadata.build-kit.kit-name` key, it is returned, otherwise the Cargo manifest name
374+
/// is returned from `package.name`.
375+
pub fn kit_name(&self) -> &str {
376+
self.build_kit()
377+
.and_then(|b| b.kit_name.as_deref())
378+
.unwrap_or_else(|| self.manifest_name())
379+
}
380+
372381
/// Convenience method to find whether the package is sensitive to variant changes.
373382
pub fn variant_sensitive(&self) -> Option<&VariantSensitivity> {
374383
self.build_package()
@@ -542,7 +551,7 @@ pub struct BuildPackage {
542551
#[serde(rename_all = "kebab-case")]
543552
#[allow(dead_code)]
544553
pub struct BuildKit {
545-
pub included_packages: Option<Vec<String>>,
554+
pub kit_name: Option<String>,
546555
}
547556

548557
#[derive(Deserialize, Debug)]

twoliter/embedded/Makefile.toml

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ BUILDSYS_ARCH = { script = ['echo "${BUILDSYS_ARCH:-$(uname -m)}"'] }
1111
BUILDSYS_ROOT_DIR = "${CARGO_MAKE_WORKING_DIRECTORY}"
1212
BUILDSYS_BUILD_DIR = "${BUILDSYS_ROOT_DIR}/build"
1313
BUILDSYS_PACKAGES_DIR = "${BUILDSYS_BUILD_DIR}/rpms"
14+
BUILDSYS_KITS_DIR = "${BUILDSYS_BUILD_DIR}/kits"
1415
BUILDSYS_STATE_DIR = "${BUILDSYS_BUILD_DIR}/state"
1516
BUILDSYS_IMAGES_DIR = "${BUILDSYS_BUILD_DIR}/images"
1617
BUILDSYS_TOOLS_DIR = "${BUILDSYS_ROOT_DIR}/tools"
@@ -280,6 +281,7 @@ fi
280281
mkdir -p ${BUILDSYS_BUILD_DIR}
281282
mkdir -p ${BUILDSYS_OUTPUT_DIR}
282283
mkdir -p ${BUILDSYS_PACKAGES_DIR}
284+
mkdir -p ${BUILDSYS_KITS_DIR}
283285
mkdir -p ${BUILDSYS_STATE_DIR}
284286
mkdir -p ${BUILDSYS_METADATA_DIR}
285287
mkdir -p ${GO_MOD_CACHE}
@@ -1531,11 +1533,13 @@ extend = "_upload-ova-base"
15311533
dependencies = [
15321534
"clean-sources",
15331535
"clean-packages",
1536+
"clean-kits",
15341537
"clean-images",
15351538
"clean-repos",
15361539
"clean-state",
15371540
"clean-tools",
15381541
"clean-metadata",
1542+
"clean-workspace",
15391543
]
15401544

15411545
[tasks.clean-sources]
@@ -1551,12 +1555,27 @@ rm -f ${BUILDSYS_TOOLS_DIR}/bin/*
15511555
'''
15521556
]
15531557

1558+
[tasks.clean-workspace]
1559+
script_runner = "bash"
1560+
script = [
1561+
'''
1562+
cargo clean --manifest-path "${BUILDSYS_ROOT_DIR}/Cargo.toml"
1563+
'''
1564+
]
1565+
15541566
[tasks.clean-packages]
15551567
script_runner = "bash"
15561568
script = [
15571569
'''
15581570
rm -rf ${BUILDSYS_PACKAGES_DIR}
1559-
cargo clean --manifest-path "${BUILDSYS_ROOT_DIR}/Cargo.toml"
1571+
'''
1572+
]
1573+
1574+
[tasks.clean-kits]
1575+
script_runner = "bash"
1576+
script = [
1577+
'''
1578+
rm -rf ${BUILDSYS_KITS_DIR}
15601579
'''
15611580
]
15621581

0 commit comments

Comments
 (0)