Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions MODULE.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ bazel_dep(name = "bazel_skylib", version = "1.9.0")
bazel_dep(name = "platforms", version = "1.0.0")
bazel_dep(name = "hermetic_launcher", version = "0.0.5")
bazel_dep(name = "package_metadata", version = "0.0.10")
bazel_dep(name = "rules_pkg_providers", version = "0.0.1")
bazel_dep(name = "rules_runfiles_group", version = "0.0.1-rc.5")

prebuilt_img_tool = use_extension("@rules_img//img/private/prebuilt:prebuilt.bzl", "prebuilt_img_tool")
Expand Down
2 changes: 2 additions & 0 deletions MODULE.bazel.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

75 changes: 74 additions & 1 deletion e2e/generic/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@ load("@bazel_skylib//rules:build_test.bzl", "build_test")
load("@bazel_skylib//rules:copy_directory.bzl", "copy_directory")
load("@bazel_skylib//rules:write_file.bzl", "write_file")
load("@rules_img//img:image.bzl", "image_index", "image_manifest")
load("@rules_img//img:layer.bzl", "file_metadata", "image_layer")
load("@rules_img//img:layer.bzl", "file_metadata", "image_layer", "layer_from_pkg")
load("@rules_img//img:push.bzl", "image_push")
load("@rules_img_images.bzl", "image")
load("@rules_pkg//pkg:tar.bzl", "pkg_tar")
load(":bzl/fake_pkg.bzl", "fake_pkg_filegroup", "fake_pkg_files", "fake_pkg_mkdirs", "fake_pkg_symlink")
load("@rules_shell//shell:sh_binary.bzl", "sh_binary")
load(":bzl/binary_with_runfiles_symlinks.bzl", "binary_with_runfiles_symlinks")
load(":bzl/gen_link.bzl", "gen_dir_link")
Expand Down Expand Up @@ -693,6 +694,77 @@ image_push(
visibility = ["//visibility:public"],
)

# pkg_files/pkg_filegroup integration tests for layer_from_pkg
# Uses fake_pkg_* fixtures that emit rules_pkg_providers providers directly.
# Once rules_pkg itself migrates to rules_pkg_providers, real pkg_files
# targets can be passed to layer_from_pkg without an adapter.
fake_pkg_files(
name = "pkg_bin_files",
srcs = [":executable_script"],
prefix = "/usr/local/bin",
)

fake_pkg_files(
name = "pkg_data_files",
srcs = [
":large_file",
":unicode_file",
],
prefix = "/app/data",
)

fake_pkg_symlink(
name = "pkg_bin_link",
link_name = "/usr/bin/script",
target = "/usr/local/bin/script.sh",
)

fake_pkg_mkdirs(
name = "pkg_log_dirs",
dirs = ["/var/log/app"],
)

fake_pkg_filegroup(
name = "app_pkg",
srcs = [
":pkg_bin_files",
":pkg_bin_link",
":pkg_data_files",
":pkg_log_dirs",
],
)

# Layer built from a single pkg_files target
layer_from_pkg(
name = "layer_from_single_pkg_files",
srcs = [":pkg_bin_files"],
)

# Layer built from a pkg_filegroup (files + symlinks + dirs)
layer_from_pkg(
name = "layer_from_pkg_filegroup",
srcs = [":app_pkg"],
)

# Layer mixing multiple pkg_files and pkg_mklink targets directly
layer_from_pkg(
name = "layer_from_mixed_pkg_srcs",
srcs = [
":pkg_bin_files",
":pkg_bin_link",
":pkg_data_files",
],
)

build_test(
name = "pkg_files_layer_tests",
targets = [
":layer_from_mixed_pkg_srcs",
":layer_from_pkg_filegroup",
":layer_from_single_pkg_files",
],
)

