From 9635ff3d20c17a92a89cf82db8d3f877dd04e1c7 Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo <massimiliano.culpo@gmail.com> Date: Fri, 31 Jan 2020 02:19:55 +0100 Subject: [PATCH] `spack containerize` generates containers from envs (#14202) This PR adds a new command to Spack: ```console $ spack containerize -h usage: spack containerize [-h] [--config CONFIG] creates recipes to build images for different container runtimes optional arguments: -h, --help show this help message and exit --config CONFIG configuration for the container recipe that will be generated ``` which takes an environment with an additional `container` section: ```yaml spack: specs: - gromacs build_type=Release - mpich - fftw precision=float packages: all: target: [broadwell] container: # Select the format of the recipe e.g. docker, # singularity or anything else that is currently supported format: docker # Select from a valid list of images base: image: "ubuntu:18.04" spack: prerelease # Additional system packages that are needed at runtime os_packages: - libgomp1 ``` and turns it into a `Dockerfile` or a Singularity definition file, for instance: ```Dockerfile # Build stage with Spack pre-installed and ready to be used FROM spack/ubuntu-bionic:prerelease as builder # What we want to install and how we want to install it # is specified in a manifest file (spack.yaml) RUN mkdir /opt/spack-environment \ && (echo "spack:" \ && echo " specs:" \ && echo " - gromacs build_type=Release" \ && echo " - mpich" \ && echo " - fftw precision=float" \ && echo " packages:" \ && echo " all:" \ && echo " target:" \ && echo " - broadwell" \ && echo " config:" \ && echo " install_tree: /opt/software" \ && echo " concretization: together" \ && echo " view: /opt/view") > /opt/spack-environment/spack.yaml # Install the software, remove unecessary deps and strip executables RUN cd /opt/spack-environment && spack install && spack autoremove -y RUN find -L /opt/view/* -type f -exec readlink -f '{}' \; | \ xargs file -i | \ grep 'charset=binary' | \ grep 'x-executable\|x-archive\|x-sharedlib' | \ awk -F: '{print $1}' | xargs strip -s # Modifications to the environment that are necessary to run RUN cd /opt/spack-environment && \ spack env activate --sh -d . >> /etc/profile.d/z10_spack_environment.sh # Bare OS image to run the installed executables FROM ubuntu:18.04 COPY --from=builder /opt/spack-environment /opt/spack-environment COPY --from=builder /opt/software /opt/software COPY --from=builder /opt/view /opt/view COPY --from=builder /etc/profile.d/z10_spack_environment.sh /etc/profile.d/z10_spack_environment.sh RUN apt-get -yqq update && apt-get -yqq upgrade \ && apt-get -yqq install libgomp1 \ && rm -rf /var/lib/apt/lists/* ENTRYPOINT ["/bin/bash", "--rcfile", "/etc/profile", "-l"] ``` --- lib/spack/docs/containers.rst | 307 ++++++++++++++++++ lib/spack/docs/dockerhub_spack.png | Bin 0 -> 90235 bytes lib/spack/docs/environments.rst | 2 + lib/spack/docs/index.rst | 1 + lib/spack/spack/cmd/containerize.py | 25 ++ lib/spack/spack/container/__init__.py | 81 +++++ lib/spack/spack/container/images.json | 50 +++ lib/spack/spack/container/images.py | 72 ++++ lib/spack/spack/container/writers/__init__.py | 154 +++++++++ lib/spack/spack/container/writers/docker.py | 30 ++ .../spack/container/writers/singularity.py | 33 ++ lib/spack/spack/schema/container.py | 82 +++++ lib/spack/spack/schema/merged.py | 2 + lib/spack/spack/test/cmd/gc.py | 4 +- lib/spack/spack/test/cmd/test.py | 2 +- lib/spack/spack/test/container/cli.py | 16 + lib/spack/spack/test/container/conftest.py | 43 +++ lib/spack/spack/test/container/docker.py | 74 +++++ lib/spack/spack/test/container/images.py | 58 ++++ lib/spack/spack/test/container/schema.py | 16 + lib/spack/spack/test/container/singularity.py | 42 +++ share/spack/spack-completion.bash | 6 +- share/spack/templates/container/Dockerfile | 51 +++ .../spack/templates/container/singularity.def | 90 +++++ 24 files changed, 1238 insertions(+), 3 deletions(-) create mode 100644 lib/spack/docs/containers.rst create mode 100644 lib/spack/docs/dockerhub_spack.png create mode 100644 lib/spack/spack/cmd/containerize.py create mode 100644 lib/spack/spack/container/__init__.py create mode 100644 lib/spack/spack/container/images.json create mode 100644 lib/spack/spack/container/images.py create mode 100644 lib/spack/spack/container/writers/__init__.py create mode 100644 lib/spack/spack/container/writers/docker.py create mode 100644 lib/spack/spack/container/writers/singularity.py create mode 100644 lib/spack/spack/schema/container.py create mode 100644 lib/spack/spack/test/container/cli.py create mode 100644 lib/spack/spack/test/container/conftest.py create mode 100644 lib/spack/spack/test/container/docker.py create mode 100644 lib/spack/spack/test/container/images.py create mode 100644 lib/spack/spack/test/container/schema.py create mode 100644 lib/spack/spack/test/container/singularity.py create mode 100644 share/spack/templates/container/Dockerfile create mode 100644 share/spack/templates/container/singularity.def diff --git a/lib/spack/docs/containers.rst b/lib/spack/docs/containers.rst new file mode 100644 index 0000000000..bbb21a2e00 --- /dev/null +++ b/lib/spack/docs/containers.rst @@ -0,0 +1,307 @@ +.. Copyright 2013-2020 Lawrence Livermore National Security, LLC and other + Spack Project Developers. See the top-level COPYRIGHT file for details. + + SPDX-License-Identifier: (Apache-2.0 OR MIT) + +.. _containers: + +================ +Container Images +================ + +Spack can be an ideal tool to setup images for containers since all the +features discussed in :ref:`environments` can greatly help to manage +the installation of software during the image build process. Nonetheless, +building a production image from scratch still requires a lot of +boilerplate to: + +- Get Spack working within the image, possibly running as root +- Minimize the physical size of the software installed +- Properly update the system software in the base image + +To facilitate users with these tedious tasks, Spack provides a command +to automatically generate recipes for container images based on +Environments: + +.. code-block:: console + + $ ls + spack.yaml + + $ spack containerize + # Build stage with Spack pre-installed and ready to be used + FROM spack/centos7:latest as builder + + # What we want to install and how we want to install it + # is specified in a manifest file (spack.yaml) + RUN mkdir /opt/spack-environment \ + && (echo "spack:" \ + && echo " specs:" \ + && echo " - gromacs+mpi" \ + && echo " - mpich" \ + && echo " concretization: together" \ + && echo " config:" \ + && echo " install_tree: /opt/software" \ + && echo " view: /opt/view") > /opt/spack-environment/spack.yaml + + # Install the software, remove unecessary deps + RUN cd /opt/spack-environment && spack install && spack gc -y + + # Strip all the binaries + RUN find -L /opt/view/* -type f -exec readlink -f '{}' \; | \ + xargs file -i | \ + grep 'charset=binary' | \ + grep 'x-executable\|x-archive\|x-sharedlib' | \ + awk -F: '{print $1}' | xargs strip -s + + # Modifications to the environment that are necessary to run + RUN cd /opt/spack-environment && \ + spack env activate --sh -d . >> /etc/profile.d/z10_spack_environment.sh + + + # Bare OS image to run the installed executables + FROM centos:7 + + COPY --from=builder /opt/spack-environment /opt/spack-environment + COPY --from=builder /opt/software /opt/software + COPY --from=builder /opt/view /opt/view + COPY --from=builder /etc/profile.d/z10_spack_environment.sh /etc/profile.d/z10_spack_environment.sh + + RUN yum update -y && yum install -y epel-release && yum update -y \ + && yum install -y libgomp \ + && rm -rf /var/cache/yum && yum clean all + + RUN echo 'export PS1="\[$(tput bold)\]\[$(tput setaf 1)\][gromacs]\[$(tput setaf 2)\]\u\[$(tput sgr0)\]:\w $ \[$(tput sgr0)\]"' >> ~/.bashrc + + + LABEL "app"="gromacs" + LABEL "mpi"="mpich" + + ENTRYPOINT ["/bin/bash", "--rcfile", "/etc/profile", "-l"] + + +The bits that make this automation possible are discussed in details +below. All the images generated in this way will be based on +multi-stage builds with: + +- A fat ``build`` stage containing common build tools and Spack itself +- A minimal ``final`` stage containing only the software requested by the user + +----------------- +Spack Base Images +----------------- + +Docker images with Spack preinstalled and ready to be used are +built on `Docker Hub <https://hub.docker.com/u/spack>`_ +at every push to ``develop`` or to a release branch. The OS that +are currently supported are summarized in the table below: + +.. _containers-supported-os: + +.. list-table:: Supported operating systems + :header-rows: 1 + + * - Operating System + - Base Image + - Spack Image + * - Ubuntu 16.04 + - ``ubuntu:16.04`` + - ``spack/ubuntu-xenial`` + * - Ubuntu 18.04 + - ``ubuntu:16.04`` + - ``spack/ubuntu-bionic`` + * - CentOS 6 + - ``centos:6`` + - ``spack/centos6`` + * - CentOS 7 + - ``centos:7`` + - ``spack/centos7`` + +All the images are tagged with the corresponding release of Spack: + +.. image:: dockerhub_spack.png + +with the exception of the ``latest`` tag that points to the HEAD +of the ``develop`` branch. These images are available for anyone +to use and take care of all the repetitive tasks that are necessary +to setup Spack within a container. All the container recipes generated +automatically by Spack use them as base images for their ``build`` stage. + + +------------------------- +Environment Configuration +------------------------- + +Any Spack Environment can be used for the automatic generation of container +recipes. Sensible defaults are provided for things like the base image or the +version of Spack used in the image. If a finer tuning is needed it can be +obtained by adding the relevant metadata under the ``container`` attribute +of environments: + +.. code-block:: yaml + + spack: + specs: + - gromacs+mpi + - mpich + + container: + # Select the format of the recipe e.g. docker, + # singularity or anything else that is currently supported + format: docker + + # Select from a valid list of images + base: + image: "centos:7" + spack: develop + + # Whether or not to strip binaries + strip: true + + # Additional system packages that are needed at runtime + os_packages: + - libgomp + + # Extra instructions + extra_instructions: + final: | + RUN echo 'export PS1="\[$(tput bold)\]\[$(tput setaf 1)\][gromacs]\[$(tput setaf 2)\]\u\[$(tput sgr0)\]:\w $ \[$(tput sgr0)\]"' >> ~/.bashrc + + # Labels for the image + labels: + app: "gromacs" + mpi: "mpich" + +The tables below describe the configuration options that are currently supported: + +.. list-table:: General configuration options for the ``container`` section of ``spack.yaml`` + :header-rows: 1 + + * - Option Name + - Description + - Allowed Values + - Required + * - ``format`` + - The format of the recipe + - ``docker`` or ``singularity`` + - Yes + * - ``base:image`` + - Base image for ``final`` stage + - See :ref:`containers-supported-os` + - Yes + * - ``base:spack`` + - Version of Spack + - Valid tags for ``base:image`` + - Yes + * - ``strip`` + - Whether to strip binaries + - ``true`` (default) or ``false`` + - No + * - ``os_packages`` + - System packages to be installed + - Valid packages for the ``final`` OS + - No + * - ``extra_instructions:build`` + - Extra instructions (e.g. `RUN`, `COPY`, etc.) at the end of the ``build`` stage + - Anything understood by the current ``format`` + - No + * - ``extra_instructions:final`` + - Extra instructions (e.g. `RUN`, `COPY`, etc.) at the end of the ``final`` stage + - Anything understood by the current ``format`` + - No + * - ``labels`` + - Labels to tag the image + - Pairs of key-value strings + - No + +.. list-table:: Configuration options specific to Singularity + :header-rows: 1 + + * - Option Name + - Description + - Allowed Values + - Required + * - ``singularity:runscript`` + - Content of ``%runscript`` + - Any valid script + - No + * - ``singularity:startscript`` + - Content of ``%startscript`` + - Any valid script + - No + * - ``singularity:test`` + - Content of ``%test`` + - Any valid script + - No + * - ``singularity:help`` + - Description of the image + - Description string + - No + +Once the Environment is properly configured a recipe for a container +image can be printed to standard output by issuing the following +command from the directory where the ``spack.yaml`` resides: + +.. code-block:: console + + $ spack containerize + +The example ``spack.yaml`` above would produce for instance the +following ``Dockerfile``: + +.. code-block:: docker + + # Build stage with Spack pre-installed and ready to be used + FROM spack/centos7:latest as builder + + # What we want to install and how we want to install it + # is specified in a manifest file (spack.yaml) + RUN mkdir /opt/spack-environment \ + && (echo "spack:" \ + && echo " specs:" \ + && echo " - gromacs+mpi" \ + && echo " - mpich" \ + && echo " concretization: together" \ + && echo " config:" \ + && echo " install_tree: /opt/software" \ + && echo " view: /opt/view") > /opt/spack-environment/spack.yaml + + # Install the software, remove unecessary deps + RUN cd /opt/spack-environment && spack install && spack gc -y + + # Strip all the binaries + RUN find -L /opt/view/* -type f -exec readlink -f '{}' \; | \ + xargs file -i | \ + grep 'charset=binary' | \ + grep 'x-executable\|x-archive\|x-sharedlib' | \ + awk -F: '{print $1}' | xargs strip -s + + # Modifications to the environment that are necessary to run + RUN cd /opt/spack-environment && \ + spack env activate --sh -d . >> /etc/profile.d/z10_spack_environment.sh + + + # Bare OS image to run the installed executables + FROM centos:7 + + COPY --from=builder /opt/spack-environment /opt/spack-environment + COPY --from=builder /opt/software /opt/software + COPY --from=builder /opt/view /opt/view + COPY --from=builder /etc/profile.d/z10_spack_environment.sh /etc/profile.d/z10_spack_environment.sh + + RUN yum update -y && yum install -y epel-release && yum update -y \ + && yum install -y libgomp \ + && rm -rf /var/cache/yum && yum clean all + + RUN echo 'export PS1="\[$(tput bold)\]\[$(tput setaf 1)\][gromacs]\[$(tput setaf 2)\]\u\[$(tput sgr0)\]:\w $ \[$(tput sgr0)\]"' >> ~/.bashrc + + + LABEL "app"="gromacs" + LABEL "mpi"="mpich" + + ENTRYPOINT ["/bin/bash", "--rcfile", "/etc/profile", "-l"] + +.. note:: + Spack can also produce Singularity definition files to build the image. The + minimum version of Singularity required to build a SIF (Singularity Image Format) + from them is ``3.5.3``. \ No newline at end of file diff --git a/lib/spack/docs/dockerhub_spack.png b/lib/spack/docs/dockerhub_spack.png new file mode 100644 index 0000000000000000000000000000000000000000..44ff0ed7ed87652681e4d0bddd0c568d57fcc8c3 GIT binary patch literal 90235 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 literal 0 HcmV?d00001 diff --git a/lib/spack/docs/environments.rst b/lib/spack/docs/environments.rst index 336d574bd7..5ec1ec9032 100644 --- a/lib/spack/docs/environments.rst +++ b/lib/spack/docs/environments.rst @@ -49,6 +49,8 @@ Spack uses a "manifest and lock" model similar to `Bundler gemfiles managers. The user input file is named ``spack.yaml`` and the lock file is named ``spack.lock`` +.. _environments-using: + ------------------ Using Environments ------------------ diff --git a/lib/spack/docs/index.rst b/lib/spack/docs/index.rst index 489c15645a..8170f152a4 100644 --- a/lib/spack/docs/index.rst +++ b/lib/spack/docs/index.rst @@ -66,6 +66,7 @@ or refer to the full manual below. config_yaml build_settings environments + containers mirrors module_file_support repositories diff --git a/lib/spack/spack/cmd/containerize.py b/lib/spack/spack/cmd/containerize.py new file mode 100644 index 0000000000..cc2c001560 --- /dev/null +++ b/lib/spack/spack/cmd/containerize.py @@ -0,0 +1,25 @@ +# Copyright 2013-2020 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) +import os +import os.path +import spack.container + +description = ("creates recipes to build images for different" + " container runtimes") +section = "container" +level = "long" + + +def containerize(parser, args): + config_dir = args.env_dir or os.getcwd() + config_file = os.path.abspath(os.path.join(config_dir, 'spack.yaml')) + if not os.path.exists(config_file): + msg = 'file not found: {0}' + raise ValueError(msg.format(config_file)) + + config = spack.container.validate(config_file) + + recipe = spack.container.recipe(config) + print(recipe) diff --git a/lib/spack/spack/container/__init__.py b/lib/spack/spack/container/__init__.py new file mode 100644 index 0000000000..fc3750355a --- /dev/null +++ b/lib/spack/spack/container/__init__.py @@ -0,0 +1,81 @@ +# Copyright 2013-2020 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) +"""Package that provides functions and classes to +generate container recipes from a Spack environment +""" +import warnings + +import spack.environment +import spack.schema.env as env +import spack.util.spack_yaml as syaml +from .writers import recipe + +__all__ = ['validate', 'recipe'] + + +def validate(configuration_file): + """Validate a Spack environment YAML file that is being used to generate a + recipe for a container. + + Since a few attributes of the configuration must have specific values for + the container recipe, this function returns a sanitized copy of the + configuration in the input file. If any modification is needed, a warning + will be issued. + + Args: + configuration_file (str): path to the Spack environment YAML file + + Returns: + A sanitized copy of the configuration stored in the input file + """ + import jsonschema + with open(configuration_file) as f: + config = syaml.load(f) + + # Ensure we have a "container" attribute with sensible defaults set + env_dict = spack.environment.config_dict(config) + env_dict.setdefault('container', { + 'format': 'docker', + 'base': {'image': 'ubuntu:18.04', 'spack': 'develop'} + }) + env_dict['container'].setdefault('format', 'docker') + env_dict['container'].setdefault( + 'base', {'image': 'ubuntu:18.04', 'spack': 'develop'} + ) + + # Remove attributes that are not needed / allowed in the + # container recipe + for subsection in ('cdash', 'gitlab_ci', 'modules'): + if subsection in env_dict: + msg = ('the subsection "{0}" in "{1}" is not used when generating' + ' container recipes and will be discarded') + warnings.warn(msg.format(subsection, configuration_file)) + env_dict.pop(subsection) + + # Set the default value of the concretization strategy to "together" and + # warn if the user explicitly set another value + env_dict.setdefault('concretization', 'together') + if env_dict['concretization'] != 'together': + msg = ('the "concretization" attribute of the environment is set ' + 'to "{0}" [the advised value is instead "together"]') + warnings.warn(msg.format(env_dict['concretization'])) + + # Check if the install tree was explicitly set to a custom value and warn + # that it will be overridden + environment_config = env_dict.get('config', {}) + if environment_config.get('install_tree', None): + msg = ('the "config:install_tree" attribute has been set explicitly ' + 'and will be overridden in the container image') + warnings.warn(msg) + + # Likewise for the view + environment_view = env_dict.get('view', None) + if environment_view: + msg = ('the "view" attribute has been set explicitly ' + 'and will be overridden in the container image') + warnings.warn(msg) + + jsonschema.validate(config, schema=env.schema) + return config diff --git a/lib/spack/spack/container/images.json b/lib/spack/spack/container/images.json new file mode 100644 index 0000000000..ecd911815d --- /dev/null +++ b/lib/spack/spack/container/images.json @@ -0,0 +1,50 @@ +{ + "ubuntu:18.04": { + "update": "apt-get -yqq update && apt-get -yqq upgrade", + "install": "apt-get -yqq install", + "clean": "rm -rf /var/lib/apt/lists/*", + "environment": [], + "build": "spack/ubuntu-bionic", + "build_tags": { + "develop": "latest", + "0.14": "0.14", + "0.14.0": "0.14.0" + } + }, + "ubuntu:16.04": { + "update": "apt-get -yqq update && apt-get -yqq upgrade", + "install": "apt-get -yqq install", + "clean": "rm -rf /var/lib/apt/lists/*", + "environment": [], + "build": "spack/ubuntu-xenial", + "build_tags": { + "develop": "latest", + "0.14": "0.14", + "0.14.0": "0.14.0" + } + }, + "centos:7": { + "update": "yum update -y && yum install -y epel-release && yum update -y", + "install": "yum install -y", + "clean": "rm -rf /var/cache/yum && yum clean all", + "environment": [], + "build": "spack/centos7", + "build_tags": { + "develop": "latest", + "0.14": "0.14", + "0.14.0": "0.14.0" + } + }, + "centos:6": { + "update": "yum update -y && yum install -y epel-release && yum update -y", + "install": "yum install -y", + "clean": "rm -rf /var/cache/yum && yum clean all", + "environment": [], + "build": "spack/centos6", + "build_tags": { + "develop": "latest", + "0.14": "0.14", + "0.14.0": "0.14.0" + } + } +} \ No newline at end of file diff --git a/lib/spack/spack/container/images.py b/lib/spack/spack/container/images.py new file mode 100644 index 0000000000..421fc24425 --- /dev/null +++ b/lib/spack/spack/container/images.py @@ -0,0 +1,72 @@ +# Copyright 2013-2020 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) +"""Manages the details on the images used in the build and the run stage.""" +import json +import os.path + +#: Global variable used to cache in memory the content of images.json +_data = None + + +def data(): + """Returns a dictionary with the static data on the images. + + The dictionary is read from a JSON file lazily the first time + this function is called. + """ + global _data + if not _data: + json_dir = os.path.abspath(os.path.dirname(__file__)) + json_file = os.path.join(json_dir, 'images.json') + with open(json_file) as f: + _data = json.load(f) + return _data + + +def build_info(image, spack_version): + """Returns the name of the build image and its tag. + + Args: + image (str): image to be used at run-time. Should be of the form + <image_name>:<image_tag> e.g. "ubuntu:18.04" + spack_version (str): version of Spack that we want to use to build + + Returns: + A tuple with (image_name, image_tag) for the build image + """ + # Don't handle error here, as a wrong image should have been + # caught by the JSON schema + image_data = data()[image] + build_image = image_data['build'] + + # Try to check if we have a tag for this Spack version + try: + build_tag = image_data['build_tags'][spack_version] + except KeyError: + msg = ('the image "{0}" has no tag for Spack version "{1}" ' + '[valid versions are {2}]') + msg = msg.format(build_image, spack_version, + ', '.join(image_data['build_tags'].keys())) + raise ValueError(msg) + + return build_image, build_tag + + +def package_info(image): + """Returns the commands used to update system repositories, install + system packages and clean afterwards. + + Args: + image (str): image to be used at run-time. Should be of the form + <image_name>:<image_tag> e.g. "ubuntu:18.04" + + Returns: + A tuple of (update, install, clean) commands. + """ + image_data = data()[image] + update = image_data['update'] + install = image_data['install'] + clean = image_data['clean'] + return update, install, clean diff --git a/lib/spack/spack/container/writers/__init__.py b/lib/spack/spack/container/writers/__init__.py new file mode 100644 index 0000000000..a1d2fa3102 --- /dev/null +++ b/lib/spack/spack/container/writers/__init__.py @@ -0,0 +1,154 @@ +# Copyright 2013-2020 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) +"""Writers for different kind of recipes and related +convenience functions. +""" +import collections +import copy + +import spack.environment +import spack.schema.env +import spack.tengine as tengine +import spack.util.spack_yaml as syaml + +from spack.container.images import build_info, package_info + +#: Caches all the writers that are currently supported +_writer_factory = {} + + +def writer(name): + """Decorator to register a factory for a recipe writer. + + Each factory should take a configuration dictionary and return a + properly configured writer that, when called, prints the + corresponding recipe. + """ + def _decorator(factory): + _writer_factory[name] = factory + return factory + return _decorator + + +def create(configuration): + """Returns a writer that conforms to the configuration passed as input. + + Args: + configuration: how to generate the current recipe + """ + name = spack.environment.config_dict(configuration)['container']['format'] + return _writer_factory[name](configuration) + + +def recipe(configuration): + """Returns a recipe that conforms to the configuration passed as input. + + Args: + configuration: how to generate the current recipe + """ + return create(configuration)() + + +class PathContext(tengine.Context): + """Generic context used to instantiate templates of recipes that + install software in a common location and make it available + directly via PATH. + """ + def __init__(self, config): + self.config = spack.environment.config_dict(config) + self.container_config = self.config['container'] + + @tengine.context_property + def run(self): + """Information related to the run image.""" + image = self.container_config['base']['image'] + Run = collections.namedtuple('Run', ['image']) + return Run(image=image) + + @tengine.context_property + def build(self): + """Information related to the build image.""" + + # Map the final image to the correct build image + run_image = self.container_config['base']['image'] + spack_version = self.container_config['base']['spack'] + image, tag = build_info(run_image, spack_version) + + Build = collections.namedtuple('Build', ['image', 'tag']) + return Build(image=image, tag=tag) + + @tengine.context_property + def strip(self): + """Whether or not to strip binaries in the image""" + return self.container_config.get('strip', True) + + @tengine.context_property + def paths(self): + """Important paths in the image""" + Paths = collections.namedtuple('Paths', [ + 'environment', 'store', 'view' + ]) + return Paths( + environment='/opt/spack-environment', + store='/opt/software', + view='/opt/view' + ) + + @tengine.context_property + def manifest(self): + """The spack.yaml file that should be used in the image""" + import jsonschema + # Copy in the part of spack.yaml prescribed in the configuration file + manifest = copy.deepcopy(self.config) + manifest.pop('container') + + # Ensure that a few paths are where they need to be + manifest.setdefault('config', syaml.syaml_dict()) + manifest['config']['install_tree'] = self.paths.store + manifest['view'] = self.paths.view + manifest = {'spack': manifest} + + # Validate the manifest file + jsonschema.validate(manifest, schema=spack.schema.env.schema) + + return syaml.dump(manifest, default_flow_style=False).strip() + + @tengine.context_property + def os_packages(self): + """Additional system packages that are needed at run-time.""" + package_list = self.container_config.get('os_packages', None) + if not package_list: + return package_list + + image = self.container_config['base']['image'] + update, install, clean = package_info(image) + Packages = collections.namedtuple( + 'Packages', ['update', 'install', 'list', 'clean'] + ) + return Packages(update=update, install=install, + list=package_list, clean=clean) + + @tengine.context_property + def extra_instructions(self): + Extras = collections.namedtuple('Extra', ['build', 'final']) + extras = self.container_config.get('extra_instructions', {}) + build, final = extras.get('build', None), extras.get('final', None) + return Extras(build=build, final=final) + + @tengine.context_property + def labels(self): + return self.container_config.get('labels', {}) + + def __call__(self): + """Returns the recipe as a string""" + env = tengine.make_environment() + t = env.get_template(self.template_name) + return t.render(**self.to_dict()) + + +# Import after function definition all the modules in this package, +# so that registration of writers will happen automatically +import spack.container.writers.singularity # noqa +import spack.container.writers.docker # noqa diff --git a/lib/spack/spack/container/writers/docker.py b/lib/spack/spack/container/writers/docker.py new file mode 100644 index 0000000000..557d22c803 --- /dev/null +++ b/lib/spack/spack/container/writers/docker.py @@ -0,0 +1,30 @@ +# Copyright 2013-2020 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) +import spack.tengine as tengine + +from . import writer, PathContext + + +@writer('docker') +class DockerContext(PathContext): + """Context used to instantiate a Dockerfile""" + #: Name of the template used for Dockerfiles + template_name = 'container/Dockerfile' + + @tengine.context_property + def manifest(self): + manifest_str = super(DockerContext, self).manifest + # Docker doesn't support HEREDOC so we need to resort to + # a horrible echo trick to have the manifest in the Dockerfile + echoed_lines = [] + for idx, line in enumerate(manifest_str.split('\n')): + if idx == 0: + echoed_lines.append('&& (echo "' + line + '" \\') + continue + echoed_lines.append('&& echo "' + line + '" \\') + + echoed_lines[-1] = echoed_lines[-1].replace(' \\', ')') + + return '\n'.join(echoed_lines) diff --git a/lib/spack/spack/container/writers/singularity.py b/lib/spack/spack/container/writers/singularity.py new file mode 100644 index 0000000000..32f29eb83d --- /dev/null +++ b/lib/spack/spack/container/writers/singularity.py @@ -0,0 +1,33 @@ +# Copyright 2013-2020 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) +import spack.tengine as tengine +from . import writer, PathContext + + +@writer('singularity') +class SingularityContext(PathContext): + """Context used to instantiate a Singularity definition file""" + #: Name of the template used for Singularity definition files + template_name = 'container/singularity.def' + + @property + def singularity_config(self): + return self.container_config.get('singularity', {}) + + @tengine.context_property + def runscript(self): + return self.singularity_config.get('runscript', '') + + @tengine.context_property + def startscript(self): + return self.singularity_config.get('startscript', '') + + @tengine.context_property + def test(self): + return self.singularity_config.get('test', '') + + @tengine.context_property + def help(self): + return self.singularity_config.get('help', '') diff --git a/lib/spack/spack/schema/container.py b/lib/spack/spack/schema/container.py new file mode 100644 index 0000000000..cb1ed8d63a --- /dev/null +++ b/lib/spack/spack/schema/container.py @@ -0,0 +1,82 @@ +# Copyright 2013-2020 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) +"""Schema for the 'container' subsection of Spack environments.""" + +#: Schema for the container attribute included in Spack environments +container_schema = { + 'type': 'object', + 'additionalProperties': False, + 'properties': { + # The recipe formats that are currently supported by the command + 'format': { + 'type': 'string', + 'enum': ['docker', 'singularity'] + }, + # Describes the base image to start from and the version + # of Spack to be used + 'base': { + 'type': 'object', + 'additionalProperties': False, + 'properties': { + 'image': { + 'type': 'string', + 'enum': ['ubuntu:18.04', + 'ubuntu:16.04', + 'centos:7', + 'centos:6'] + }, + 'spack': { + 'type': 'string', + 'enum': ['develop', '0.14', '0.14.0'] + } + }, + 'required': ['image', 'spack'] + }, + # Whether or not to strip installed binaries + 'strip': { + 'type': 'boolean', + 'default': True + }, + # Additional system packages that are needed at runtime + 'os_packages': { + 'type': 'array', + 'items': { + 'type': 'string' + } + }, + # Add labels to the image + 'labels': { + 'type': 'object', + }, + # Add a custom extra section at the bottom of a stage + 'extra_instructions': { + 'type': 'object', + 'additionalProperties': False, + 'properties': { + 'build': {'type': 'string'}, + 'final': {'type': 'string'} + } + }, + # Reserved for properties that are specific to each format + 'singularity': { + 'type': 'object', + 'additionalProperties': False, + 'default': {}, + 'properties': { + 'runscript': {'type': 'string'}, + 'startscript': {'type': 'string'}, + 'test': {'type': 'string'}, + 'help': {'type': 'string'} + } + }, + 'docker': { + 'type': 'object', + 'additionalProperties': False, + 'default': {}, + } + } +} + +properties = {'container': container_schema} diff --git a/lib/spack/spack/schema/merged.py b/lib/spack/spack/schema/merged.py index d56228c116..e118acf286 100644 --- a/lib/spack/spack/schema/merged.py +++ b/lib/spack/spack/schema/merged.py @@ -13,6 +13,7 @@ import spack.schema.cdash import spack.schema.compilers import spack.schema.config +import spack.schema.container import spack.schema.gitlab_ci import spack.schema.mirrors import spack.schema.modules @@ -26,6 +27,7 @@ spack.schema.cdash.properties, spack.schema.compilers.properties, spack.schema.config.properties, + spack.schema.container.properties, spack.schema.gitlab_ci.properties, spack.schema.mirrors.properties, spack.schema.modules.properties, diff --git a/lib/spack/spack/test/cmd/gc.py b/lib/spack/spack/test/cmd/gc.py index 76eb608cf2..22c85a1d78 100644 --- a/lib/spack/spack/test/cmd/gc.py +++ b/lib/spack/spack/test/cmd/gc.py @@ -30,7 +30,9 @@ def test_packages_are_removed(config, mutable_database, capsys): @pytest.mark.db -def test_gc_with_environment(config, mutable_database, capsys): +def test_gc_with_environment( + config, mutable_database, mutable_mock_env_path, capsys +): s = spack.spec.Spec('simple-inheritance') s.concretize() s.package.do_install(fake=True, explicit=True) diff --git a/lib/spack/spack/test/cmd/test.py b/lib/spack/spack/test/cmd/test.py index 3595f91953..9a64209cfa 100644 --- a/lib/spack/spack/test/cmd/test.py +++ b/lib/spack/spack/test/cmd/test.py @@ -1,4 +1,4 @@ -# Copyright 2013-2019 Lawrence Livermore National Security, LLC and other +# Copyright 2013-2020 Lawrence Livermore National Security, LLC and other # Spack Project Developers. See the top-level COPYRIGHT file for details. # # SPDX-License-Identifier: (Apache-2.0 OR MIT) diff --git a/lib/spack/spack/test/container/cli.py b/lib/spack/spack/test/container/cli.py new file mode 100644 index 0000000000..8e5403f072 --- /dev/null +++ b/lib/spack/spack/test/container/cli.py @@ -0,0 +1,16 @@ +# Copyright 2013-2020 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) +import llnl.util.filesystem as fs +import spack.main + + +containerize = spack.main.SpackCommand('containerize') + + +def test_command(configuration_dir, capsys): + with capsys.disabled(): + with fs.working_dir(configuration_dir): + output = containerize() + assert 'FROM spack/ubuntu-bionic' in output diff --git a/lib/spack/spack/test/container/conftest.py b/lib/spack/spack/test/container/conftest.py new file mode 100644 index 0000000000..802b34c5f8 --- /dev/null +++ b/lib/spack/spack/test/container/conftest.py @@ -0,0 +1,43 @@ +# Copyright 2013-2020 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) +import pytest + +import spack.util.spack_yaml as syaml + + +@pytest.fixture() +def minimal_configuration(): + return { + 'spack': { + 'specs': [ + 'gromacs', + 'mpich', + 'fftw precision=float' + ], + 'container': { + 'format': 'docker', + 'base': { + 'image': 'ubuntu:18.04', + 'spack': 'develop' + } + } + } + } + + +@pytest.fixture() +def config_dumper(tmpdir): + """Function that dumps an environment config in a temporary folder.""" + def dumper(configuration): + content = syaml.dump(configuration, default_flow_style=False) + config_file = tmpdir / 'spack.yaml' + config_file.write(content) + return str(tmpdir) + return dumper + + +@pytest.fixture() +def configuration_dir(minimal_configuration, config_dumper): + return config_dumper(minimal_configuration) diff --git a/lib/spack/spack/test/container/docker.py b/lib/spack/spack/test/container/docker.py new file mode 100644 index 0000000000..fbdc085828 --- /dev/null +++ b/lib/spack/spack/test/container/docker.py @@ -0,0 +1,74 @@ +# Copyright 2013-2020 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +import spack.container.writers as writers + + +def test_manifest(minimal_configuration): + writer = writers.create(minimal_configuration) + manifest_str = writer.manifest + for line in manifest_str.split('\n'): + assert 'echo' in line + + +def test_build_and_run_images(minimal_configuration): + writer = writers.create(minimal_configuration) + + # Test the output of run property + run = writer.run + assert run.image == 'ubuntu:18.04' + + # Test the output of the build property + build = writer.build + assert build.image == 'spack/ubuntu-bionic' + assert build.tag == 'latest' + + +def test_packages(minimal_configuration): + # In this minimal configuration we don't have packages + writer = writers.create(minimal_configuration) + assert writer.os_packages is None + + # If we add them a list should be returned + pkgs = ['libgomp1'] + minimal_configuration['spack']['container']['os_packages'] = pkgs + writer = writers.create(minimal_configuration) + p = writer.os_packages + assert p.update + assert p.install + assert p.clean + assert p.list == pkgs + + +def test_ensure_render_works(minimal_configuration): + # Here we just want to ensure that nothing is raised + writer = writers.create(minimal_configuration) + writer() + + +def test_strip_is_set_from_config(minimal_configuration): + writer = writers.create(minimal_configuration) + assert writer.strip is True + + minimal_configuration['spack']['container']['strip'] = False + writer = writers.create(minimal_configuration) + assert writer.strip is False + + +def test_extra_instructions_is_set_from_config(minimal_configuration): + writer = writers.create(minimal_configuration) + assert writer.extra_instructions == (None, None) + + test_line = 'RUN echo Hello world!' + e = minimal_configuration['spack']['container'] + e['extra_instructions'] = {} + e['extra_instructions']['build'] = test_line + writer = writers.create(minimal_configuration) + assert writer.extra_instructions == (test_line, None) + + e['extra_instructions']['final'] = test_line + del e['extra_instructions']['build'] + writer = writers.create(minimal_configuration) + assert writer.extra_instructions == (None, test_line) diff --git a/lib/spack/spack/test/container/images.py b/lib/spack/spack/test/container/images.py new file mode 100644 index 0000000000..808676c39a --- /dev/null +++ b/lib/spack/spack/test/container/images.py @@ -0,0 +1,58 @@ +# Copyright 2013-2020 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) +import os.path + +import pytest + +import spack.container + + +@pytest.mark.parametrize('image,spack_version,expected', [ + ('ubuntu:18.04', 'develop', ('spack/ubuntu-bionic', 'latest')), + ('ubuntu:18.04', '0.14.0', ('spack/ubuntu-bionic', '0.14.0')), +]) +def test_build_info(image, spack_version, expected): + output = spack.container.images.build_info(image, spack_version) + assert output == expected + + +@pytest.mark.parametrize('image,spack_version', [ + ('ubuntu:18.04', 'doesnotexist') +]) +def test_build_info_error(image, spack_version): + with pytest.raises(ValueError, match=r"has no tag for"): + spack.container.images.build_info(image, spack_version) + + +@pytest.mark.parametrize('image', [ + 'ubuntu:18.04' +]) +def test_package_info(image): + update, install, clean = spack.container.images.package_info(image) + assert update + assert install + assert clean + + +@pytest.mark.parametrize('extra_config,expected_msg', [ + ({'modules': {'enable': ['tcl']}}, 'the subsection "modules" in'), + ({'concretization': 'separately'}, 'the "concretization" attribute'), + ({'config': {'install_tree': '/some/dir'}}, + 'the "config:install_tree" attribute has been set'), + ({'view': '/some/dir'}, 'the "view" attribute has been set') +]) +def test_validate( + extra_config, expected_msg, minimal_configuration, config_dumper +): + minimal_configuration['spack'].update(extra_config) + spack_yaml_dir = config_dumper(minimal_configuration) + spack_yaml = os.path.join(spack_yaml_dir, 'spack.yaml') + + with pytest.warns(UserWarning) as w: + spack.container.validate(spack_yaml) + + # Tests are designed to raise only one warning + assert len(w) == 1 + assert expected_msg in str(w.pop().message) diff --git a/lib/spack/spack/test/container/schema.py b/lib/spack/spack/test/container/schema.py new file mode 100644 index 0000000000..3f33a3f9f7 --- /dev/null +++ b/lib/spack/spack/test/container/schema.py @@ -0,0 +1,16 @@ +# Copyright 2013-2020 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +import spack.container +import spack.schema.container + + +def test_images_in_schema(): + properties = spack.schema.container.container_schema['properties'] + allowed_images = set( + properties['base']['properties']['image']['enum'] + ) + images_in_json = set(x for x in spack.container.images.data()) + assert images_in_json == allowed_images diff --git a/lib/spack/spack/test/container/singularity.py b/lib/spack/spack/test/container/singularity.py new file mode 100644 index 0000000000..445a119f6c --- /dev/null +++ b/lib/spack/spack/test/container/singularity.py @@ -0,0 +1,42 @@ +# Copyright 2013-2020 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) +import pytest + +import spack.container.writers as writers + + +@pytest.fixture +def singularity_configuration(minimal_configuration): + minimal_configuration['spack']['container']['format'] = 'singularity' + return minimal_configuration + + +def test_ensure_render_works(singularity_configuration): + container_config = singularity_configuration['spack']['container'] + assert container_config['format'] == 'singularity' + # Here we just want to ensure that nothing is raised + writer = writers.create(singularity_configuration) + writer() + + +@pytest.mark.parametrize('properties,expected', [ + ({'runscript': '/opt/view/bin/h5ls'}, + {'runscript': '/opt/view/bin/h5ls', + 'startscript': '', + 'test': '', + 'help': ''}) +]) +def test_singularity_specific_properties( + properties, expected, singularity_configuration +): + # Set the property in the configuration + container_config = singularity_configuration['spack']['container'] + for name, value in properties.items(): + container_config.setdefault('singularity', {})[name] = value + + # Assert the properties return the expected values + writer = writers.create(singularity_configuration) + for name, value in expected.items(): + assert getattr(writer, name) == value diff --git a/share/spack/spack-completion.bash b/share/spack/spack-completion.bash index b408d0b234..623e9fba73 100755 --- a/share/spack/spack-completion.bash +++ b/share/spack/spack-completion.bash @@ -313,7 +313,7 @@ _spack() { then SPACK_COMPREPLY="-h --help -H --all-help --color -C --config-scope -d --debug --timestamp --pdb -e --env -D --env-dir -E --no-env --use-env-repo -k --insecure -l --enable-locks -L --disable-locks -m --mock -p --profile --sorted-profile --lines -v --verbose --stacktrace -V --version --print-shell-vars" else - SPACK_COMPREPLY="activate add arch blame bootstrap build build-env buildcache cd checksum ci clean clone commands compiler compilers concretize config configure create deactivate debug dependencies dependents deprecate dev-build diy docs edit env extensions fetch find flake8 gc gpg graph help info install license list load location log-parse maintainers mirror module patch pkg providers pydoc python reindex remove rm repo resource restage setup spec stage test uninstall unload upload-s3 url verify versions view" + SPACK_COMPREPLY="activate add arch blame bootstrap build build-env buildcache cd checksum ci clean clone commands compiler compilers concretize config configure containerize create deactivate debug dependencies dependents deprecate dev-build diy docs edit env extensions fetch find flake8 gc gpg graph help info install license list load location log-parse maintainers mirror module patch pkg providers pydoc python reindex remove rm repo resource restage setup spec stage test uninstall unload upload-s3 url verify versions view" fi } @@ -628,6 +628,10 @@ _spack_configure() { fi } +_spack_containerize() { + SPACK_COMPREPLY="-h --help" +} + _spack_create() { if $list_options then diff --git a/share/spack/templates/container/Dockerfile b/share/spack/templates/container/Dockerfile new file mode 100644 index 0000000000..740f46e9ee --- /dev/null +++ b/share/spack/templates/container/Dockerfile @@ -0,0 +1,51 @@ +# Build stage with Spack pre-installed and ready to be used +FROM {{ build.image }}:{{ build.tag }} as builder + +# What we want to install and how we want to install it +# is specified in a manifest file (spack.yaml) +RUN mkdir {{ paths.environment }} \ +{{ manifest }} > {{ paths.environment }}/spack.yaml + +# Install the software, remove unecessary deps +RUN cd {{ paths.environment }} && spack install && spack gc -y +{% if strip %} + +# Strip all the binaries +RUN find -L {{ paths.view }}/* -type f -exec readlink -f '{}' \; | \ + xargs file -i | \ + grep 'charset=binary' | \ + grep 'x-executable\|x-archive\|x-sharedlib' | \ + awk -F: '{print $1}' | xargs strip -s +{% endif %} + +# Modifications to the environment that are necessary to run +RUN cd {{ paths.environment }} && \ + spack env activate --sh -d . >> /etc/profile.d/z10_spack_environment.sh + +{% if extra_instructions.build %} +{{ extra_instructions.build }} +{% endif %} + +# Bare OS image to run the installed executables +FROM {{ run.image }} + +COPY --from=builder {{ paths.environment }} {{ paths.environment }} +COPY --from=builder {{ paths.store }} {{ paths.store }} +COPY --from=builder {{ paths.view }} {{ paths.view }} +COPY --from=builder /etc/profile.d/z10_spack_environment.sh /etc/profile.d/z10_spack_environment.sh + +{% if os_packages %} +RUN {{ os_packages.update }} \ + && {{ os_packages.install }}{% for pkg in os_packages.list %} {{ pkg }}{% endfor %} \ + && {{ os_packages.clean }} +{% endif %} + +{% if extra_instructions.final %} +{{ extra_instructions.final }} +{% endif %} + +{% for label, value in labels.items() %} +LABEL "{{ label }}"="{{ value }}" +{% endfor %} + +ENTRYPOINT ["/bin/bash", "--rcfile", "/etc/profile", "-l"] diff --git a/share/spack/templates/container/singularity.def b/share/spack/templates/container/singularity.def new file mode 100644 index 0000000000..616e677f96 --- /dev/null +++ b/share/spack/templates/container/singularity.def @@ -0,0 +1,90 @@ +Bootstrap: docker +From: {{ build.image }}:{{ build.tag }} +Stage: build + +%post + # Create the manifest file for the installation in /opt/spack-environment + mkdir {{ paths.environment }} && cd {{ paths.environment }} + cat << EOF > spack.yaml +{{ manifest }} +EOF + + # Install all the required software + . /opt/spack/share/spack/setup-env.sh + spack install + spack gc -y + spack env activate --sh -d . >> {{ paths.environment }}/environment_modifications.sh +{% if strip %} + + # Strip the binaries to reduce the size of the image + find -L {{ paths.view }}/* -type f -exec readlink -f '{}' \; | \ + xargs file -i | \ + grep 'charset=binary' | \ + grep 'x-executable\|x-archive\|x-sharedlib' | \ + awk -F: '{print $1}' | xargs strip -s +{% endif %} +{% if extra_instructions.build %} +{{ extra_instructions.build }} +{% endif %} + + +{% if apps %} +{% for application, help_text in apps.items() %} + +%apprun {{ application }} + exec /opt/view/bin/{{ application }} "$@" + +%apphelp {{ application }} + {{help_text }} +{% endfor %} +{% endif %} + +Bootstrap: docker +From: {{ run.image }} +Stage: final + +%files from build + {{ paths.environment }} /opt + {{ paths.store }} /opt + {{ paths.view }} /opt + {{ paths.environment }}/environment_modifications.sh {{ paths.environment }}/environment_modifications.sh + +%post +{% if os_packages.list %} + # Update, install and cleanup of system packages + {{ os_packages.update }} + {{ os_packages.install }} {{ os_packages.list | join | replace('\n', ' ') }} + {{ os_packages.clean }} +{% endif %} + # Modify the environment without relying on sourcing shell specific files at startup + cat {{ paths.environment }}/environment_modifications.sh >> $SINGULARITY_ENVIRONMENT +{% if extra_instructions.final %} +{{ extra_instructions.final }} +{% endif %} + +{% if runscript %} +%runscript +{{ runscript }} +{% endif %} + +{% if startscript %} +%startscript +{{ startscript }} +{% endif %} + +{% if test %} +%test +{{ test }} +{% endif %} + +{% if help %} +%help +{{ help }} +{% endif %} + +{% if labels %} +%labels +{% for label, value in labels.items() %} + {{ label }} {{ value }} +{% endfor %} +{% endif %} \ No newline at end of file -- GitLab