Skip to content

Commit

Permalink
Create oci_image_layout bazel rule.
Browse files Browse the repository at this point in the history
This commit creates a bazel rule that produces an OCI Image Format
directory based on a provided OCI Image index. The OCI Image Layout
is a standardized OCI format described in
https://github.com/opencontainers/image-spec/blob/main/image-layout.md.
  • Loading branch information
captainreality committed May 23, 2024
1 parent 4b76523 commit 1f2aaaf
Show file tree
Hide file tree
Showing 4 changed files with 117 additions and 0 deletions.
27 changes: 27 additions & 0 deletions docs/docs.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,33 @@ Create a tarball and an OCI descriptor for it
| <a id="oci_image_layer-symlinks"></a>symlinks | Dictionary of symlink -&gt; target entries to place in the tarball | <a href="https://bazel.build/docs/skylark/lib/dict.html">Dictionary: String -> String</a> | optional | {} |


<a id="#oci_image_layout"></a>

## oci_image_layout

<pre>
oci_image_layout(<a href="#oci_image_layout-name">name</a>, <a href="#oci_image_layout-manifest">manifest</a>, <a href="#oci_image_layout-registry">registry</a>, <a href="#oci_image_layout-repository">repository</a>)
</pre>


Writes an OCI Image Index and related blobs to an OCI Image Format
directory. See https://github.com/opencontainers/image-spec/blob/main/image-layout.md
for the specification of the OCI Image Format directory. Local blobs are
used where available, and if a referenced blob is not present, it is
fetched from the provided OCI repository and placed in the output.


**ATTRIBUTES**


| Name | Description | Type | Mandatory | Default |
| :------------- | :------------- | :------------- | :------------- | :------------- |
| <a id="oci_image_layout-name"></a>name | A unique name for this target. | <a href="https://bazel.build/docs/build-ref.html#name">Name</a> | required | |
| <a id="oci_image_layout-manifest"></a>manifest | An OCILayout index to be written to the OCI Image Format directory. | <a href="https://bazel.build/docs/build-ref.html#labels">Label</a> | optional | None |
| <a id="oci_image_layout-registry"></a>registry | A registry host that contains images referenced by the OCILayout index, if not present consult the toolchain. | String | optional | "" |
| <a id="oci_image_layout-repository"></a>repository | A repository that contains images referenced by the OCILayout index, if not present consult the toolchain. | String | optional | "" |


<a id="#oci_pull"></a>

## oci_pull
Expand Down
11 changes: 11 additions & 0 deletions oci/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ bzl_library(
visibility = ["//visibility:public"],
deps = [
":image",
":oci_image_layout",
":pull",
":push",
],
Expand All @@ -64,6 +65,16 @@ bzl_library(
deps = ["@com_github_datadog_rules_oci//oci:providers"],
)

bzl_library(
name = "oci_image_layout",
srcs = ["oci_image_layout.bzl"],
visibility = ["//visibility:public"],
deps = [
"@com_github_datadog_rules_oci//oci:debug_flag",
"@com_github_datadog_rules_oci//oci:providers",
],
)

bzl_library(
name = "push",
srcs = ["push.bzl"],
Expand Down
2 changes: 2 additions & 0 deletions oci/defs.bzl
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
load(":pull.bzl", _oci_pull = "oci_pull")
load(":push.bzl", _oci_push = "oci_push")
load(":image.bzl", _oci_image = "oci_image", _oci_image_index = "oci_image_index", _oci_image_layer = "oci_image_layer")
load(":oci_image_layout.bzl", _oci_image_layout = "oci_image_layout")

oci_pull = _oci_pull
oci_push = _oci_push

oci_image = _oci_image
oci_image_index = _oci_image_index
oci_image_layer = _oci_image_layer
oci_image_layout = _oci_image_layout
77 changes: 77 additions & 0 deletions oci/oci_image_layout.bzl
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
load("@com_github_datadog_rules_oci//oci:providers.bzl", "OCIDescriptor", "OCILayout")
load("@com_github_datadog_rules_oci//oci:debug_flag.bzl", "DebugInfo")

def _oci_image_layout_impl(ctx):
toolchain = ctx.toolchains["@com_github_datadog_rules_oci//oci:toolchain"]

layout = ctx.attr.manifest[OCILayout]

out_dir = ctx.actions.declare_directory(ctx.label.name)

ctx.actions.write(
content = """#!/usr/bin/env bash
set -euo pipefail
{tool} \\
--layout {layout} \\
--debug={debug} \\
create-oci-image-layout \\
--layout-relative {root} \\
--desc {desc} \\
--registry {registry} \\
--repository {repository} \\
--out_dir {out_dir}
""".format(
root = ctx.bin_dir.path,
tool = toolchain.sdk.ocitool.short_path,
layout = layout.blob_index.short_path,
desc = ctx.attr.manifest[OCIDescriptor].descriptor_file.short_path,
registry = ctx.attr.registry,
repository = ctx.attr.repository,
out_dir = out_dir,
debug = str(ctx.attr._debug[DebugInfo].debug),
),
output = ctx.outputs.executable,
is_executable = True,
)

return DefaultInfo(files = depset([out_dir]))

oci_image_layout = rule(
doc = """
Writes an OCI Image Index and related blobs to an OCI Image Format
directory. See https://github.com/opencontainers/image-spec/blob/main/image-layout.md
for the specification of the OCI Image Format directory. Local blobs are
used where available, and if a referenced blob is not present, it is
fetched from the provided OCI repository and placed in the output.
""",
implementation = _oci_image_layout_impl,
executable = True,
attrs = {
"manifest": attr.label(
doc = """
An OCILayout index to be written to the OCI Image Format directory.
""",
providers = [OCILayout],
),
"registry": attr.string(
doc = """
A registry host that contains images referenced by the OCILayout index,
if not present consult the toolchain.
""",
),
"repository": attr.string(
doc = """
A repository that contains images referenced by the OCILayout index,
if not present consult the toolchain.
""",
),
"_debug": attr.label(
default = "//oci:debug",
providers = [DebugInfo],
),
},
provides = [
DefaultInfo,
],
toolchains = ["@com_github_datadog_rules_oci//oci:toolchain"],
)

0 comments on commit 1f2aaaf

Please sign in to comment.