From 22f8df2eee775b61b93bcfbaa5e34d11f4ee03d8 Mon Sep 17 00:00:00 2001 From: "Zaiming (Stone) Shi" Date: Tue, 17 Oct 2023 10:36:39 +0200 Subject: [PATCH] build: make use of rebar git cache in docker build --- .gitignore | 1 + build | 32 ++++++++++++++++++++++++++------ deploy/docker/Dockerfile | 32 ++++++++++++++++++++++---------- scripts/ensure-rebar3.sh | 4 +++- scripts/pre-compile.sh | 7 +++++-- scripts/update-bom.sh | 1 - 6 files changed, 57 insertions(+), 20 deletions(-) diff --git a/.gitignore b/.gitignore index eecb62570..0e7c614a7 100644 --- a/.gitignore +++ b/.gitignore @@ -68,3 +68,4 @@ lux_logs/ bom.json ct_run*/ apps/emqx_conf/etc/emqx.conf.all.rendered* +rebar-git-cache.tar diff --git a/build b/build index 5c2bb556b..8b485f3b6 100755 --- a/build +++ b/build @@ -6,7 +6,11 @@ set -euo pipefail -[ "${DEBUG:-0}" -eq 1 ] && set -x +if [ "${DEBUG:-0}" -eq 1 ]; then + set -x + # set this for rebar3 + export DIAGNOSTIC=1 +fi PROFILE_ARG="$1" ARTIFACT="$2" @@ -449,17 +453,33 @@ make_docker() { if [ "${DOCKER_PUSH:-false}" = true ]; then DOCKER_BUILDX_ARGS+=(--push) fi + if [ -d "${REBAR_GIT_CACHE_DIR:-}" ]; then + cache_tar="$(pwd)/rebar-git-cache.tar" + if [ ! -f "${cache_tar}" ]; then + pushd "${REBAR_GIT_CACHE_DIR}" >/dev/null + tar -cf "${cache_tar}" . + popd >/dev/null + fi + fi + if [ -n "${DEBUG:-}" ]; then + DOCKER_BUILDX_ARGS+=(--build-arg DEBUG="${DEBUG}" --progress=plain) + fi + # shellcheck disable=SC2015 [ -f ./.dockerignore ] && mv ./.dockerignore ./.dockerignore.bak || true trap docker_cleanup EXIT { - echo '/_build' - echo '/deps' - echo '/*.lock' + echo '_build/' + echo 'deps/' + echo '*.lock' + echo '_packages/' + echo '.vs/' + echo '.vscode/' + echo 'lux_logs/' + echo '_upgrade_base/' } >> ./.dockerignore - set -x + echo "Docker build args: ${DOCKER_BUILDX_ARGS[*]}" docker buildx build "${DOCKER_BUILDX_ARGS[@]}" . - [[ "${DEBUG:-}" -eq 1 ]] || set +x echo "${EMQX_IMAGE_TAG}" > ./.docker_image_tag } diff --git a/deploy/docker/Dockerfile b/deploy/docker/Dockerfile index ec227cb61..b2dfbb1f6 100644 --- a/deploy/docker/Dockerfile +++ b/deploy/docker/Dockerfile @@ -1,23 +1,35 @@ ARG BUILD_FROM=ghcr.io/emqx/emqx-builder/5.1-4:1.14.5-25.3.2-2-debian11 ARG RUN_FROM=public.ecr.aws/debian/debian:11-slim FROM ${BUILD_FROM} AS builder +ARG DEBUG=0 COPY . /emqx ARG EMQX_NAME=emqx ARG PKG_VSN -ENV EMQX_RELUP=false -RUN export PROFILE=${EMQX_NAME%%-elixir} \ - && export EMQX_NAME1=$EMQX_NAME \ - && export EMQX_NAME=$PROFILE \ - && export EMQX_REL_PATH="/emqx/_build/$EMQX_NAME/rel/emqx" \ - && export EMQX_REL_FORM='docker' \ - && cd /emqx \ - && make $EMQX_NAME1 \ - && rm -f $EMQX_REL_PATH/*.tar.gz \ +ENV EMQX_RELUP=false +ENV DEBUG=${DEBUG} +ENV EMQX_REL_FORM='docker' + +WORKDIR /emqx/ + +RUN git config --global --add safe.directory '*' + +RUN if [ -f rebar-git-cache.tar ]; then \ + mkdir .cache && \ + tar -xf rebar-git-cache.tar -C .cache && \ + export REBAR_GIT_CACHE_DIR='/emqx/.cache' && \ + export REBAR_GIT_CACHE_REF_AUTOFILL=0 ;\ + fi \ + && export PROFILE=${EMQX_NAME%%-elixir} \ + && export EMQX_NAME1="${EMQX_NAME}" \ + && export EMQX_NAME=${PROFILE} \ + && export EMQX_REL_PATH="/emqx/_build/${EMQX_NAME}/rel/emqx" \ + && make ${EMQX_NAME1} \ + && rm -f ${EMQX_REL_PATH}/*.tar.gz \ && mkdir -p /emqx-rel \ - && mv $EMQX_REL_PATH /emqx-rel + && mv ${EMQX_REL_PATH} /emqx-rel FROM $RUN_FROM ARG EXTRA_DEPS='' diff --git a/scripts/ensure-rebar3.sh b/scripts/ensure-rebar3.sh index 6eda16d30..12c492132 100755 --- a/scripts/ensure-rebar3.sh +++ b/scripts/ensure-rebar3.sh @@ -2,6 +2,8 @@ set -euo pipefail +[ "${DEBUG:-0}" -eq 1 ] && set -x + ## rebar3 tag 3.19.0-emqx-1 is compiled using latest official OTP-24 image. ## we have to use an otp24-compiled rebar3 because the defination of record #application{} ## in systools.hrl is changed in otp24. @@ -14,7 +16,7 @@ case ${OTP_VSN} in VERSION="3.18.0-emqx-1" ;; 25*) - VERSION="3.19.0-emqx-8" + VERSION="3.19.0-emqx-9" ;; *) echo "Unsupporetd Erlang/OTP version $OTP_VSN" diff --git a/scripts/pre-compile.sh b/scripts/pre-compile.sh index 1700dd8a4..632aabfe4 100755 --- a/scripts/pre-compile.sh +++ b/scripts/pre-compile.sh @@ -2,6 +2,8 @@ set -euo pipefail +[ "${DEBUG:-0}" -eq 1 ] && set -x + # NOTE: PROFILE_STR may not be exactly PROFILE (emqx or emqx-enterprise) # it might be with suffix such as -pkg etc. PROFILE_STR="${1}" @@ -28,5 +30,6 @@ curl -L --silent --show-error \ --output "apps/emqx_dashboard/priv/desc.zh.hocon" \ 'https://raw.githubusercontent.com/emqx/emqx-i18n/main/desc.zh.hocon' -# generate sbom -./scripts/update-bom.sh "$PROFILE_STR" ./rel +# TODO +# make sbom a build artifcat +# ./scripts/update-bom.sh "$PROFILE_STR" ./rel diff --git a/scripts/update-bom.sh b/scripts/update-bom.sh index 20ab45e22..d120b9bf4 100755 --- a/scripts/update-bom.sh +++ b/scripts/update-bom.sh @@ -8,4 +8,3 @@ PROFILE="$1" REL_DIR="$2" ./rebar3 as "$PROFILE" sbom -f -o "$REL_DIR/bom.json" -