From 8c0c4cec23341fbba295e1cb92bd35b597469645 Mon Sep 17 00:00:00 2001 From: Bryan Brancotte <bryan.brancotte@pasteur.fr> Date: Mon, 17 Apr 2023 10:24:29 +0200 Subject: [PATCH] split build in multiple stage --- .gitlab-ci.yml | 94 +++++++++++++++++++++++++++++++++++--------------- Dockerfile | 27 +++++++++------ 2 files changed, 83 insertions(+), 38 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 631611f..0e2bf29 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -2,13 +2,66 @@ image: registry-gitlab.pasteur.fr/dsi-tools/docker-images/docker:latest services: - registry-gitlab.pasteur.fr/dsi-tools/docker-images/docker:dind - -build: + + + +build-my-base: stage: build - before_script: + variable: + STAGE_NAME="my-base" + script: - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY + # pull the latest build + - docker pull "$CI_REGISTRY_IMAGE:latest" || true + # pull the latest build of main + - docker pull "$CI_REGISTRY_IMAGE/main:latest" || true + # pull the latest build of this branch + - docker pull "$CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG:latest" || true + # building + - docker build + --tag "$CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG/${STAGE_NAME}:$CI_COMMIT_SHA" + --file Dockerfile + --target ${STAGE_NAME} + ./ + - docker push $CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG/${STAGE_NAME}:$CI_COMMIT_SHA" + + + +build-my-r-base: + stage: build + needs: [build-my-base] + variable: + STAGE_NAME="my-r-base" + script: + - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY + # pull the previous stage + - docker pull "$CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG/my-base:$CI_COMMIT_SHA" + # pull the latest build of the target R version in order to re-use it + - docker pull "$CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG:$R_VERSION" || true + # building + - docker build + --build-arg R_VERSION + --tag "$CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG/${STAGE_NAME}/${R_VERSION}:$CI_COMMIT_SHA" + --file Dockerfile + -target ${STAGE_NAME} + ./ + # push image tagged with its versions + - docker push "$CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG/${STAGE_NAME}/${R_VERSION}:$CI_COMMIT_SHA" + parallel: + matrix: + - R_VERSION: ["3.6.3", "4.2.3", "latest"] + + + +build-my-r-shiny: + stage: build + needs: ["build-my-r-base"] + variable: + STAGE_NAME="my-r-shiny" script: - - docker --version + - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY + # pull the previous stage + - docker pull "$CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG/my-r-base/${R_VERSION}:$CI_COMMIT_SHA" # put both versions in a env var, to be used as tag - | if [ "latest" == "${R_VERSION}" ]; then @@ -20,48 +73,33 @@ build: export VERSIONS_TAG="${R_VERSION}--${SHINY_SERVER_VERSION}" fi fi - # pull the latest build - - docker pull "$CI_REGISTRY_IMAGE:latest" || true - # pull the latest build of the targeted versions - - docker pull "$CI_REGISTRY_IMAGE:$VERSIONS_TAG" || true - # pull the latest build of the target R version in order to re-use it for the targeted SHINY_SERVER_VERSION - - docker pull "$CI_REGISTRY_IMAGE:$R_VERSION" || true - # pull the latest build of main - - docker pull "$CI_REGISTRY_IMAGE/main:latest" || true - # pull the latest build of this branch - - docker pull "$CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG:latest" || true - # build the image while passing commit SHA and versions, and tagging the image with them + # building - docker build --build-arg R_VERSION --build-arg SHINY_SERVER_VERSION - --cache-from "$CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG:latest" - --cache-from "$CI_REGISTRY_IMAGE/main:latest" - --cache-from "$CI_REGISTRY_IMAGE:$VERSIONS_TAG" - --cache-from "$CI_REGISTRY_IMAGE:$R_VERSION" - --cache-from "$CI_REGISTRY_IMAGE:latest" - --tag "$CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG:$CI_COMMIT_SHA" - --tag "$CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG:latest" --tag "$CI_REGISTRY_IMAGE:$VERSIONS_TAG" --tag "$CI_REGISTRY_IMAGE:$VERSIONS_TAG--$CI_COMMIT_SHORT_SHA" - -f Dockerfile + --tag "$CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG:latest" + --file Dockerfile + --target ${STAGE_NAME} ./ # push image as latest for the current branch - docker push "$CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG:latest" - # push image tagged with its sha - - docker push "$CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG:$CI_COMMIT_SHA" # push image tagged with its versions - - docker push "$CI_REGISTRY_IMAGE:$VERSIONS_TAG" + - docker push "$CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG:$VERSIONS_TAG" # push image tagged with its versions and the commit sha (debug purpose) - - docker push "$CI_REGISTRY_IMAGE:$VERSIONS_TAG--$CI_COMMIT_SHORT_SHA" + - docker push "$CI_REGISTRY_IMAGE/$CI_COMMIT_REF_SLUG:$VERSIONS_TAG--$CI_COMMIT_SHORT_SHA" parallel: matrix: - R_VERSION: ["3.6.3", "4.2.3", "latest"] SHINY_SERVER_VERSION: ["latest"] + + build-example: stage: build - needs: ["build"] + needs: ["build-mr-r-shiny"] only: - main before_script: diff --git a/Dockerfile b/Dockerfile index b2eab07..b04e38b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,10 +1,11 @@ -FROM ubuntu:focal +########################################################### +# Ubuntu image with all dependencies +########################################################### +FROM ubuntu:focal as my-base # define geographic location during R installation ENV TZ=Etc/UTC ENV DEBIAN_FRONTEND noninteractive -ARG SHINY_SERVER_VERSION=latest -ARG R_VERSION=latest EXPOSE 3838 CMD ["shiny-server"] @@ -34,11 +35,24 @@ RUN apt-get update \ COPY ./scripts /opt/scripts + +########################################################### +# R image +########################################################### +FROM my-base as my-r-base +ARG R_VERSION=latest + #install R, along with its dependencies RUN /opt/scripts/install_r_cran.sh # test R in another layer RUN R -q -e "sessionInfo()" +########################################################### +# RShiny image +########################################################### +FROM my-base as my-r-shiny +ARG SHINY_SERVER_VERSION=latest + # Install R packages included Shiny, then install shiny server RUN Rscript /opt/scripts/install_r_packages.R RUN /opt/scripts/install_shiny_server.sh @@ -46,12 +60,5 @@ RUN /opt/scripts/install_shiny_server.sh # allows trafic from all ips RUN sed -i "s/3838/3838 0.0.0.0/g" /etc/shiny-server/shiny-server.conf -#RUN chown shiny:shiny /var/lib/shiny-server RUN mkdir -p /var/log/shiny-server \ && chown shiny:shiny /var/log/shiny-server - -# USER shiny - - - - -- GitLab