Skip to content
Snippets Groups Projects
Commit 00b3098d authored by Santiago Ospina De Los Ríos's avatar Santiago Ospina De Los Ríos
Browse files

Create only one self sufficient docker image

* This image is multi-stage. Each stage tailored for one stage on the pipeline
* Final image has a much less weight due to copying binaries to a new image and downloading essential dependencies.
parent fb5f954b
No related branches found
No related tags found
1 merge request!49Resolve "Finish installation and usage instruction on the documentation"
Pipeline #33064 failed
#!/usr/bin/env bash
# build script for all CIs
# requisites
# * DUNE_OPTIONS_FILE is defined
# * DUNECONTROL is defined or dunecontrol is in the PATH
set -e
if [[ -z "$DUNECONTROL" ]]
then
DUNECONTROL="dunecontrol"
fi
# make sure we get the right mingw64 version of g++ on appveyor
PATH=/mingw64/bin:$PATH
......@@ -17,5 +29,5 @@ gcc --version
cmake --version
${DUNECONTROL} --opts=${DUNE_OPTIONS_FILE} --only=dune-copasi all
${DUNECONTROL} --opts=${DUNE_OPTIONS_FILE} --module=$repo bexec cmake --build . --target install
rm -rf dune-copasi
cmake --build dune-copasi/build-cmake --target install
rm -rf dune-copasi/build-cmake
......@@ -10,3 +10,25 @@ index 693bab6..dd4ffae 100644
PUBLIC DUNE_LOGGING_VENDORED_FMT=1
)
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 693bab6..ee2f2ff 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -77,7 +77,7 @@ the command \"git submodule update --init --recursive\" in the dune-logging sour
# Install vendored headers
install(
FILES ${FMT_HEADERS}
- DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/dune/vendor/fmt/fmt
+ DESTINATION include/dune/vendor/fmt/fmt
)
if(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
@@ -145,7 +145,7 @@ the command \"git submodule update --init --recursive\" in the dune-logging sour
dune-logging-fmt
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/dune/vendor/fmt>
- $<INSTALL_INTERFACE:dune/vendor/fmt>
+ $<INSTALL_INTERFACE:include/dune/vendor/fmt>
)
endif()
#!/usr/bin/env bash
# dependencies setup script for Travis and AppVeyor CI
# requisites
# * DUNE_OPTIONS_FILE is defined
# * DUNCONTROL defined or CMAKE_INSTALL_PREFIX should install in a folder reachable by PATH
set -e
DUNE_VERSION="2.7"
......@@ -6,7 +13,6 @@ DUNE_VERSION="2.7"
PATH=/mingw64/bin:$PATH
echo "PATH=$PATH"
echo "MSYSTEM: $MSYSTEM"
echo "DUNECONTROL: ${DUNECONTROL}"
echo "DUNE_OPTIONS_FILE: ${DUNE_OPTIONS_FILE}"
cat ${DUNE_OPTIONS_FILE}
echo "PWD: $PWD"
......@@ -32,7 +38,6 @@ pip3 --version
which cmake
cmake --version
# download Dune dependencies
for repo in core/dune-common core/dune-geometry core/dune-grid core/dune-istl core/dune-localfunctions staging/dune-functions staging/dune-uggrid
do
......@@ -73,29 +78,39 @@ if [[ $MSYSTEM ]]; then
fi
# patch cmake macro to avoid build failure when fortran compiler not found, e.g. on osx
cd dune-common
if [[ "$OSTYPE" == "darwin"* ]]; then
cd dune-common
wget https://gist.githubusercontent.com/lkeegan/059984b71f8aeb0bbc062e85ad7ee377/raw/e9c7af42c47fe765547e60833a72b5ff1e78123c/cmake-patch.txt
echo '' >> cmake-patch.txt
git apply cmake-patch.txt
# another patch for missing header in cmake install list
git apply ../dune-copasi/.ci/dune-common.patch
cd ../
fi
# another patch for missing header in cmake install list
git apply ../dune-copasi/.ci/dune-common.patch
cd ../
cd dune-logging
git apply ../dune-copasi/.ci/dune-logging.patch
cd ../
# python virtual environment does not work in windows yet
MODULES="logging uggrid geometry grid localfunctions istl typetree functions pdelab multidomaingrid "
if [[ ! $MSYSTEM ]]; then
${DUNECONTROL} --opts=${DUNE_OPTIONS_FILE} --module=dune-testtools all
MODULES+="testtools"
fi
for repo in dune-testtools dune-logging dune-pdelab dune-multidomaingrid
./dune-common/bin/dunecontrol --opts=${DUNE_OPTIONS_FILE} --only=dune-common all
cmake --build dune-common/build-cmake/ --target install
rm -rf dune-common
if [[ -z "$DUNECONTROL" ]]
then
DUNECONTROL=dunecontrol
fi
for module in $MODULES
do
${DUNECONTROL} --opts=${DUNE_OPTIONS_FILE} --module=$repo all
${DUNECONTROL} --opts=${DUNE_OPTIONS_FILE} --only=dune-$module all
cmake --build dune-$module/build-cmake/ --target install
rm -rf dune-$module
done
${DUNECONTROL} --opts=${DUNE_OPTIONS_FILE} --module=$repo bexec cmake --build . --target install
rm -rf dune-*
#!/usr/bin/env bash
# system tests script for all CIs
set -e
# make sure we get the right mingw64 version of g++ on appveyor
PATH=/mingw64/bin:$PATH
echo "PATH=$PATH"
......@@ -13,7 +17,7 @@ g++ --version
gcc --version
cmake --version
mkdir dune-copasi/test/cmake-build && cd dune-copasi/test/cmake-build
mkdir dune-copasi/test/build-cmake && cd dune-copasi/test/build-cmake
cmake --build ..
cmake --target build_system_tests
ctest -j4 -L "DUNE_SYSTEMTEST" --output-on-failure
#!/usr/bin/env bash
# unit tests script for all CIs
set -e
# make sure we get the right mingw64 version of g++ on appveyor
PATH=/mingw64/bin:$PATH
echo "PATH=$PATH"
......@@ -13,7 +17,7 @@ g++ --version
gcc --version
cmake --version
mkdir dune-copasi/test/cmake-build && cd dune-copasi/test/cmake-build
mkdir dune-copasi/test/build-cmake && cd dune-copasi/test/build-cmake
cmake --build ..
cmake --target build_unit_tests
ctest -j4 -L "unit" --output-on-failure
......@@ -31,45 +31,42 @@ stages:
<<: *global_variables
TOOLCHAIN: gcc-8-17
DUNECI_OS: debian
DUNECI_BASE_IMAGE: ${CI_REGISTRY}/docker/ci/debian:10
DUNE_COPASI_BUILD_IMAGE: ${CI_REGISTRY}/copasi/dune-copasi/dependencies:${DUNECI_OS}-${TOOLCHAIN}-${BASE_IMAGE_VERSION}
DUNE_COPASI_DEPLOY_IMAGE: debian:buster
BASE_IMAGE: debian:10
DEPENDENCIES_IMAGE: ${CI_REGISTRY}/copasi/dune-copasi/dependencies:${DUNECI_OS}-${TOOLCHAIN}-${BASE_IMAGE_VERSION}
DEPLOY_LATEST: "true"
.debian_clang: &debian_clang
<<: *global_variables
TOOLCHAIN: clang-6-17
DUNECI_OS: debian
DUNECI_BASE_IMAGE: ${CI_REGISTRY}/docker/ci/debian:10
DUNE_COPASI_BUILD_IMAGE: ${CI_REGISTRY}/copasi/dune-copasi/dependencies:${DUNECI_OS}-${TOOLCHAIN}-${BASE_IMAGE_VERSION}
DUNE_COPASI_DEPLOY_IMAGE: debian:buster
BASE_IMAGE: debian:10
DEPENDENCIES_IMAGE: ${CI_REGISTRY}/copasi/dune-copasi/dependencies:${DUNECI_OS}-${TOOLCHAIN}-${BASE_IMAGE_VERSION}
.ubuntu_gcc: &ubuntu_gcc
<<: *global_variables
TOOLCHAIN: gcc-7-17
DUNECI_OS: ubuntu
DUNECI_BASE_IMAGE: ${CI_REGISTRY}/docker/ci/ubuntu:18.04
DUNE_COPASI_BUILD_IMAGE: ${CI_REGISTRY}/copasi/dune-copasi/dependencies:${DUNECI_OS}-${TOOLCHAIN}-${BASE_IMAGE_VERSION}
DUNE_COPASI_DEPLOY_IMAGE: ubuntu:18.04
BASE_IMAGE: ubuntu:18.04
DEPENDENCIES_IMAGE: ${CI_REGISTRY}/copasi/dune-copasi/dependencies:${DUNECI_OS}-${TOOLCHAIN}-${BASE_IMAGE_VERSION}
.ubuntu_clang: &ubuntu_clang
<<: *global_variables
TOOLCHAIN: clang-6-17
DUNECI_OS: ubuntu
DUNECI_BASE_IMAGE: ${CI_REGISTRY}/docker/ci/ubuntu:18.04
DUNE_COPASI_BUILD_IMAGE: ${CI_REGISTRY}/copasi/dune-copasi/dependencies:${DUNECI_OS}-${TOOLCHAIN}-${BASE_IMAGE_VERSION}
DUNE_COPASI_DEPLOY_IMAGE: ubuntu:18.04
BASE_IMAGE: ubuntu:18.04
DEPENDENCIES_IMAGE: ${CI_REGISTRY}/copasi/dune-copasi/dependencies:${DUNECI_OS}-${TOOLCHAIN}-${BASE_IMAGE_VERSION}
.setup: &setup
image: ${DOCKER_IMAGE}
stage: setup
script:
- echo "$CI_REGISTRY_PASSWORD" | docker login -u $CI_REGISTRY_USER --password-stdin $CI_REGISTRY/copasi/dune-copasi
- docker build -f docker/dependencies.dockerfile
--build-arg BASE_IMAGE=${DUNECI_BASE_IMAGE}
- docker build
--build-arg BASE_IMAGE=${BASE_IMAGE}
--build-arg TOOLCHAIN=${TOOLCHAIN}
-t ${DUNE_COPASI_BUILD_IMAGE} .
- docker push ${DUNE_COPASI_BUILD_IMAGE}
--target setup-env
-t ${DEPENDENCIES_IMAGE} .
- docker push ${DEPENDENCIES_IMAGE}
- docker logout $CI_REGISTRY/copasi/dune-copasi
rules:
- if: '$REBUILD_BASE_IMAGE'
......@@ -79,7 +76,7 @@ stages:
<<: *dind_docker_tags
.build: &build
image: ${DUNE_COPASI_BUILD_IMAGE}
image: ${DEPENDENCIES_IMAGE}
stage: build
script:
- cd ..
......@@ -91,7 +88,7 @@ stages:
<<: *default_tags
.unit_tests: &unit_tests
image: ${DUNE_COPASI_BUILD_IMAGE}
image: ${DEPENDENCIES_IMAGE}
stage: unit_tests
script:
- echo 'CMAKE_FLAGS+=" -DCMAKE_BUILD_TYPE=Debug"' >> /duneci/cmake-flags/dune_copasi.opts
......@@ -105,7 +102,7 @@ stages:
<<: *default_tags
.system_tests: &system_tests
image: ${DUNE_COPASI_BUILD_IMAGE}
image: ${DEPENDENCIES_IMAGE}
stage: system_tests
script:
- cd ..
......@@ -124,14 +121,13 @@ stages:
script:
- echo "$CI_REGISTRY_PASSWORD" | docker login -u $CI_REGISTRY_USER --password-stdin $CI_REGISTRY/copasi/dune-copasi
- DOCKER_TAG="${DUNECI_OS}-${TOOLCHAIN}-${CI_COMMIT_REF_NAME}"
- docker build -f docker/dune-copasi.dockerfile
--build-arg BUILD_IMAGE=${DUNE_COPASI_BUILD_IMAGE}
--build-arg PRODUCTION_IMAGE=${DUNE_COPASI_DEPLOY_IMAGE}
--build-arg BRANCH=${CI_COMMIT_REF_NAME}
- docker build
--build-arg BASE_IMAGE=${BASE_IMAGE}
--build-arg TOOLCHAIN=${TOOLCHAIN}
--cache-from ${DEPENDENCIES_IMAGE}
-t $CI_REGISTRY/copasi/dune-copasi/dune-copasi:${DOCKER_TAG} .
- docker push $CI_REGISTRY/copasi/dune-copasi/dune-copasi:${DOCKER_TAG}
- |
if [ "$CI_COMMIT_BRANCH" == "latest" && $DEPLOY_LATEST ]; then
- if [ "$CI_COMMIT_BRANCH" == "latest" && $DEPLOY_LATEST ]; then
docker tag $CI_REGISTRY/copasi/dune-copasi/dune-copasi:${DOCKER_TAG} $CI_REGISTRY/copasi/dune-copasi/dune-copasi:latest
docker push $CI_REGISTRY/copasi/dune-copasi/dune-copasi:latest
fi
......@@ -149,8 +145,7 @@ stages:
script:
- mkdir -m 777 dunecopasi && cd dunecopasi
- cp test/test_cell.mini dunecopasi
- docker run -v $PWD $CI_REGISTRY/copasi/dune-copasi/dune-copasi:${DOCKER_TAG} dune_copasi_md test_cell.mini
- docker run -v $PWD $CI_REGISTRY/copasi/dune-copasi/dune-copasi:${DOCKER_TAG} dune-copasi-md test_cell.mini
# debian gcc
setup:debian_gcc:
......
ARG BASE_IMAGE=debian:10
ARG DUNECI_PARALLEL=2
# setup of dune dependencies
FROM registry.dune-project.org/docker/ci/${BASE_IMAGE} AS setup-env
ARG TOOLCHAIN=clang-6-17
ENV DUNE_OPTIONS_FILE=/duneci/dune.opts
ENV PATH=/duneci/install/bin:$PATH
RUN ln -s /duneci/toolchains/${TOOLCHAIN} /duneci/toolchain \
&& export PATH=/duneci/install/bin:$PATH
RUN echo 'CMAKE_FLAGS+=" -DDUNE_PYTHON_VIRTUALENV_SETUP=1"' >> /duneci/cmake-flags/enable_virtualenv \
&& echo 'CMAKE_FLAGS+=" -DDUNE_PYTHON_VIRTUALENV_PATH=/duneci/install/dune-python-venv"' >> /duneci/cmake-flags/enable_virtualenv \
&& echo 'CMAKE_FLAGS+=" -DCMAKE_PREFIX_PATH:PATH=/duneci/install"' >> /duneci/cmake-flags/install_path \
&& echo 'CMAKE_FLAGS+=" -DCMAKE_INSTALL_PREFIX:PATH=/duneci/install"' >> /duneci/cmake-flags/install_path \
&& echo 'CMAKE_FLAGS+=" -DCMAKE_GENERATOR="Ninja' >> /duneci/cmake-flags/cmake_generator
WORKDIR /duneci/modules
RUN mkdir -p /duneci/modules/dune-copasi/.ci
COPY --chown=duneci ./.ci /duneci/modules/dune-copasi/.ci
RUN bash dune-copasi/.ci/setup.sh
# build and install dune-copasi from the setup-env
FROM setup-env AS build-env
ENV DUNE_OPTIONS_FILE=/duneci/dune.opts
ENV PATH=/duneci/install/bin:$PATH
RUN echo 'CMAKE_FLAGS+=" -DDUNE_COPASI_SD_EXECUTABLE=ON"' >> /duneci/cmake-flags/production \
&& echo 'CMAKE_FLAGS+=" -DDUNE_COPASI_MD_EXECUTABLE=ON"' >> /duneci/cmake-flags/production \
&& echo 'CMAKE_FLAGS+=" -DCMAKE_CXX_FLAGS_RELEASE='"'"'-O3 -fvisibility=hidden -fpic -static-libstdc++'"'"' "' >> /duneci/cmake-flags/production \
&& echo 'CMAKE_FLAGS+=" -DCMAKE_BUILD_TYPE=Release"' >> /duneci/cmake-flags/production
WORKDIR /duneci/modules
COPY --chown=duneci ./ /duneci/modules/dune-copasi
RUN bash dune-copasi/.ci/build.sh
# move results to a -lighter- production image
FROM ${BASE_IMAGE} AS production-env
LABEL maintainer="santiago.ospina@iwr.uni-heidelberg.de"
COPY --from=build-env /duneci/install /usr/local
RUN rm -f /etc/apt/apt.conf.d/docker-gzip-indexes \
&& rm -rf /var/lib/apt/lists/*
RUN export DEBIAN_FRONTEND=noninteractive; \
apt-get update && apt-get dist-upgrade --no-install-recommends --yes \
&& apt-get install --no-install-recommends --yes \
libscotchparmetis-dev \
libldl2 \
libspqr2 \
libumfpack5 \
libarpack++2c2a \
libsuperlu5 \
libgmpxx4ldbl \
libopenblas-base \
libtiff5 \
libmuparser2v5 \
&& apt-get clean && rm -rf /var/lib/apt/lists/*
RUN adduser --disabled-password --home /dunecopasi --uid 50000 dunecopasi
WORKDIR /dunecopasi
VOLUME ["/dunecopasi"]
USER dunecopasi
......@@ -194,9 +194,11 @@ target_link_libraries(my_app PRIVATE dune::dune-copasi)
# ...
```
If the `CMAKE_INSTALL_PREFIX` options was used on installation, be sure to also
include it on the app build settings:
If the `CMAKE_INSTALL_PREFIX` options was used on CMake configuration
dune-copasi, be sure to also include it as a CMake prefix
`-CMAKE_PREFIX_PATH` on the app build settings. This way, CMake can find our
targets:
```bash
cmake -DCMAKE_INSTALL_PREFIX=/opt/dune /path/to/app/source/
cmake --DCMAKE_PREFIX_PATH=/opt/dune /path/to/app/source/
```
ARG BASE_IMAGE=registry.dune-project.org/docker/ci/ubuntu:18.04
FROM ${BASE_IMAGE}
ARG DUNECI_PARALLEL=2
ARG TOOLCHAIN=clang-6-17
ARG DUNE_OPTIONS_FILE=/duneci/dune.opts
ARG DUNECONTROL=/duneci/modules/dune-common/bin/dunecontrol
RUN ln -s /duneci/toolchains/${TOOLCHAIN} /duneci/toolchain
ENV PATH=/duneci/install/bin:$PATH
RUN echo 'CMAKE_FLAGS+=" -DDUNE_PYTHON_VIRTUALENV_SETUP=1 -DDUNE_PYTHON_VIRTUALENV_PATH=/duneci/install/dune-python-venv"' >> /duneci/cmake-flags/enable_virtualenv
RUN echo 'CMAKE_FLAGS+=" -DCMAKE_PREFIX_PATH:PATH=/duneci/install"' >> /duneci/cmake-flags/install_path
RUN echo 'CMAKE_FLAGS+=" -DCMAKE_INSTALL_PREFIX:PATH=/duneci/install"' >> /duneci/cmake-flags/install_path
COPY .ci/setup.sh /duneci/modules/setup.sh
RUN cd /duneci/modules/ && bash setup.sh
ARG BUILD_IMAGE
ARG PRODUCTION_IMAGE
FROM ${BUILD_IMAGE} AS build-env
ARG BRANCH=master
ARG DUNECI_PARALLEL=2
RUN echo 'CMAKE_FLAGS=" -G '"'"'Unix Makefiles'"'"'"' >> /duneci/cmake-flags/production \
&& echo 'CMAKE_FLAGS+=" -DDUNE_USE_ONLY_STATIC_LIBS=ON"' >> /duneci/cmake-flags/production \
&& echo 'CMAKE_FLAGS+=" -DDUNE_COPASI_SD_EXECUTABLE=ON"' >> /duneci/cmake-flags/production \
&& echo 'CMAKE_FLAGS+=" -DDUNE_COPASI_MD_EXECUTABLE=ON"' >> /duneci/cmake-flags/production \
&& echo 'CMAKE_FLAGS+=" -DCMAKE_CXX_FLAGS='"'"'-fvisibility=hidden -fpic -static-libstdc++'"'"' "' /duneci/cmake-flags/production
RUN duneci-install-module -b ${BRANCH} https://gitlab.dune-project.org/copasi/dune-copasi.git
RUN dunecontrol --opts=/duneci/dune.opts --only=dune-copasi bexec cmake --build . -- install
FROM ${PRODUCTION_IMAGE} AS production-env
LABEL maintainer="santiago.ospina@iwr.uni-heidelberg.de"
COPY --from=0 /duneci/install /usr/local
RUN adduser --disabled-password --home /dunecopasi --uid 50000 dunecopasi
WORKDIR /dunecopasi
VOLUME ["/dunecopasi"]
USER dunecopasi
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment