blob: f79e0e3c1b615611ad121c53183536ec13eb5f7c [file] [log] [blame]
load("@pydeps//:requirements.bzl", "requirement")
load("@rules_python//python:defs.bzl", "py_binary")
load("@io_bazel_rules_docker//python:image.bzl", "py_layer")
load("@io_bazel_rules_docker//python3:image.bzl", "py3_image")
load("@io_bazel_rules_docker//container:container.bzl", "container_layer", "container_image")
load("@io_bazel_rules_docker//docker/util:run.bzl", "container_run_and_extract", "container_run_and_commit_layer")
load("@io_bazel_rules_docker//docker/package_managers:download_pkgs.bzl", "download_pkgs")
load("@io_bazel_rules_docker//docker/package_managers:install_pkgs.bzl", "install_pkgs")
# - - base docker stuff - -
download_pkgs(
name = "apt_py_is_py3",
image_tar = "@python-debian//image",
packages = [
# rules_docker python wants /usr/bin/python
"python-is-python3",
],
)
install_pkgs(
name = "base_image",
output_image_name = "base_image",
image_tar = "@python-debian//image",
installables_tar = ":apt_py_is_py3.tar",
installation_cleanup_commands = "rm -rf /var/lib/apt/lists/* /usr/share/doc && apt remove -y libbluetooth3 mariadb-common tk && apt autoremove -y",
)
BASE_IMAGE = ":base_image"
# overkill rube goldberg setup to build static files begins
# - - - -
container_run_and_extract(
name = "static_pack",
commands = [
"tar cpJvf /out.tar.xz -C /opt/mailman/web/static ./",
],
extract_file = "/out.tar.xz",
image = ":static_build_image.tar",
)
container_image(
name = "static_build_image",
layers = [":static_build_layer"],
base = BASE_IMAGE,
)
# this will also contain .pyc files, but the python binary will be the same
# on prod, so it's fine
container_run_and_commit_layer(
name = "static_build_layer",
commands = [
"./app/mailman-web/manage collectstatic",
"./app/mailman-web/manage compress",
# gettext is cursed, TODO make this work
#"./app/mailman-web/manage compilemessages",
],
image = ":build_container.tar",
docker_run_flags = ["--entrypoint="],
)
py3_image(
name = "build_container",
srcs = [":manage"],
main = "manage.py",
base = ":build_tools_container",
layers = [":deps_layer"],
# this doesn't work for some reason - this is always rebuilt, unless
# you pass --nostamp globally
stamp = 0,
)
download_pkgs(
name = "build_tools",
image_tar = "@python-debian//image",
packages = [
"sassc",
"gettext",
],
)
install_pkgs(
name = "build_tools_container",
output_image_name = "build_tools_container",
image_tar = BASE_IMAGE + '.tar',
installables_tar = ":build_tools.tar",
installation_cleanup_commands = "rm -rf /var/lib/apt/lists/* /usr/share/doc",
)
# - - - -
# overkill rube goldberg setup to build static files ends
# - - python stuff - -
# this is purely a build optimization - put the pip deps into a separate layer
py_layer(
name = "deps_layer",
deps = [
requirement("Django"),
requirement("postorius"),
requirement("hyperkitty"),
requirement("gunicorn"),
requirement("psycopg2-binary"),
],
)
py_library(
name = "django_base",
srcs = ["settings.py", "urls.py"]
+ glob(["upstream_settings/*.py"]),
deps = [
requirement("Django"),
requirement("postorius"),
requirement("hyperkitty"),
requirement("gunicorn"),
requirement("psycopg2-binary"),
],
)
py_binary(
name = "manage",
srcs = ["manage.py"],
deps = [":django_base"],
)
py_binary(
name = "serve",
srcs = ["serve.py"],
deps = [":django_base"],
)
# prod docker image
py3_image(
name = "mailman-web",
srcs = ["container_main.py"],
deps = [
":django_base",
":manage",
":serve",
],
layers = [
":deps_layer",
],
main = "container_main.py",
#base = ":base_container"
base = ":static_build_image",
)