build_test(
name = "all_tests",
targets = [
Expand All @@ -701,5 +773,6 @@ build_test(
":index_tests",
":push_tests",
":platform_transition_tests",
":pkg_files_layer_tests",
],
)
1 change: 1 addition & 0 deletions e2e/generic/MODULE.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ bazel_dep(name = "container_structure_test", version = "1.22.1")
bazel_dep(name = "platforms", version = "0.0.11")
bazel_dep(name = "rules_distroless", version = "0.8.0")
bazel_dep(name = "rules_pkg", version = "1.2.0")
bazel_dep(name = "rules_pkg_providers", version = "0.0.1")
bazel_dep(name = "rules_python", version = "2.0.0")
bazel_dep(name = "rules_runfiles_group", version = "0.0.1-rc.5")
bazel_dep(name = "rules_shell", version = "0.8.0")
Expand Down
104 changes: 104 additions & 0 deletions e2e/generic/bzl/fake_pkg.bzl
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
"""Test fixtures that emit rules_pkg_providers providers directly.

These rules mirror pkg_files, pkg_symlink, pkg_mkdirs and pkg_filegroup from
rules_pkg but emit PackageFilesInfo etc. from rules_pkg_providers, which is
what layer_from_pkg consumes. Once rules_pkg itself migrates to
rules_pkg_providers, users will be able to pass pkg_files targets directly.
"""

load("@rules_pkg_providers//:providers.bzl", "PackageDirsInfo", "PackageFilegroupInfo", "PackageFilesInfo", "PackageSymlinkInfo")

def _fake_pkg_files_impl(ctx):
prefix = ctx.attr.prefix.removesuffix("/")
dest_src_map = {}
for f in ctx.files.srcs:
dest = (prefix + "/" + f.basename) if prefix else f.basename
dest_src_map[dest] = f
return [
PackageFilesInfo(dest_src_map = dest_src_map, attributes = {}),
DefaultInfo(files = depset(ctx.files.srcs)),
]

fake_pkg_files = rule(
doc = "Emit PackageFilesInfo (from rules_pkg_providers) for a set of files.",
implementation = _fake_pkg_files_impl,
attrs = {
"srcs": attr.label_list(allow_files = True),
"prefix": attr.string(default = ""),
},
provides = [PackageFilesInfo],
)

def _fake_pkg_symlink_impl(ctx):
return [
PackageSymlinkInfo(
destination = ctx.attr.link_name,
target = ctx.attr.target,
attributes = {},
),
]

fake_pkg_symlink = rule(
doc = "Emit PackageSymlinkInfo (from rules_pkg_providers) for a single symlink.",
implementation = _fake_pkg_symlink_impl,
attrs = {
"link_name": attr.string(mandatory = True),
"target": attr.string(mandatory = True),
},
provides = [PackageSymlinkInfo],
)

def _fake_pkg_mkdirs_impl(ctx):
return [
PackageDirsInfo(dirs = ctx.attr.dirs, attributes = {}),
]

fake_pkg_mkdirs = rule(
doc = "Emit PackageDirsInfo (from rules_pkg_providers) for a list of directories.",
implementation = _fake_pkg_mkdirs_impl,
attrs = {
"dirs": attr.string_list(mandatory = True),
},
provides = [PackageDirsInfo],
)

def _fake_pkg_filegroup_impl(ctx):
pkg_files = []
pkg_dirs = []
pkg_symlinks = []
for src in ctx.attr.srcs:
if PackageFilegroupInfo in src:
fg = src[PackageFilegroupInfo]
pkg_files.extend(fg.pkg_files)
pkg_dirs.extend(fg.pkg_dirs)
pkg_symlinks.extend(fg.pkg_symlinks)
if PackageFilesInfo in src:
pkg_files.append((src[PackageFilesInfo], src.label))
if PackageDirsInfo in src:
pkg_dirs.append((src[PackageDirsInfo], src.label))
if PackageSymlinkInfo in src:
pkg_symlinks.append((src[PackageSymlinkInfo], src.label))
return [
PackageFilegroupInfo(
pkg_files = pkg_files,
pkg_dirs = pkg_dirs,
pkg_symlinks = pkg_symlinks,
),
DefaultInfo(),
]

fake_pkg_filegroup = rule(
doc = "Aggregate PackageFilesInfo/PackageSymlinkInfo/PackageDirsInfo into PackageFilegroupInfo.",
implementation = _fake_pkg_filegroup_impl,
attrs = {
"srcs": attr.label_list(
providers = [
[PackageFilesInfo],
[PackageFilegroupInfo],
[PackageSymlinkInfo],
[PackageDirsInfo],
],
),
},
provides = [PackageFilegroupInfo],
)
1 change: 1 addition & 0 deletions img/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ bzl_library(
"//img/private:layer",
"//img/private:layer_from_binary",
"//img/private:layer_from_file",
"//img/private:layer_from_pkg",
"//img/private:layer_from_tar",
],
)
Expand Down
2 changes: 2 additions & 0 deletions img/layer.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,12 @@ load("//img/private:file_metadata.bzl", _file_metadata = "file_metadata")
load("//img/private:layer.bzl", _image_layer = "image_layer")
load("//img/private:layer_from_binary.bzl", _layer_from_binary = "layer_from_binary")
load("//img/private:layer_from_file.bzl", _layer_from_file = "layer_from_file")
load("//img/private:layer_from_pkg.bzl", _layer_from_pkg = "layer_from_pkg")
load("//img/private:layer_from_tar.bzl", _layer_from_tar = "layer_from_tar")

image_layer = _image_layer
layer_from_binary = _layer_from_binary
layer_from_file = _layer_from_file
layer_from_pkg = _layer_from_pkg
layer_from_tar = _layer_from_tar
file_metadata = _file_metadata
19 changes: 19 additions & 0 deletions img/private/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,25 @@ bzl_library(
],
)

bzl_library(
name = "rules_pkg_providers",
srcs = ["@rules_pkg_providers//:providers.bzl"],
visibility = ["//img:__subpackages__"],
)

bzl_library(
name = "layer_from_pkg",
srcs = ["layer_from_pkg.bzl"],
visibility = ["//img:__subpackages__"],
deps = [
":rules_pkg_providers",
"//img/private/common:build",
"//img/private/common:layer_attrs",
"//img/private/common:tar_layer",
"//img/private/providers:layers_info",
],
)

bzl_library(
name = "layer_from_tar",
srcs = ["layer_from_tar.bzl"],
Expand Down
Loading