| load("@aspect_bazel_lib//lib:copy_to_bin.bzl", "copy_to_bin") |
| load("@aspect_bazel_lib//lib:transitions.bzl", "platform_transition_filegroup") |
| load("@aspect_rules_js//js:defs.bzl", "js_binary", "js_image_layer") |
| load("@io_bazel_rules_docker//container:container.bzl", "container_image") |
| load("@io_bazel_rules_docker//container:layer.bzl", "container_layer") |
| load("@io_bazel_rules_docker//contrib:test.bzl", "container_test") |
| load("@npm//:defs.bzl", "npm_link_all_packages") |
| |
| npm_link_all_packages(name = "node_modules") |
| |
| platform( |
| name = "arm64_linux", |
| constraint_values = [ |
| "@platforms//os:linux", |
| "@platforms//cpu:arm64", |
| ], |
| ) |
| |
| copy_to_bin( |
| name = "ascii", |
| srcs = ["src/ascii.art"], |
| ) |
| |
| platform_transition_filegroup( |
| name = "transition", |
| srcs = ["ascii"], |
| target_platform = ":arm64_linux", |
| ) |
| |
| js_binary( |
| name = "bin", |
| args = ["foo"], |
| chdir = package_name(), |
| data = [ |
| "transition", |
| "//:node_modules/chalk", |
| ], |
| entry_point = "src/main.js", |
| ) |
| |
| # Image |
| js_image_layer( |
| name = "layers", |
| binary = ":bin", |
| generate_empty_layers = True, |
| root = "/app", |
| visibility = ["//visibility:__pkg__"], |
| ) |
| |
| filegroup( |
| name = "node_tar", |
| srcs = [":layers"], |
| output_group = "node", |
| ) |
| |
| container_layer( |
| name = "node_layer", |
| tars = [":node_tar"], |
| ) |
| |
| filegroup( |
| name = "package_store_3p_tar", |
| srcs = [":layers"], |
| output_group = "package_store_3p", |
| ) |
| |
| container_layer( |
| name = "package_store_3p_layer", |
| tars = [":package_store_3p_tar"], |
| ) |
| |
| filegroup( |
| name = "package_store_1p_tar", |
| srcs = [":layers"], |
| output_group = "package_store_1p", |
| ) |
| |
| container_layer( |
| name = "package_store_1p_layer", |
| tars = [":package_store_1p_tar"], |
| ) |
| |
| filegroup( |
| name = "node_modules_tar", |
| srcs = [":layers"], |
| output_group = "node_modules", |
| ) |
| |
| container_layer( |
| name = "node_modules_layer", |
| tars = [":node_modules_tar"], |
| ) |
| |
| filegroup( |
| name = "app_tar", |
| srcs = [":layers"], |
| output_group = "app", |
| ) |
| |
| container_layer( |
| name = "app_layer", |
| tars = [":app_tar"], |
| ) |
| |
| container_image( |
| name = "image", |
| architecture = "amd64", # or arm64 |
| # Since js_binary depends on bash we have to bring in a base image that has bash |
| base = "@debian_amd64//image", # or "@debian_arm64//image", if you are on an arm machine |
| # This is `/[js_image_layer 'root']/[package name of js_image_layer 'binary' target]/[name of js_image_layer 'binary' target]` |
| cmd = ["/app/bin"], |
| entrypoint = ["bash"], |
| layers = [ |
| ":node_layer", |
| ":package_store_3p_layer", |
| ":package_store_1p_layer", |
| ":node_modules_layer", |
| ":app_layer", |
| ], |
| # This is `cmd` + `.runfiles/[workspace name]` |
| workdir = select({ |
| "@aspect_bazel_lib//lib:bzlmod": "/app/src/bin.runfiles/_main", |
| "//conditions:default": "/app/src/bin.runfiles/__main__", |
| }), |
| ) |
| |
| container_test( |
| name = "image_test", |
| configs = [":smoketest.yaml"], |
| image = ":image", |
| # ./image_test.image: line 214: /usr/bin/docker: No such file or directory |
| tags = ["no-remote-exec"], |
| ) |