Skip to content

Commit

Permalink
fix: apt.deb_index should work without a lock (#70)
Browse files Browse the repository at this point in the history
* fix: apt.deb_index should work without a lock

* chore: rename the extension

* make package_template a label

* typo
  • Loading branch information
thesayyn authored Aug 9, 2024
1 parent 04ba624 commit b07822e
Show file tree
Hide file tree
Showing 19 changed files with 268 additions and 269 deletions.
5 changes: 3 additions & 2 deletions MODULE.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,9 @@ module(

bazel_dep(name = "bazel_skylib", version = "1.5.0")
bazel_dep(name = "aspect_bazel_lib", version = "2.7.3")
bazel_dep(name = "container_structure_test", version = "1.16.0")
bazel_dep(name = "rules_oci", version = "1.7.4")

bazel_lib_toolchains = use_extension("@aspect_bazel_lib//lib:extensions.bzl", "toolchains")
use_repo(bazel_lib_toolchains, "zstd_toolchains")
use_repo(bazel_lib_toolchains, "bsd_tar_toolchains")
use_repo(bazel_lib_toolchains, "yq_darwin_amd64")
use_repo(bazel_lib_toolchains, "yq_darwin_arm64")
Expand All @@ -25,3 +24,5 @@ bazel_dep(name = "gazelle", version = "0.34.0", dev_dependency = True, repo_name
bazel_dep(name = "bazel_skylib_gazelle_plugin", version = "1.5.0", dev_dependency = True)
bazel_dep(name = "buildifier_prebuilt", version = "6.1.2", dev_dependency = True)
bazel_dep(name = "platforms", version = "0.0.10", dev_dependency = True)
bazel_dep(name = "rules_oci", version = "2.0.0-beta1", dev_dependency = True)
bazel_dep(name = "container_structure_test", version = "1.16.0", dev_dependency = True)
12 changes: 12 additions & 0 deletions apt/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,15 @@ bzl_library(
"//apt/private:resolve",
],
)

bzl_library(
name = "extensions",
srcs = ["extensions.bzl"],
visibility = ["//visibility:public"],
deps = [
"//apt/private:deb_import",
"//apt/private:index",
"//apt/private:lockfile",
"//apt/private:resolve",
],
)
84 changes: 50 additions & 34 deletions apt/extensions.bzl
Original file line number Diff line number Diff line change
@@ -1,59 +1,75 @@
"extensions for bzlmod"
"apt extensions"

load("//apt/private:index.bzl", _deb_package_index = "deb_package_index", _deb_package_index_bzlmod = "deb_package_index_bzlmod")
load("//apt/private:resolve.bzl", _deb_resolve = "deb_resolve")

deb_index = tag_class(attrs = {
"name": attr.string(doc = "Name of the generated repository"),
"lock": attr.label(doc = """The lock file to use for the index."""),
"manifest": attr.label(doc = """The file used to generate the lock file"""),
"resolve_transitive": attr.bool(
doc = """Whether dependencies of dependencies should be resolved and added to the lockfile.""",
default = True,
),
})
load("//apt/private:deb_import.bzl", "deb_import")
load("//apt/private:index.bzl", _deb_package_index = "deb_package_index")
load("//apt/private:lockfile.bzl", "lockfile")
load("//apt/private:resolve.bzl", "internal_resolve")

def _distroless_extension(module_ctx):
root_direct_deps = []
root_direct_dev_deps = []
for mod in module_ctx.modules:
for deb_index in mod.tags.deb_index:
_deb_package_index_bzlmod(
module_ctx = module_ctx,
name = deb_index.name,
lock = deb_index.lock,
)

_deb_resolve(
name = deb_index.name + "_resolution",
manifest = deb_index.manifest,
resolve_transitive = deb_index.resolve_transitive,
)
for install in mod.tags.install:
lockf = None
if not install.lock:
lockf = internal_resolve(
module_ctx,
"yq",
install.manifest,
install.resolve_transitive,
)

if not deb_index.lock:
# buildifier: disable=print
print("\nNo lockfile was given, please run `bazel run @%s//:lock` to create the lockfile." % deb_index.name)
print("\nNo lockfile was given, please run `bazel run @%s//:lock` to create the lockfile." % install.name)
else:
lockf = lockfile.from_json(module_ctx, module_ctx.read(install.lock))

for (package) in lockf.packages():
package_key = lockfile.make_package_key(
package["name"],
package["version"],
package["arch"],
)

deb_import(
name = "%s_%s" % (install.name, package_key),
urls = [package["url"]],
sha256 = package["sha256"],
)

_deb_package_index(
name = deb_index.name,
lock = deb_index.lock if deb_index.lock else "@" + deb_index.name + "_resolution//:lock.json",
bzlmod = True,
name = install.name,
lock = install.lock,
manifest = install.manifest,
package_template = install.package_template,
lock_content = lockf.as_json(),
)

if mod.is_root:
if module_ctx.is_dev_dependency(deb_index):
root_direct_dev_deps.append(deb_index.name)
if module_ctx.is_dev_dependency(install):
root_direct_dev_deps.append(install.name)
else:
root_direct_deps.append(deb_index.name)
root_direct_deps.append(install.name)

return module_ctx.extension_metadata(
root_module_direct_deps = root_direct_deps,
root_module_direct_dev_deps = root_direct_dev_deps,
)

install = tag_class(attrs = {
"name": attr.string(doc = "Name of the generated repository"),
"lock": attr.label(doc = """The lock file to use for the index."""),
"manifest": attr.label(doc = """The file used to generate the lock file"""),
"resolve_transitive": attr.bool(
doc = """Whether dependencies of dependencies should be resolved and added to the lockfile.""",
default = True,
),
"package_template": attr.label(doc = "(EXPERIMENTAL!) a template file for generated BUILD files."),
})

apt = module_extension(
implementation = _distroless_extension,
tag_classes = {
"deb_index": deb_index,
"install": install,
},
)
6 changes: 3 additions & 3 deletions apt/index.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ def deb_index(
```starlark
apt = use_extension("@rules_distroless//apt:extensions.bzl", "apt")
apt.deb_index(
apt.install(
name = "bullseye",
lock = "//examples/apt:bullseye.lock.json",
manifest = "//examples/apt:bullseye.yaml",
Expand Down Expand Up @@ -73,7 +73,7 @@ def deb_index(
name: name of the repository
manifest: label to a `manifest.yaml`
lock: label to a `lock.json`
package_template: (EXPERIMENTAL!) a template string for generated BUILD files.
package_template: (EXPERIMENTAL!) a template file for generated BUILD files.
Available template replacement keys are: `{target_name}`, `{deps}`, `{urls}`, `{name}`, `{arch}`, `{sha256}`, `{repo_name}`
resolve_transitive: whether dependencies of dependencies should be resolved and added to the lockfile.
"""
Expand All @@ -89,7 +89,7 @@ def deb_index(

_deb_package_index(
name = name,
manifest = manifest,
lock = lock if lock else "@" + name + "_resolution//:lock.json",
package_template = package_template,
bzlmod = False,
)
8 changes: 8 additions & 0 deletions apt/private/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ load("@bazel_skylib//:bzl_library.bzl", "bzl_library")
exports_files([
"dpkg_statusd.sh",
"dpkg_status.sh",
"package.BUILD.tmpl",
])

bzl_library(
Expand Down Expand Up @@ -70,6 +71,13 @@ bzl_library(
deps = ["@aspect_bazel_lib//lib:strings"],
)

bzl_library(
name = "deb_import",
srcs = ["deb_import.bzl"],
visibility = ["//apt:__subpackages__"],
deps = ["@bazel_tools//tools/build_defs/repo:http.bzl"],
)

bzl_library(
name = "util",
srcs = ["util.bzl"],
Expand Down
29 changes: 29 additions & 0 deletions apt/private/deb_import.bzl
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
"deb_import"

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")

# BUILD.bazel template
_DEB_IMPORT_BUILD_TMPL = """
# TODO: https://github.com/bazel-contrib/rules_oci/pull/523
_RECOMPRESS_CMD = "$(ZSTD_BIN) -f --decompress $< --stdout | $(ZSTD_BIN) - --format=gzip >$@"
genrule(
name = "data",
srcs = glob(["data.tar.*"]),
outs = ["data.tar.gz"],
cmd = _RECOMPRESS_CMD,
toolchains = ["@zstd_toolchains//:resolved_toolchain"],
visibility = ["//visibility:public"],
)
filegroup(
name = "control",
srcs = glob(["control.tar.*"]),
visibility = ["//visibility:public"],
)
"""

def deb_import(**kwargs):
http_archive(
build_file_content = _DEB_IMPORT_BUILD_TMPL,
**kwargs
)
Loading

0 comments on commit b07822e

Please sign in to comment.