From: Aaron Conole <aconole@redhat.com>
To: Adam Hassick <ahassick@iol.unh.edu>
Cc: ci@dpdk.org, alialnu@nvidia.com, Owen Hilyard <ohilyard@iol.unh.edu>
Subject: Re: [PATCH v8 6/6] containers/Makefile: Makefile to automate builds
Date: Fri, 04 Aug 2023 10:06:29 -0400 [thread overview]
Message-ID: <f7th6pe6gwq.fsf@redhat.com> (raw)
In-Reply-To: <20230717210815.29737-7-ahassick@iol.unh.edu> (Adam Hassick's message of "Mon, 17 Jul 2023 17:08:15 -0400")
Adam Hassick <ahassick@iol.unh.edu> writes:
> From: Owen Hilyard <ohilyard@iol.unh.edu>
>
> The Makefile that can be used to build all of the container images using
> "make build", and can also be used to push them to a remote repository
> (for use in CI).
>
> Signed-off-by: Owen Hilyard <ohilyard@iol.unh.edu>
> Signed-off-by: Adam Hassick <ahassick@iol.unh.edu>
> ---
> containers/Makefile | 250 ++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 250 insertions(+)
> create mode 100644 containers/Makefile
>
> diff --git a/containers/Makefile b/containers/Makefile
> new file mode 100644
> index 0000000..1eec6a0
> --- /dev/null
> +++ b/containers/Makefile
> @@ -0,0 +1,250 @@
> +# SPDX-License-Identifier: BSD-3-Clause
> +# Copyright (c) 2022 University of New Hampshire
2023?
> +
> +# Recommended Resources:
> +# All:
> +# ~100 GB of disk space: These are not minimal containers, they
> +# have full distros in them minus the kernel.
> +# With ABI images, expect 10 GB per distro per
> +# platform. Without, it's closer to 2 GB per distro
> +# per platform.
> +#
> +# No ABI:
> +# Serial Build (make -j 1): Should run on any post 2010 system reasonably well.
2010 was 13 years ago, and long before DPDK used IOL. We can probably
eliminate this part of the comment. I don't think it makes sense here.
> +# Parallel build (make -j $(nproc)): 1 GB of free ram per job should be good enough.
> +# ABI:
> +# Time: If you are building more than four distros, or you have one distro that is built under
> +# emulation (x86 host + arm container or the inverse), it may be best to run it overnight.
> +# Some versions of qemu + podman will try to compile with a single thread under emulation,
> +# which can cause what should be an hour-long compile to turn into a 8+ hour compile.
> +# Serial Build (make -j 1): 6 GB of free ram should be fine
> +# Parallel build (make -j $(nproc)): 6 GB of free ram per job. You may be compiling ~20 versions of DPDK at the same time, with some under emulation.
> +#
> +
> +
> +############ Arguments #############
> +# Set to 'Y' to override distro detection
> +DPDK_CI_CONTAINERS_ON_RHEL?=$(shell (test -f /etc/redhat-release && grep -q 'Red Hat Enterprise Linux' /etc/redhat-release && echo 'Y') || echo 'N')
> +
> +# If set to 'Y' and any container is detected as unbuildable, fail the build.
> +DPDK_CI_CONTAINERS_FAIL_ON_UNBUILDABLE?=N
> +
> +# If set to 'Y', build the ABIs for specificed DPDK versions and embed them
> +# in the container
> +DPDK_CI_CONTAINERS_BUILD_ABI?=N
> +
> +# If set to 'Y', the "latest" tag for all images will be omitted. Intended for testing changes to your inventory.
> +DPDK_CI_CONTAINERS_NO_LATEST_TAG?=N
> +
> +# If set to 'Y', will build containers that rely on the Coverity Scan tool.
> +DPDK_CI_CONTAINERS_COVERITY?=N
> +
> +# The path to Coverity Scan binaries. These will be installed inside the container.
> +# This field is only required if the Coverity flag is enabled.
> +# DPDK_CI_CONTAINERS_COVERITY_PATH?=/opt/dpdklab/coverity
> +
> +# If set to a non-empty value, overrides the auto-generated date tag with the value.
> +# DPDK_CI_CONTAINERS_DATE_TAG_OVERRIDE=70-01-01
> +
> +# If set to 'Y', build libabigail from source for distros that do not have it.
> +# If DPDK_CI_CONTAINERS_BUILD_ABI='Y', then this is always enabled.
> +ifeq ($(DPDK_CI_CONTAINERS_BUILD_ABI), Y)
> +DPDK_CI_CONTAINERS_BUILD_LIBABIGAIL=Y
> +else
> +DPDK_CI_CONTAINERS_BUILD_LIBABIGAIL?=N
> +endif
> +
> +# If set to an integer value, this will restrict the count of Ninja workers performing the ABI build to the given integer.
> +# The argument is benign if DPDK_CI_CONTANERS_BUILD_ABI is 'N'.
> +# DPDK_CI_CONTAINERS_NINJA_WORKERS?=16
> +
> +# If set to 'Y', only build containers matching the host architecture
> +DPDK_CI_CONTAINERS_ONLY_HOST_ARCH?=N
> +
> +# If set to 'Y', assumes only host arch and disables the push_manifests target.
> +DPDK_CI_CONTAINERS_IS_BUILDER?=N
> +
> +# Used to set the python interpreter
> +DPDK_CI_CONTAINERS_PYTHON3_CMD?=python3.8
> +
> +# The base program to use to build individual containers.
> +DPDK_CI_CONTAINER_BUILDER_PROGRAM?=podman
> +
> +# The url of the git repository to pull libabigail from
> +DPDK_CI_CONTAINERS_LIBABIGAIL_CLONE_URL?=git://sourceware.org/git/libabigail.git
> +
> +# The url of the git repository to pull DPDK from
> +DPDK_CI_CONTAINERS_DPDK_CLONE_URL?=https://dpdk.org/git/dpdk
> +
> +# The url of the git repository to pull DPDK stable from
> +DPDK_CI_CONTAINERS_DPDK_STABLE_CLONE_URL?=https://dpdk.org/git/dpdk-stable
> +
> +# The tag to apply to the built container builder image
> +DPDK_CI_CONTAINERS_CONTAINER_BUILDER_TAG?=dpdk_ci_container_builder
> +
> +# Extra arguments to add to the push command, can be used for credentials
> +DPDK_CI_CONTAINERS_EXTRA_PUSH_ARGS?=
> +
> +# Provide the hostname of the registry to push up to
> +DPDK_CI_CONTAINERS_REGISTRY_HOSTNAME?=localhost
> +
> +# The path to a directory to be recursively copied to $(DPDK_CI_CONTAINERS_CONTEXT_DIRECTORY). Not used if unset.
> +#DPDK_CI_CONTAINERS_EXTRA_SCRIPTS_PATH?=
> +
> +DPDK_CI_CONTAINERS_CONTEXT_DIRECTORY?=$(CURDIR)/container_context
> +############ End Arguments #############
> +
> +############ Internal Variables #############
> +SCRIPT_ARGS=--output-dir "$(DPDK_CI_CONTAINERS_CONTEXT_DIRECTORY)"
> +
> +ifeq ($(DPDK_CI_CONTAINERS_ON_RHEL), Y)
> + SCRIPT_ARGS +=--rhel
> +endif
> +
> +ifeq ($(DPDK_CI_CONTAINERS_FAIL_ON_UNBUILDABLE), Y)
> + SCRIPT_ARGS +=--fail-on-unbuildable
> +endif
> +
> +ifeq ($(DPDK_CI_CONTAINERS_BUILD_ABI), Y)
> + SCRIPT_ARGS +=--build-abi
> +endif
> +
> +ifeq ($(DPDK_CI_CONTAINERS_BUILD_LIBABIGAIL), Y)
> + SCRIPT_ARGS +=--build-libabigail
> +endif
> +
> +ifeq ($(DPDK_CI_CONTAINERS_ONLY_HOST_ARCH), Y)
> + SCRIPT_ARGS +=--host-arch-only
> +endif
> +
> +ifeq ($(DPDK_CI_CONTAINERS_NO_LATEST_TAG), Y)
> + SCRIPT_ARGS +=--omit-latest
> +endif
> +
> +ifeq ($(DPDK_CI_CONTAINERS_IS_BUILDER), Y)
> + SCRIPT_ARGS +=--builder-mode
> +endif
> +
> +ifneq ($(DPDK_CI_CONTAINERS_DATE_TAG_OVERRIDE),)
> + SCRIPT_ARGS +=--date $(DPDK_CI_CONTAINERS_DATE_TAG_OVERRIDE)
> +endif
> +
> +ifneq ($(DPDK_CI_CONTAINERS_NINJA_WORKERS),)
> + SCRIPT_ARGS +=--ninja-workers $(DPDK_CI_CONTAINERS_NINJA_WORKERS)
> +endif
> +
> +ifeq ($(DPDK_CI_CONTAINERS_COVERITY), Y)
> + SCRIPT_ARGS +=--coverity
> +endif
> +
> +SCRIPT_DIRECTORY=$(CURDIR)/template_engine
> +
> +LIBABIGAIL_DIRECTORY=$(DPDK_CI_CONTAINERS_CONTEXT_DIRECTORY)/libabigail
> +DPDK_DIRECTORY=$(DPDK_CI_CONTAINERS_CONTEXT_DIRECTORY)/dpdk
> +DPDK_STABLE_DIRECTORY=$(DPDK_CI_CONTAINERS_CONTEXT_DIRECTORY)/dpdk-stable
> +
> +DOCKERFILE=$(DPDK_CI_CONTAINERS_CONTEXT_DIRECTORY)/Dockerfile
> +
> +MAKE_DOCKERFILE_SCRIPT=$(SCRIPT_DIRECTORY)/make_dockerfile.py
> +MAKE_DOCKERFILE_COMMAND=$(DPDK_CI_CONTAINERS_PYTHON3_CMD) $(MAKE_DOCKERFILE_SCRIPT)
> +
> +TEMPLATE_FILE_DIRECTORY=$(SCRIPT_DIRECTORY)/templates
> +DOCKER_CONTAINER_TEMPLATE_DIR=$(TEMPLATE_FILE_DIRECTORY)/containers
> +
> +INVENTORY_FILE=$(SCRIPT_DIRECTORY)/inventory.yaml
> +
> +EXTRA_SCRIPTS_DIRECTORY=$(DPDK_CI_CONTAINERS_CONTEXT_DIRECTORY)/scripts
> +
> +COVERITY_DIRECTORY=$(DPDK_CI_CONTAINERS_CONTEXT_DIRECTORY)/coverity
> +
> +GIT_FETCH_ARGS=--all --tags
> +
> +CONTAINER_BUILDER_DOCKERFILE=$(CURDIR)/container_builder.dockerfile
> +
> +export
> +############ End Internal Variables #############
> +
> +.PHONY: build push push_images push_manifests make_docker_files_in_container build_builder_container docker_deps extra_scripts libabigail dpdk coverity clean_container_files clean
> +
> +build: make_docker_files_in_container external_files
> + $(MAKE) -C $(DPDK_CI_CONTAINERS_CONTEXT_DIRECTORY) build_all
> +
> +push_images: make_docker_files_in_container external_files
> + $(MAKE) -C $(DPDK_CI_CONTAINERS_CONTEXT_DIRECTORY) push_image_all
> +
> +push_manifests: make_docker_files_in_container
> + $(MAKE) -C $(DPDK_CI_CONTAINERS_CONTEXT_DIRECTORY) push_manifest_all
> +
> +push: push_images push_manifests
> +
> +make_docker_files_in_container: build_builder_container $(DPDK_CI_CONTAINERS_CONTEXT_DIRECTORY)
> + $(DPDK_CI_CONTAINER_BUILDER_PROGRAM) run --rm -v $(CURDIR):/container_workspace:z -v $(DPDK_CI_CONTAINERS_CONTEXT_DIRECTORY):/container_workspace/container_context:z \
> + -e DPDK_CI_CONTAINERS_ON_RHEL=$(DPDK_CI_CONTAINERS_ON_RHEL) \
> + -e DPDK_CI_CONTAINERS_BUILD_LIBABIGAIL=$(DPDK_CI_CONTAINERS_BUILD_LIBABIGAIL) \
> + -e DPDK_CI_CONTAINERS_BUILD_ABI=$(DPDK_CI_CONTAINERS_BUILD_ABI) \
> + -e DPDK_CI_CONTAINERS_FAIL_ON_UNBUILDABLE=$(DPDK_CI_CONTAINERS_FAIL_ON_UNBUILDABLE) \
> + -e DPDK_CI_CONTAINERS_REGISTRY_HOSTNAME='$(DPDK_CI_CONTAINERS_REGISTRY_HOSTNAME)' \
> + -e DPDK_CI_CONTAINERS_ONLY_HOST_ARCH='$(DPDK_CI_CONTAINERS_ONLY_HOST_ARCH)' \
> + -e DPDK_CI_CONTAINERS_NO_LATEST_TAG='$(DPDK_CI_CONTAINERS_NO_LATEST_TAG)' \
> + -e DPDK_CI_CONTAINERS_IS_BUILDER='$(DPDK_CI_CONTAINERS_IS_BUILDER)' \
> + -e DPDK_CI_CONTAINERS_DATE_TAG_OVERRIDE='$(DPDK_CI_CONTAINERS_DATE_TAG_OVERRIDE)' \
> + -e DPDK_CI_CONTAINERS_NINJA_WORKERS='$(DPDK_CI_CONTAINERS_NINJA_WORKERS)' \
> + -e DPDK_CI_CONTAINERS_COVERITY='$(DPDK_CI_CONTAINERS_COVERITY)' \
> + $(DPDK_CI_CONTAINERS_CONTAINER_BUILDER_TAG) make docker_deps
> +
> +external_files: $(DPDK_CI_CONTAINERS_CONTEXT_DIRECTORY) extra_scripts coverity
> +
> +build_builder_container:
> + $(DPDK_CI_CONTAINER_BUILDER_PROGRAM) build -f $(CONTAINER_BUILDER_DOCKERFILE) -t $(DPDK_CI_CONTAINERS_CONTAINER_BUILDER_TAG) $(CURDIR)
> +
> +docker_deps: $(DOCKERFILE) deps extra_scripts
> + chmod 666 $(DPDK_CI_CONTAINERS_CONTEXT_DIRECTORY)/*.dockerfile
> +
> +$(DOCKERFILE): $(INVENTORY_FILE) $(DPDK_CI_CONTAINERS_CONTEXT_DIRECTORY) deps $(MAKE_DOCKERFILE_SCRIPT) $(shell find $(DOCKER_CONTAINER_TEMPLATE_DIR) -type f)
> + cd $(SCRIPT_DIRECTORY) && $(MAKE_DOCKERFILE_COMMAND) $(SCRIPT_ARGS)
> +
> +deps: $(DPDK_CI_CONTAINERS_CONTEXT_DIRECTORY) dpdk libabigail dpdk-stable
> +
> +extra_scripts: $(DPDK_CI_CONTAINERS_CONTEXT_DIRECTORY) $(EXTRA_SCRIPTS_DIRECTORY) $(DPDK_CI_CONTAINERS_EXTRA_SCRIPTS_PATH)
> +ifdef DPDK_CI_CONTAINERS_EXTRA_SCRIPTS_PATH
> + cp -pur $(DPDK_CI_CONTAINERS_EXTRA_SCRIPTS_PATH)/* $(EXTRA_SCRIPTS_DIRECTORY)
> +endif
> +
> +# Clone libabigail source
> +libabigail: $(DPDK_CI_CONTAINERS_CONTEXT_DIRECTORY)
> + git -C $(LIBABIGAIL_DIRECTORY) fetch $(GIT_FETCH_ARGS) || git clone $(DPDK_CI_CONTAINERS_LIBABIGAIL_CLONE_URL) $(LIBABIGAIL_DIRECTORY)
> + git -C $(LIBABIGAIL_DIRECTORY) describe --tags `git -C $(LIBABIGAIL_DIRECTORY) rev-list --tags --max-count=1` | xargs -n 1 git -C $(LIBABIGAIL_DIRECTORY) checkout
> +
> +# Clone DPDK source
> +dpdk: $(DPDK_CI_CONTAINERS_CONTEXT_DIRECTORY)
> + git -C $(DPDK_DIRECTORY) fetch $(GIT_FETCH_ARGS) || git clone $(DPDK_CI_CONTAINERS_DPDK_CLONE_URL) $(DPDK_DIRECTORY)
> +
> +# Copy the Coverity Scan binaries from a source into the context directory.
> +coverity: $(DPDK_CI_CONTAINERS_CONTEXT_DIRECTORY) $(COVERITY_DIRECTORY)
> +ifeq ($(DPDK_CI_CONTAINERS_COVERITY),Y)
> +ifndef DPDK_CI_CONTAINERS_COVERITY_PATH
> + exit 1 # The coverity path must be set if building Coverity containers is enabled.
> +else
> + cp -pur $(DPDK_CI_CONTAINERS_COVERITY_PATH)/* $(COVERITY_DIRECTORY)
> +endif
> +else
> + # Coverity is disabled for this run.
> +endif
> +
> +dpdk-stable: $(DPDK_CI_CONTAINERS_CONTEXT_DIRECTORY)
> + git -C $(DPDK_STABLE_DIRECTORY) fetch $(GIT_FETCH_ARGS) || git clone $(DPDK_CI_CONTAINERS_DPDK_STABLE_CLONE_URL) $(DPDK_STABLE_DIRECTORY)
> +
> +$(EXTRA_SCRIPTS_DIRECTORY):
> + mkdir -p $(EXTRA_SCRIPTS_DIRECTORY)
> +
> +$(COVERITY_DIRECTORY):
> + mkdir -p $(COVERITY_DIRECTORY)
> +
> +$(DPDK_CI_CONTAINERS_CONTEXT_DIRECTORY):
> + mkdir -p $(DPDK_CI_CONTAINERS_CONTEXT_DIRECTORY)
> +
> +clean_container_files:
> + rm $(DOCKERFILE)
> +
> +clean:
> + rm -rf $(DPDK_CI_CONTAINERS_CONTEXT_DIRECTORY)
next prev parent reply other threads:[~2023-08-04 14:06 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-07-17 21:08 [PATCH v8 0/6] Community Lab Containers and Builder Engine Adam Hassick
2023-07-17 21:08 ` [PATCH v8 1/6] containers/docs: Add container builder start Adam Hassick
2023-07-17 21:08 ` [PATCH v8 2/6] containers/inventory: Add inventory for container builder Adam Hassick
2023-08-04 13:58 ` Aaron Conole
2023-08-04 19:30 ` Adam Hassick
2023-07-17 21:08 ` [PATCH v8 3/6] containers/builder: Dockerfile creation script Adam Hassick
2023-08-04 13:59 ` Aaron Conole
2023-07-17 21:08 ` [PATCH v8 4/6] containers/templates: Templates for Dockerfiles Adam Hassick
2023-08-04 14:02 ` Aaron Conole
2023-08-04 19:34 ` Adam Hassick
2023-07-17 21:08 ` [PATCH v8 5/6] containers/container_builder: Container for python scripts Adam Hassick
2023-08-04 14:03 ` Aaron Conole
2023-07-17 21:08 ` [PATCH v8 6/6] containers/Makefile: Makefile to automate builds Adam Hassick
2023-08-04 14:06 ` Aaron Conole [this message]
2023-07-28 20:38 ` [PATCH v8 0/6] Community Lab Containers and Builder Engine Aaron Conole
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=f7th6pe6gwq.fsf@redhat.com \
--to=aconole@redhat.com \
--cc=ahassick@iol.unh.edu \
--cc=alialnu@nvidia.com \
--cc=ci@dpdk.org \
--cc=ohilyard@iol.unh.edu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).