From 9e76e63a8a27f6c935483439b49d7f44a7e9701e Mon Sep 17 00:00:00 2001 From: Konrad Botor Date: Wed, 16 Nov 2022 13:51:34 +0100 Subject: [PATCH 01/10] Replaced local /scripts/ci-helpers/prepare_data_image_job.yml with /templates/data_image_jobs.gitlab-ci.yml from hive/common-ci-configuration> - ref. #406 --- .gitlab-ci.yaml | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yaml b/.gitlab-ci.yaml index ad16d78dd..44e124d52 100644 --- a/.gitlab-ci.yaml +++ b/.gitlab-ci.yaml @@ -17,13 +17,21 @@ variables: # uses registry.gitlab.syncad.com/hive/hive/ci-base-image:ubuntu20.04-7 TEST_IMAGE_TAG: "@sha256:034b706db277c62e36f07c7d8d8729f55b6be9d4cbc3eddd3a63d38c9a77ead6" + # Variables required bu Common CI jobs + DOCKER_BUILDER_TAG: "b1af58191e62b310dcc57514332c3b7fbcfef323" + DOCKER_DIND_TAG: "b1af58191e62b310dcc57514332c3b7fbcfef323" + IMAGE_REMOVER_TAG: "b1af58191e62b310dcc57514332c3b7fbcfef323" + # Versions of Python packages PYTHON_JUNIT_XML_VERSION: "1.9" PYTHON_DATEUTIL_VERSION: "2.8.2" TOX_VERSION: "3.25.1" -include: '/scripts/ci-helpers/prepare_data_image_job.yml' +include: + - project: 'hive/common-ci-configuration' + ref: kbotor/custom-docker-containers-containing-required-bash-scripts + file: '/templates/data_image_jobs.gitlab-ci.yml' prepare_hived_data_image: extends: .prepare_hived_data_5m_image @@ -43,8 +51,6 @@ cleanup_hived_data_image: - prepare_hived_data_image variables: - REGISTRY: $CI_REGISTRY_IMAGE - REGISTRY_USER: "$HIVED_CI_IMGBUILDER_USER" REGISTRY_PASS: $HIVED_REGISTRY_CLEANUP_TOKEN IMAGE_PATH: $HIVED_IMAGE_NAME_REGISTRY_PATH IMAGE_TAG: $HIVED_IMAGE_NAME_REGISTRY_TAG -- GitLab From 91f807f5fd92ba73091b1be33bddf7f0c689ffc2 Mon Sep 17 00:00:00 2001 From: Konrad Botor Date: Thu, 17 Nov 2022 14:15:16 +0100 Subject: [PATCH 02/10] Updated Common CI to the newest develop commit - - ref. hive#406 --- .gitlab-ci.yaml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.gitlab-ci.yaml b/.gitlab-ci.yaml index 44e124d52..e78bffc07 100644 --- a/.gitlab-ci.yaml +++ b/.gitlab-ci.yaml @@ -18,9 +18,10 @@ variables: TEST_IMAGE_TAG: "@sha256:034b706db277c62e36f07c7d8d8729f55b6be9d4cbc3eddd3a63d38c9a77ead6" # Variables required bu Common CI jobs - DOCKER_BUILDER_TAG: "b1af58191e62b310dcc57514332c3b7fbcfef323" - DOCKER_DIND_TAG: "b1af58191e62b310dcc57514332c3b7fbcfef323" - IMAGE_REMOVER_TAG: "b1af58191e62b310dcc57514332c3b7fbcfef323" + CI_COMMON_JOB_VERSION: "03ffbc88c25fc78994fa8ea6b878e8b73d680ed9" + DOCKER_BUILDER_TAG: "$CI_COMMON_JOB_VERSION" + DOCKER_DIND_TAG: "$CI_COMMON_JOB_VERSION" + IMAGE_REMOVER_TAG: "$CI_COMMON_JOB_VERSION" # Versions of Python packages PYTHON_JUNIT_XML_VERSION: "1.9" @@ -30,7 +31,7 @@ variables: include: - project: 'hive/common-ci-configuration' - ref: kbotor/custom-docker-containers-containing-required-bash-scripts + ref: 03ffbc88c25fc78994fa8ea6b878e8b73d680ed9 file: '/templates/data_image_jobs.gitlab-ci.yml' prepare_hived_data_image: -- GitLab From d0ee40f7b4777ee92cea62795b8790e70b970341 Mon Sep 17 00:00:00 2001 From: Konrad Botor Date: Fri, 16 Dec 2022 14:13:44 +0100 Subject: [PATCH 03/10] Updated CI flow to use the new Docker image job templates - ref #406 --- .gitlab-ci.yaml | 12 +-- doc/building.md | 1 + scripts/ci-helpers/build_data.sh | 31 ++++---- scripts/ci-helpers/build_data4commit.sh | 14 ++-- scripts/ci-helpers/build_dind_image.sh | 36 --------- scripts/ci-helpers/build_instance.sh | 78 ++++++++++++++----- scripts/ci-helpers/export-binaries.sh | 2 - scripts/ci-helpers/get_image4submodule.sh | 44 ++++++----- scripts/ci-helpers/prepare_data_image_job.yml | 50 ++++-------- 9 files changed, 127 insertions(+), 141 deletions(-) delete mode 100755 scripts/ci-helpers/build_dind_image.sh diff --git a/.gitlab-ci.yaml b/.gitlab-ci.yaml index e78bffc07..4f0df53a2 100644 --- a/.gitlab-ci.yaml +++ b/.gitlab-ci.yaml @@ -17,12 +17,6 @@ variables: # uses registry.gitlab.syncad.com/hive/hive/ci-base-image:ubuntu20.04-7 TEST_IMAGE_TAG: "@sha256:034b706db277c62e36f07c7d8d8729f55b6be9d4cbc3eddd3a63d38c9a77ead6" - # Variables required bu Common CI jobs - CI_COMMON_JOB_VERSION: "03ffbc88c25fc78994fa8ea6b878e8b73d680ed9" - DOCKER_BUILDER_TAG: "$CI_COMMON_JOB_VERSION" - DOCKER_DIND_TAG: "$CI_COMMON_JOB_VERSION" - IMAGE_REMOVER_TAG: "$CI_COMMON_JOB_VERSION" - # Versions of Python packages PYTHON_JUNIT_XML_VERSION: "1.9" PYTHON_DATEUTIL_VERSION: "2.8.2" @@ -30,9 +24,8 @@ variables: TOX_VERSION: "3.25.1" include: - - project: 'hive/common-ci-configuration' - ref: 03ffbc88c25fc78994fa8ea6b878e8b73d680ed9 - file: '/templates/data_image_jobs.gitlab-ci.yml' + - template: Workflows/Branch-Pipelines.gitlab-ci.yml + - local: '/scripts/ci-helpers/prepare_data_image_job.yml' prepare_hived_data_image: extends: .prepare_hived_data_5m_image @@ -97,6 +90,7 @@ mirrornet_node_build: "$IMAGE_TAG" "$SOURCES_DIR" "$REGISTRY_URL" + --cache-path=$CI_COMMIT_REF_SLUG --network-type="mirrornet" --export-binaries="$BINARIES_DIR" - chmod -Rc a+rwx "$BINARIES_DIR" diff --git a/doc/building.md b/doc/building.md index 3e69bb444..7b4b44821 100644 --- a/doc/building.md +++ b/doc/building.md @@ -43,6 +43,7 @@ We ship a Dockerfile. This builds both common node type binaries. - mainnet (default) - `--export-binaries=PATH` - allows to extract built binaries from created image +- `--cache-path=BRANCH_NAME` - allows to specify a Git branch to pull and push Docker BuildKit cache for Above example call will create the image: `registry.gitlab.syncad.com/hive/hive/instance:my-local-tag` diff --git a/scripts/ci-helpers/build_data.sh b/scripts/ci-helpers/build_data.sh index 93c11054f..24c8120ef 100755 --- a/scripts/ci-helpers/build_data.sh +++ b/scripts/ci-helpers/build_data.sh @@ -1,17 +1,22 @@ #! /bin/bash -SCRIPTPATH="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" +SCRIPTPATH=$(realpath "$0") +SCRIPTPATH=$(dirname "$SCRIPTPATH") SCRIPTSDIR="$SCRIPTPATH/.." +# shellcheck disable=SC2034 LOG_FILE=build_data.log +# shellcheck source=../common.sh source "$SCRIPTSDIR/common.sh" -BUILD_IMAGE_TAG=${1:?"Missing arg #1 to specify built image tag"} +BUILD_IMAGE_TAG=${1:?"Missing argument #1: build image tag"} shift -SRCROOTDIR=${1:?Missing arg #2 to specify source directory} +SRCROOTDIR=${1:?"Missing argument #2: source directory"} shift -REGISTRY=${1:?"Missing arg #3 to specify target container registry"} +REGISTRY=${1:?"Missing argument #3: target image registry"} shift +BRANCH_NAME=${1:?"Missing argument #4: branch to get buildkit cache for"} +shift # Supplement a registry path by trailing slash (if needed) [[ "${REGISTRY}" != */ ]] && REGISTRY="${REGISTRY}/" @@ -19,19 +24,19 @@ shift BUILD_HIVE_TESTNET=OFF HIVE_CONVERTER_BUILD=OFF -"$SCRIPTSDIR/ci-helpers/build_instance.sh" "${BUILD_IMAGE_TAG}" "${SRCROOTDIR}" "${REGISTRY}" "$@" +"$SCRIPTSDIR/ci-helpers/build_instance.sh" "${BUILD_IMAGE_TAG}" "${SRCROOTDIR}" "${REGISTRY}" "--cache-path=$BRANCH_NAME" "$@" echo "Instance image built. Attempting to build a data image basing on it..." -pushd "$SRCROOTDIR" - -export DOCKER_BUILDKIT=1 +pushd "$SRCROOTDIR" || exit 1 -docker build --target=data \ - --build-arg CI_REGISTRY_IMAGE=$REGISTRY \ +docker buildx build --target=data --progress=plain --load \ + --build-arg CI_REGISTRY_IMAGE="$REGISTRY" \ --build-arg BUILD_HIVE_TESTNET=$BUILD_HIVE_TESTNET \ --build-arg HIVE_CONVERTER_BUILD=$HIVE_CONVERTER_BUILD \ - --build-arg BUILD_IMAGE_TAG=$BUILD_IMAGE_TAG \ - -t ${REGISTRY}data:data-${BUILD_IMAGE_TAG} -f Dockerfile . + --build-arg BUILD_IMAGE_TAG="$BUILD_IMAGE_TAG" \ + --cache-from "type=registry,ref=${REGISTRY}data:data-$BRANCH_NAME" \ + --cache-to "type=registry,mode=max,ref=${REGISTRY}data:data-$BRANCH_NAME" \ + --tag "${REGISTRY}data:data-${BUILD_IMAGE_TAG}" -f Dockerfile . -popd +popd || exit 1 diff --git a/scripts/ci-helpers/build_data4commit.sh b/scripts/ci-helpers/build_data4commit.sh index 3f6a6ade6..52bb187f9 100755 --- a/scripts/ci-helpers/build_data4commit.sh +++ b/scripts/ci-helpers/build_data4commit.sh @@ -1,15 +1,19 @@ #! /bin/bash -SCRIPTPATH="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" +SCRIPTPATH=$(realpath "$0") +SCRIPTPATH=$(dirname "$SCRIPTPATH") SCRIPTSDIR="$SCRIPTPATH/.." -SRCROOTDIR="$SCRIPTSDIR/.." +# shellcheck disable=SC2034 LOG_FILE=build_data4commit.log +# shellcheck source=../common.sh source "$SCRIPTSDIR/common.sh" -COMMIT=${1:?"Missing arg 1 to specify COMMIT"} +COMMIT=${1:?"Missing argument #1: commit SHA"} shift -REGISTRY=${1:?"Missing arg #2 to specify target container registry"} +REGISTRY=${1:?"Missing argument #2: target image registry"} +shift +BRANCH_NAME=${1:?"Missing argument #3: branch to get buildkit cache for"} shift BRANCH="master" @@ -17,5 +21,5 @@ BUILD_IMAGE_TAG=$COMMIT do_clone "$BRANCH" "./hive-${COMMIT}" https://gitlab.syncad.com/hive/hive.git "$COMMIT" -"$SCRIPTSDIR/ci-helpers/build_data.sh" "$BUILD_IMAGE_TAG" "./hive-${COMMIT}" "$REGISTRY" "$@" +"$SCRIPTSDIR/ci-helpers/build_data.sh" "$BUILD_IMAGE_TAG" "./hive-${COMMIT}" "$REGISTRY" "$BRANCH_NAME" "$@" diff --git a/scripts/ci-helpers/build_dind_image.sh b/scripts/ci-helpers/build_dind_image.sh deleted file mode 100755 index 8446fefc7..000000000 --- a/scripts/ci-helpers/build_dind_image.sh +++ /dev/null @@ -1,36 +0,0 @@ -#! /bin/bash - -export REGISTRY=${1:-registry.gitlab.syncad.com/hive/hive/} -export DOCKER_VERSION=20.10.10 -export DIND_VERSION=${DOCKER_VERSION}-dind - -export DOCKER_BUILDKIT=1 - -docker build -t ${REGISTRY}custom_docker:${DOCKER_VERSION} - << EOF - FROM docker:${DOCKER_VERSION} - RUN apk update && apk add --no-cache bash git ca-certificates curl jq -EOF - -docker build -t ${REGISTRY}custom_dind:${DIND_VERSION} - << EOF - # To workaround a gitlab healthcheck bug, expose just single port. See https://gitlab.com/gitlab-org/gitlab-runner/-/issues/29130#note_1028331564 - - FROM docker:${DIND_VERSION} as upstream - - # copy everything to a clean image, so we can change the exposed ports - # see https://gitlab.com/search?search=Service+docker+dind+probably+didn%27t+start+properly&nav_source=navbar&project_id=250833&group_id=9970&scope=issues&sort=updated_desc - FROM scratch - - COPY --from=upstream / / - - RUN apk update && apk --no-cache add bash ca-certificates curl jq - - VOLUME /var/lib/docker - - #EXPOSE 2375/tcp # is for insecure connections, and having both breaks Gitlab's "wait-for-it" service - EXPOSE 2376/tcp - - ENTRYPOINT ["dockerd-entrypoint.sh"] - CMD [] - -EOF - diff --git a/scripts/ci-helpers/build_instance.sh b/scripts/ci-helpers/build_instance.sh index bb168bdc4..a86b7baf4 100755 --- a/scripts/ci-helpers/build_instance.sh +++ b/scripts/ci-helpers/build_instance.sh @@ -1,9 +1,12 @@ #! /bin/bash -SCRIPTPATH="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" +SCRIPTPATH=$(realpath "$0") +SCRIPTPATH=$(dirname "$SCRIPTPATH") SCRIPTSDIR="$SCRIPTPATH/.." +# shellcheck disable=SC2034 LOG_FILE=build_instance.log +# shellcheck source=../common.sh source "$SCRIPTSDIR/common.sh" BUILD_IMAGE_TAG="" @@ -23,6 +26,7 @@ print_help () { echo "OPTIONS:" echo " --network-type=TYPE Allows to specify type of blockchain network supported by built hived. Allowed values: mainnet, testnet, mirrornet" echo " --export-binaries=PATH Allows to specify a path where binaries shall be exported from built image." + echo " --cache-path=BRANCH_NAME Allows to specify a Git branch to pull and push Docker BuildKit cache for" echo " --help Display this help screen and exit" echo } @@ -59,6 +63,10 @@ while [ $# -gt 0 ]; do arg="${1#*=}" EXPORT_PATH="$arg" ;; + --cache-path=*) + arg="${1#*=}" + BRANCH_NAME="$arg" + ;; --help) print_help exit 0 @@ -84,38 +92,68 @@ while [ $# -gt 0 ]; do shift done -TST_IMGTAG=${BUILD_IMAGE_TAG:?"Missing arg #1 to specify built image tag"} -TST_SRCDIR=${SRCROOTDIR:?"Missing arg #2 to specify source directory"} -TST_REGISTRY=${REGISTRY:?"Missing arg #3 to specify target container registry"} +[[ -z "$BUILD_IMAGE_TAG" ]] && echo "Missing argument #1: build image tag." && exit 1 +[[ -z "$SRCROOTDIR" ]] && echo "Missing argument #2: source directory. Exiting." && exit 1 +[[ -z "$REGISTRY" ]] && echo "Missing argument #3: target image registry. Exiting." && exit 1 # Supplement a registry path by trailing slash (if needed) [[ "${REGISTRY}" != */ ]] && REGISTRY="${REGISTRY}/" echo "Moving into source root directory: ${SRCROOTDIR}" -pushd "$SRCROOTDIR" +pushd "$SRCROOTDIR" || exit 1 #pwd -export DOCKER_BUILDKIT=1 - -docker build --target=base_instance \ - --build-arg CI_REGISTRY_IMAGE=$REGISTRY \ - --build-arg BUILD_HIVE_TESTNET=$BUILD_HIVE_TESTNET \ +if [ -n "${BRANCH_NAME}" ]; +then + CACHE_REF="${REGISTRY}base_instance:base_instance-$BRANCH_NAME" + echo "Building base instance image with cache ${CACHE_REF}" + docker buildx build --target=base_instance --progress=plain --load \ + --build-arg CI_REGISTRY_IMAGE="$REGISTRY" \ + --build-arg BUILD_HIVE_TESTNET=$BUILD_HIVE_TESTNET \ + --build-arg HIVE_CONVERTER_BUILD=$HIVE_CONVERTER_BUILD \ + --build-arg BUILD_IMAGE_TAG="$BUILD_IMAGE_TAG" \ + --cache-from "type=registry,ref=${CACHE_REF}" \ + --cache-to "type=registry,mode=max,ref=${CACHE_REF}" \ + --tag "${REGISTRY}base_instance:base_instance-${BUILD_IMAGE_TAG}" -f Dockerfile . + + # Build the image containing only binaries and be ready to start running hived instance, operating on mounted volummes pointing instance datadir and shm_dir + CACHE_REF="${REGISTRY}${IMAGE_TAG_PREFIX}instance:instance-$BRANCH_NAME" + echo "Building instance image with cache ${CACHE_REF}" + docker buildx build --target=instance --progress=plain --load \ + --build-arg CI_REGISTRY_IMAGE="$REGISTRY" \ + --build-arg BUILD_HIVE_TESTNET="$BUILD_HIVE_TESTNET" \ --build-arg HIVE_CONVERTER_BUILD=$HIVE_CONVERTER_BUILD \ - --build-arg BUILD_IMAGE_TAG=$BUILD_IMAGE_TAG -t ${REGISTRY}base_instance:base_instance-${BUILD_IMAGE_TAG} -f Dockerfile . + --cache-from "type=registry,ref=${CACHE_REF}" \ + --cache-to "type=registry,mode=max,ref=${CACHE_REF}" \ + --build-arg BUILD_IMAGE_TAG="$BUILD_IMAGE_TAG" \ + --tag "${REGISTRY}${IMAGE_TAG_PREFIX}instance:instance-${BUILD_IMAGE_TAG}" -f Dockerfile . +else + echo "Building base instance image" + docker buildx build --target=base_instance --progress=plain --load \ + --build-arg CI_REGISTRY_IMAGE="$REGISTRY" \ + --build-arg BUILD_HIVE_TESTNET=$BUILD_HIVE_TESTNET \ + --build-arg HIVE_CONVERTER_BUILD=$HIVE_CONVERTER_BUILD \ + --build-arg BUILD_IMAGE_TAG="$BUILD_IMAGE_TAG" \ + --tag "${REGISTRY}base_instance:base_instance-${BUILD_IMAGE_TAG}" -f Dockerfile . + + # Build the image containing only binaries and be ready to start running hived instance, operating on mounted volummes pointing instance datadir and shm_dir + echo "Building instance image" + docker buildx build --target=instance --progress=plain --load \ + --build-arg CI_REGISTRY_IMAGE="$REGISTRY" \ + --build-arg BUILD_HIVE_TESTNET="$BUILD_HIVE_TESTNET" \ + --build-arg HIVE_CONVERTER_BUILD=$HIVE_CONVERTER_BUILD \ + --build-arg BUILD_IMAGE_TAG="$BUILD_IMAGE_TAG" \ + --tag "${REGISTRY}${IMAGE_TAG_PREFIX}instance:instance-${BUILD_IMAGE_TAG}" -f Dockerfile . +fi + -# Build the image containing only binaries and be ready to start running hived instance, operating on mounted volummes pointing instance datadir and shm_dir -docker build --target=instance \ - --build-arg CI_REGISTRY_IMAGE=$REGISTRY \ - --build-arg BUILD_HIVE_TESTNET=$BUILD_HIVE_TESTNET \ - --build-arg HIVE_CONVERTER_BUILD=$HIVE_CONVERTER_BUILD \ - --build-arg BUILD_IMAGE_TAG=$BUILD_IMAGE_TAG -t ${REGISTRY}${IMAGE_TAG_PREFIX}instance:instance-${BUILD_IMAGE_TAG} -f Dockerfile . -popd +popd || exit 1 -if [ ! -z "${EXPORT_PATH}" ]; +if [ -n "${EXPORT_PATH}" ]; then - "$SCRIPTPATH/export-binaries.sh" ${REGISTRY}${IMAGE_TAG_PREFIX}instance:instance-${BUILD_IMAGE_TAG} "${EXPORT_PATH}" + "$SCRIPTPATH/export-binaries.sh" "${REGISTRY}${IMAGE_TAG_PREFIX}instance:instance-${BUILD_IMAGE_TAG}" "${EXPORT_PATH}" fi diff --git a/scripts/ci-helpers/export-binaries.sh b/scripts/ci-helpers/export-binaries.sh index 66bd671bb..9d08272de 100755 --- a/scripts/ci-helpers/export-binaries.sh +++ b/scripts/ci-helpers/export-binaries.sh @@ -2,8 +2,6 @@ set -euo pipefail -SCRIPTPATH="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" - IMAGE_TAGGED_NAME=${1:-"Missing image name"} EXPORT_PATH=${2:-"Missing export target directory"} diff --git a/scripts/ci-helpers/get_image4submodule.sh b/scripts/ci-helpers/get_image4submodule.sh index 4babdf85b..07d23e16d 100755 --- a/scripts/ci-helpers/get_image4submodule.sh +++ b/scripts/ci-helpers/get_image4submodule.sh @@ -1,61 +1,63 @@ #! /bin/bash +# shellcheck source-path=SCRIPTDIR set -euo pipefail -SCRIPTPATH="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" -SCRIPTSDIR="$SCRIPTPATH/.." -SRCROOTDIR="$SCRIPTSDIR/.." +SCRIPTPATH=$(realpath "$0") +SCRIPTPATH=$(dirname "$SCRIPTPATH") IMGNAME=data source "$SCRIPTPATH/docker_image_utils.sh" -submodule_path=${1:?"Missing arg 1 for submodule path variable"} +SUBMODULE_PATH=${1:?"Missing argument #1: submodule path"} shift -REGISTRY=${1:?"Missing arg 2 for REGISTRY variable"} +REGISTRY=${1:?"Missing argument #2: image registry"} shift -DOTENV_VAR_NAME=${1:?"Missing name of dot-env variable"} +DOTENV_VAR_NAME=${1:?"Missing argument #3: dot-env name"} shift -REGISTRY_USER=${1:?"Missing arg 4 for REGISTRY_USER variable"} +REGISTRY_USER=${1:?"Missing argument #4: registry user"} shift -REGISTRY_PASSWORD=${1:?"Missing arg 5 for REGISTRY_PASSWORD variable"} +REGISTRY_PASSWORD=${1:?"Missing argument #5: registry password"} shift -BINARY_CACHE_PATH=${1:?"Missing arg 6 specific to binary cache path"} +BINARY_CACHE_PATH=${1:?"Missing argument #6: binary cache path"} +shift +BRANCH_NAME=${1:?"Missing argument #7: branch to get buildkit cache for"} shift retrieve_submodule_commit () { - local p="${1}" + local -r p="${1}" pushd "$p" >/dev/null 2>&1 - local commit=$( git rev-parse HEAD ) + local -r commit=$( git rev-parse HEAD ) popd >/dev/null 2>&1 echo "$commit" } -echo "Attempting to get commit for: $submodule_path" +echo "Attempting to get commit for: $SUBMODULE_PATH" -commit=$( retrieve_submodule_commit ${submodule_path} ) +commit=$( retrieve_submodule_commit "${SUBMODULE_PATH}" ) -img=$( build_image_name $IMGNAME $commit $REGISTRY ) -img_path=$( build_image_registry_path $IMGNAME $commit $REGISTRY ) -img_tag=$( build_image_registry_tag $IMGNAME $commit $REGISTRY ) +img=$( build_image_name $IMGNAME "$commit" "$REGISTRY" ) +img_path=$( build_image_registry_path $IMGNAME "$commit" "$REGISTRY" ) +img_tag=$( build_image_registry_tag $IMGNAME "$commit" "$REGISTRY" ) -echo $REGISTRY_PASSWORD | docker login -u $REGISTRY_USER $REGISTRY --password-stdin +echo "$REGISTRY_PASSWORD" | docker login -u "$REGISTRY_USER" "$REGISTRY" --password-stdin image_exists=0 -docker_image_exists $IMGNAME $commit $REGISTRY image_exists +docker_image_exists $IMGNAME "$commit" "$REGISTRY" image_exists if [ "$image_exists" -eq 1 ]; then echo "Image already exists..." - "$SCRIPTPATH/export-binaries.sh" ${img} "${BINARY_CACHE_PATH}" + "$SCRIPTPATH/export-binaries.sh" "${img}" "${BINARY_CACHE_PATH}" else # Here continue an image build. echo "${img} image is missing. Building it..." - "$SCRIPTPATH/build_data4commit.sh" $commit $REGISTRY --export-binaries="${BINARY_CACHE_PATH}" - time docker push $img + "$SCRIPTPATH/build_data4commit.sh" "$commit" "$REGISTRY" "$BRANCH_NAME" --export-binaries="${BINARY_CACHE_PATH}" + time docker push "$img" fi echo "$DOTENV_VAR_NAME=$img" > docker_image_name.env diff --git a/scripts/ci-helpers/prepare_data_image_job.yml b/scripts/ci-helpers/prepare_data_image_job.yml index e7df484f2..c9ef04d15 100644 --- a/scripts/ci-helpers/prepare_data_image_job.yml +++ b/scripts/ci-helpers/prepare_data_image_job.yml @@ -1,42 +1,22 @@ +variables: + # Variables required by Common CI jobs + CI_COMMON_JOB_VERSION: "0a8b4a4d6098c3e4087a58a61622ffb0817ecb39" + DOCKER_BUILDER_TAG: "$CI_COMMON_JOB_VERSION" + DOCKER_DIND_TAG: "$CI_COMMON_JOB_VERSION" + IMAGE_REMOVER_TAG: "$CI_COMMON_JOB_VERSION" + +include: + - project: 'hive/common-ci-configuration' + ref: 0a8b4a4d6098c3e4087a58a61622ffb0817ecb39 + file: '/templates/docker_image_jobs.gitlab-ci.yml' + .docker_image_builder_job: + extends: .docker_image_builder_job_template variables: FF_NETWORK_PER_BUILD: "true" - # uses registry.gitlab.syncad.com/hive/hive/custom_docker:20.10.10 - DOCKER_IMAGE_TAG: "@sha256:1962f1ef35c1f1620269306cd735923993ad8546566cad86f133abccf314cc56" - - image: "registry.gitlab.syncad.com/hive/hive/custom_docker${DOCKER_IMAGE_TAG}" - interruptible: true - services: - - name: "registry.gitlab.syncad.com/hive/hive/custom_dind:20.10.10-dind-1" - alias: "docker" - pull_policy: [always, if-not-present] - variables: - DOCKER_BUILDKIT: 1 - DOCKER_DRIVER: "overlay2" - DOCKER_TLS_CERTDIR: "/certs" - .docker_image_cleanup_job: - image: alpine:3.16 - interruptible: true - before_script: - - apk update && apk add bash curl jq - - variables: - # Interface variables (to be overrided by derived jobs) - REGISTRY: $CI_REGISTRY_IMAGE - REGISTRY_USER: "" - REGISTRY_PASS: "" - IMAGE_PATH: "" - IMAGE_TAG: "" - - SCRIPTS_PATH: "$CI_PROJECT_DIR/scripts" - - script: - - echo "Attempting to cleanup an image $IMAGE_PATH using tag $IMAGE_TAG from $REGISTRY" - - "$SCRIPTS_PATH/ci-helpers/delete-image.sh" - - when: always + extends: .docker_image_cleanup_job_template .prepare_hived_data_5m_image: extends: .docker_image_builder_job @@ -48,7 +28,7 @@ SCRIPTS_PATH: "$SUBMODULE_DIR/scripts" script: - - $SCRIPTS_PATH/ci-helpers/get_image4submodule.sh "$SUBMODULE_DIR" registry.gitlab.syncad.com/hive/hive/ "HIVED_IMAGE_NAME" "$REGISTRY_USER" "$REGISTRY_PASS" "hived-mainnet-binaries" + - $SCRIPTS_PATH/ci-helpers/get_image4submodule.sh "$SUBMODULE_DIR" registry.gitlab.syncad.com/hive/hive/ "HIVED_IMAGE_NAME" "$REGISTRY_USER" "$REGISTRY_PASS" "hived-mainnet-binaries" $CI_COMMIT_REF_SLUG - ls -la ./hived-mainnet-binaries/* artifacts: -- GitLab From 3b9e7a92e80f2cfcf2b73cb50445d8d1b699d14a Mon Sep 17 00:00:00 2001 From: Konrad Botor Date: Mon, 19 Dec 2022 11:51:21 +0100 Subject: [PATCH 04/10] Reconfigured BuildKit cache to be stored in a directory, rather than an image. Confiugured CI to cache that directory per branch - ref #406 --- .gitlab-ci.yaml | 11 ++- Dockerfile | 2 +- doc/building.md | 2 +- docker-bake.hcl | 58 ++++++++++++++++ scripts/ci-helpers/build_data.sh | 54 +++++++++++---- scripts/ci-helpers/build_data4commit.sh | 13 ++-- scripts/ci-helpers/build_instance.sh | 67 ++++++++++--------- scripts/ci-helpers/get_image4submodule.sh | 9 ++- scripts/ci-helpers/prepare_data_image_job.yml | 4 +- 9 files changed, 162 insertions(+), 58 deletions(-) create mode 100644 docker-bake.hcl diff --git a/.gitlab-ci.yaml b/.gitlab-ci.yaml index 4f0df53a2..c937b829c 100644 --- a/.gitlab-ci.yaml +++ b/.gitlab-ci.yaml @@ -27,13 +27,19 @@ include: - template: Workflows/Branch-Pipelines.gitlab-ci.yml - local: '/scripts/ci-helpers/prepare_data_image_job.yml' +.buildkit-cache-config: + cache: + key: buildkit-cache-$CI_JOB_NAME-$CI_COMMIT_REF_SLUG + paths: + - buildkit-cache/ + prepare_hived_data_image: extends: .prepare_hived_data_5m_image stage: build variables: REGISTRY_USER: "$HIVED_CI_IMGBUILDER_USER" REGISTRY_PASS: $HIVED_CI_IMGBUILDER_PASSWORD - + cache: !reference [.buildkit-cache-config, cache] tags: - public-runner-docker - hived-for-tests @@ -90,13 +96,14 @@ mirrornet_node_build: "$IMAGE_TAG" "$SOURCES_DIR" "$REGISTRY_URL" - --cache-path=$CI_COMMIT_REF_SLUG + --cache-path=buildkit-cache --network-type="mirrornet" --export-binaries="$BINARIES_DIR" - chmod -Rc a+rwx "$BINARIES_DIR" artifacts: paths: - "$BINARIES_DIR" + cache: !reference [.buildkit-cache-config, cache] tags: - public-runner-docker - hived-for-tests diff --git a/Dockerfile b/Dockerfile index fff37e002..68f659f8a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -134,7 +134,7 @@ EXPOSE ${CLI_WALLET_PORT} FROM ${CI_REGISTRY_IMAGE}ci-base-image-5m$CI_IMAGE_TAG AS block_log_5m_source -FROM ${CI_REGISTRY_IMAGE}base_instance:base_instance-$BUILD_IMAGE_TAG as data +FROM ${CI_REGISTRY_IMAGE}base_instance:base_instance-${BUILD_IMAGE_TAG} as data COPY --from=block_log_5m_source /home/hived/datadir /home/hived/datadir ADD --chown=hived:hived ./docker/config_5M.ini /home/hived/datadir/config.ini diff --git a/doc/building.md b/doc/building.md index 7b4b44821..2b374ee2b 100644 --- a/doc/building.md +++ b/doc/building.md @@ -43,7 +43,7 @@ We ship a Dockerfile. This builds both common node type binaries. - mainnet (default) - `--export-binaries=PATH` - allows to extract built binaries from created image -- `--cache-path=BRANCH_NAME` - allows to specify a Git branch to pull and push Docker BuildKit cache for +- `--cache-path=PATH` - allows to specify a custom path to BuildKit cache directory (requires BuildKit builder with docker-contaienr driver), meant to be used with CI Above example call will create the image: `registry.gitlab.syncad.com/hive/hive/instance:my-local-tag` diff --git a/docker-bake.hcl b/docker-bake.hcl new file mode 100644 index 000000000..70ab937af --- /dev/null +++ b/docker-bake.hcl @@ -0,0 +1,58 @@ +variable "REGISTRY" {} #CI_REGISTRY_IMAGE +#variable "CI_IMAGE_TAG" {} +variable "BUILD_IMAGE_TAG" {} +variable "BUILD_HIVE_TESTNET" {} +variable "HIVE_CONVERTER_BUILD" {} +#variable "HIVE_LINT" {} +#variable "P2P_PORT" {} +#variable "WS_PORT" {} +#variable "HTTP_PORT" {} +#variable "CLI_WALLET_PORT" {} +variable "CACHE_REF" {} +variable "IMAGE_TAG_PREFIX" {} + +target base_instance-ci { + args = { + CI_REGISTRY_IMAGE=REGISTRY + BUILD_HIVE_TESTNET=BUILD_HIVE_TESTNET + HIVE_CONVERTER_BUILD=HIVE_CONVERTER_BUILD + BUILD_IMAGE_TAG=BUILD_IMAGE_TAG + } + cache-from = [ "type=local,src=${CACHE_REF}" ] + cache-to = [ "type=local,mode=max,dest=${CACHE_REF}" ] + tags = [ "${REGISTRY}base_instance:base_instance-${BUILD_IMAGE_TAG}" ] + target = "base_instance" +} + +target instance-ci { + args = { + CI_REGISTRY_IMAGE=REGISTRY + BUILD_HIVE_TESTNET=BUILD_HIVE_TESTNET + HIVE_CONVERTER_BUILD=HIVE_CONVERTER_BUILD + BUILD_IMAGE_TAG=BUILD_IMAGE_TAG + } + cache-from = [ "type=local,src=${CACHE_REF}" ] + cache-to = [ "type=local,mode=max,dest=${CACHE_REF}" ] + contexts = { + "${REGISTRY}base_instance:base_instance-${BUILD_IMAGE_TAG}" = "target:base_instance-ci" + } + tags = [ "${REGISTRY}${IMAGE_TAG_PREFIX}instance:instance-${BUILD_IMAGE_TAG}" ] + target = "instance" +} + +target data-ci { + args = { + CI_REGISTRY_IMAGE=REGISTRY + BUILD_HIVE_TESTNET=BUILD_HIVE_TESTNET + HIVE_CONVERTER_BUILD=HIVE_CONVERTER_BUILD + BUILD_IMAGE_TAG=BUILD_IMAGE_TAG + } + # Cache disabled - takes too much space due to replay data + #cache-from = [ "type=local,src=${CACHE_REF}" ] + #cache-to = [ "type=local,mode=max,dest=${CACHE_REF}" ] + contexts = { + "${REGISTRY}base_instance:base_instance-${BUILD_IMAGE_TAG}" = "target:base_instance-ci" + } + tags = [ "${REGISTRY}data:data-${BUILD_IMAGE_TAG}" ] + target = "data" +} \ No newline at end of file diff --git a/scripts/ci-helpers/build_data.sh b/scripts/ci-helpers/build_data.sh index 24c8120ef..4a91dfcd6 100755 --- a/scripts/ci-helpers/build_data.sh +++ b/scripts/ci-helpers/build_data.sh @@ -14,8 +14,6 @@ shift SRCROOTDIR=${1:?"Missing argument #2: source directory"} shift REGISTRY=${1:?"Missing argument #3: target image registry"} -shift -BRANCH_NAME=${1:?"Missing argument #4: branch to get buildkit cache for"} shift # Supplement a registry path by trailing slash (if needed) @@ -24,19 +22,47 @@ shift BUILD_HIVE_TESTNET=OFF HIVE_CONVERTER_BUILD=OFF -"$SCRIPTSDIR/ci-helpers/build_instance.sh" "${BUILD_IMAGE_TAG}" "${SRCROOTDIR}" "${REGISTRY}" "--cache-path=$BRANCH_NAME" "$@" +if [ -n "${CI:-}" ]; +then + BUILDKIT_CACHE_PATH=${1:?"Missing argument #3: Docker BuildKit cache path"} + shift + BINARY_CACHE_PATH=${1:?"Missing argument #4: binary cache path"} + shift -echo "Instance image built. Attempting to build a data image basing on it..." + CACHE_REF="${CI_PROJECT_DIR}/${BUILDKIT_CACHE_PATH}" + export CACHE_REF + export REGISTRY + export BUILD_HIVE_TESTNET + export HIVE_CONVERTER_BUILD + export BUILD_IMAGE_TAG + export IMAGE_TAG_PREFIX -pushd "$SRCROOTDIR" || exit 1 + pushd "$SRCROOTDIR" || exit 1 -docker buildx build --target=data --progress=plain --load \ - --build-arg CI_REGISTRY_IMAGE="$REGISTRY" \ - --build-arg BUILD_HIVE_TESTNET=$BUILD_HIVE_TESTNET \ - --build-arg HIVE_CONVERTER_BUILD=$HIVE_CONVERTER_BUILD \ - --build-arg BUILD_IMAGE_TAG="$BUILD_IMAGE_TAG" \ - --cache-from "type=registry,ref=${REGISTRY}data:data-$BRANCH_NAME" \ - --cache-to "type=registry,mode=max,ref=${REGISTRY}data:data-$BRANCH_NAME" \ - --tag "${REGISTRY}data:data-${BUILD_IMAGE_TAG}" -f Dockerfile . + docker buildx bake --progress=plain --load data-ci + + du -h "$CACHE_REF" + docker image ls -popd || exit 1 + popd || exit 1 + + set -x + BUILDER_NAME=$(docker buildx inspect | head -n 1 | awk '{print $2}') + echo "BUILDER_NAME=${BUILDER_NAME}" + docker buildx use default + "$SCRIPTPATH/export-binaries.sh" "${REGISTRY}data:data-${BUILD_IMAGE_TAG}" "${BINARY_CACHE_PATH}" + docker buildx use "$BUILDER_NAME" + set +x +else + "$SCRIPTSDIR/ci-helpers/build_instance.sh" "${BUILD_IMAGE_TAG}" "${SRCROOTDIR}" "${REGISTRY}" "$@" + + pushd "$SRCROOTDIR" || exit 1 + echo "Instance image built. Attempting to build a data image basing on it..." + docker buildx build --target=data --progress=plain \ + --build-arg CI_REGISTRY_IMAGE="$REGISTRY" \ + --build-arg BUILD_HIVE_TESTNET=$BUILD_HIVE_TESTNET \ + --build-arg HIVE_CONVERTER_BUILD=$HIVE_CONVERTER_BUILD \ + --build-arg BUILD_IMAGE_TAG="$BUILD_IMAGE_TAG" \ + --tag "${REGISTRY}data:data-${BUILD_IMAGE_TAG}" -f Dockerfile . + popd || exit 1 +fi diff --git a/scripts/ci-helpers/build_data4commit.sh b/scripts/ci-helpers/build_data4commit.sh index 52bb187f9..4b033b17d 100755 --- a/scripts/ci-helpers/build_data4commit.sh +++ b/scripts/ci-helpers/build_data4commit.sh @@ -13,13 +13,18 @@ COMMIT=${1:?"Missing argument #1: commit SHA"} shift REGISTRY=${1:?"Missing argument #2: target image registry"} shift -BRANCH_NAME=${1:?"Missing argument #3: branch to get buildkit cache for"} -shift + BRANCH="master" BUILD_IMAGE_TAG=$COMMIT do_clone "$BRANCH" "./hive-${COMMIT}" https://gitlab.syncad.com/hive/hive.git "$COMMIT" -"$SCRIPTSDIR/ci-helpers/build_data.sh" "$BUILD_IMAGE_TAG" "./hive-${COMMIT}" "$REGISTRY" "$BRANCH_NAME" "$@" - +if [ -n "${CI:-}" ]; +then + BUILDKIT_CACHE_PATH=${1:?"Missing argument #3: Docker BuildKit cache path"} + shift + "$SCRIPTSDIR/ci-helpers/build_data.sh" "$BUILD_IMAGE_TAG" "./hive-${COMMIT}" "$REGISTRY" "$BUILDKIT_CACHE_PATH" "$@" +else + "$SCRIPTSDIR/ci-helpers/build_data.sh" "$BUILD_IMAGE_TAG" "./hive-${COMMIT}" "$REGISTRY" "$@" +fi diff --git a/scripts/ci-helpers/build_instance.sh b/scripts/ci-helpers/build_instance.sh index a86b7baf4..e537236b4 100755 --- a/scripts/ci-helpers/build_instance.sh +++ b/scripts/ci-helpers/build_instance.sh @@ -12,7 +12,7 @@ source "$SCRIPTSDIR/common.sh" BUILD_IMAGE_TAG="" REGISTRY="" SRCROOTDIR="" - +BUILDKIT_CACHE_PATH="" IMAGE_TAG_PREFIX="" BUILD_HIVE_TESTNET=OFF @@ -26,7 +26,7 @@ print_help () { echo "OPTIONS:" echo " --network-type=TYPE Allows to specify type of blockchain network supported by built hived. Allowed values: mainnet, testnet, mirrornet" echo " --export-binaries=PATH Allows to specify a path where binaries shall be exported from built image." - echo " --cache-path=BRANCH_NAME Allows to specify a Git branch to pull and push Docker BuildKit cache for" + echo " --cache-path=PATH Allows to specify a directory for BuildKit cache (requires BuildKit builder with docker-contaienr driver), for CI" echo " --help Display this help screen and exit" echo } @@ -65,7 +65,7 @@ while [ $# -gt 0 ]; do ;; --cache-path=*) arg="${1#*=}" - BRANCH_NAME="$arg" + BUILDKIT_CACHE_PATH="$arg" ;; --help) print_help @@ -104,42 +104,40 @@ echo "Moving into source root directory: ${SRCROOTDIR}" pushd "$SRCROOTDIR" || exit 1 #pwd -if [ -n "${BRANCH_NAME}" ]; +if [ -n "$BUILDKIT_CACHE_PATH" ]; then - CACHE_REF="${REGISTRY}base_instance:base_instance-$BRANCH_NAME" - echo "Building base instance image with cache ${CACHE_REF}" - docker buildx build --target=base_instance --progress=plain --load \ - --build-arg CI_REGISTRY_IMAGE="$REGISTRY" \ - --build-arg BUILD_HIVE_TESTNET=$BUILD_HIVE_TESTNET \ - --build-arg HIVE_CONVERTER_BUILD=$HIVE_CONVERTER_BUILD \ - --build-arg BUILD_IMAGE_TAG="$BUILD_IMAGE_TAG" \ - --cache-from "type=registry,ref=${CACHE_REF}" \ - --cache-to "type=registry,mode=max,ref=${CACHE_REF}" \ - --tag "${REGISTRY}base_instance:base_instance-${BUILD_IMAGE_TAG}" -f Dockerfile . - - # Build the image containing only binaries and be ready to start running hived instance, operating on mounted volummes pointing instance datadir and shm_dir - CACHE_REF="${REGISTRY}${IMAGE_TAG_PREFIX}instance:instance-$BRANCH_NAME" + if [ -n "${CI:-}" ]; + then + CACHE_REF="${CI_PROJECT_DIR}/${BUILDKIT_CACHE_PATH}" + else + CACHE_REF="${BUILDKIT_CACHE_PATH}" + fi + mkdir -p "${CACHE_REF}" + export REGISTRY + export BUILD_HIVE_TESTNET + export HIVE_CONVERTER_BUILD + export BUILD_IMAGE_TAG + export CACHE_REF + export IMAGE_TAG_PREFIX + + # Build the image containing only binaries and be ready to start running hived instance, operating on mounted volumes pointing at instance datadir and shm_dir echo "Building instance image with cache ${CACHE_REF}" - docker buildx build --target=instance --progress=plain --load \ - --build-arg CI_REGISTRY_IMAGE="$REGISTRY" \ - --build-arg BUILD_HIVE_TESTNET="$BUILD_HIVE_TESTNET" \ - --build-arg HIVE_CONVERTER_BUILD=$HIVE_CONVERTER_BUILD \ - --cache-from "type=registry,ref=${CACHE_REF}" \ - --cache-to "type=registry,mode=max,ref=${CACHE_REF}" \ - --build-arg BUILD_IMAGE_TAG="$BUILD_IMAGE_TAG" \ - --tag "${REGISTRY}${IMAGE_TAG_PREFIX}instance:instance-${BUILD_IMAGE_TAG}" -f Dockerfile . + + docker buildx bake --progress=plain --load instance-ci + du -h "$CACHE_REF" + docker image ls else echo "Building base instance image" - docker buildx build --target=base_instance --progress=plain --load \ + docker buildx build --target=base_instance --progress=plain \ --build-arg CI_REGISTRY_IMAGE="$REGISTRY" \ --build-arg BUILD_HIVE_TESTNET=$BUILD_HIVE_TESTNET \ --build-arg HIVE_CONVERTER_BUILD=$HIVE_CONVERTER_BUILD \ --build-arg BUILD_IMAGE_TAG="$BUILD_IMAGE_TAG" \ --tag "${REGISTRY}base_instance:base_instance-${BUILD_IMAGE_TAG}" -f Dockerfile . - # Build the image containing only binaries and be ready to start running hived instance, operating on mounted volummes pointing instance datadir and shm_dir + # Build the image containing only binaries and be ready to start running hived instance, operating on mounted volumes pointing at instance datadir and shm_dir echo "Building instance image" - docker buildx build --target=instance --progress=plain --load \ + docker buildx build --target=instance --progress=plain \ --build-arg CI_REGISTRY_IMAGE="$REGISTRY" \ --build-arg BUILD_HIVE_TESTNET="$BUILD_HIVE_TESTNET" \ --build-arg HIVE_CONVERTER_BUILD=$HIVE_CONVERTER_BUILD \ @@ -147,13 +145,18 @@ else --tag "${REGISTRY}${IMAGE_TAG_PREFIX}instance:instance-${BUILD_IMAGE_TAG}" -f Dockerfile . fi - - - popd || exit 1 if [ -n "${EXPORT_PATH}" ]; then + if [ -n "$BUILDKIT_CACHE_PATH" ]; + then + BUILDER_NAME=$(docker buildx inspect | head -n 1 | awk '{print $2}') + docker buildx use default + fi "$SCRIPTPATH/export-binaries.sh" "${REGISTRY}${IMAGE_TAG_PREFIX}instance:instance-${BUILD_IMAGE_TAG}" "${EXPORT_PATH}" + if [ -n "$BUILDKIT_CACHE_PATH" ]; + then + docker buildx use "$BUILDER_NAME" + fi fi - diff --git a/scripts/ci-helpers/get_image4submodule.sh b/scripts/ci-helpers/get_image4submodule.sh index 07d23e16d..c750d58e2 100755 --- a/scripts/ci-helpers/get_image4submodule.sh +++ b/scripts/ci-helpers/get_image4submodule.sh @@ -22,7 +22,7 @@ REGISTRY_PASSWORD=${1:?"Missing argument #5: registry password"} shift BINARY_CACHE_PATH=${1:?"Missing argument #6: binary cache path"} shift -BRANCH_NAME=${1:?"Missing argument #7: branch to get buildkit cache for"} +BUILDKIT_CACHE_PATH=${1:?"Missing argument #7: Docker BuildKit cache path"} shift retrieve_submodule_commit () { @@ -56,7 +56,12 @@ then else # Here continue an image build. echo "${img} image is missing. Building it..." - "$SCRIPTPATH/build_data4commit.sh" "$commit" "$REGISTRY" "$BRANCH_NAME" --export-binaries="${BINARY_CACHE_PATH}" + if [ -n "${CI:-}" ]; + then + "$SCRIPTPATH/build_data4commit.sh" "$commit" "$REGISTRY" "$BUILDKIT_CACHE_PATH" "$BINARY_CACHE_PATH" --export-binaries="${BINARY_CACHE_PATH}" + else + "$SCRIPTPATH/build_data4commit.sh" "$commit" "$REGISTRY" "$BUILDKIT_CACHE_PATH" --export-binaries="${BINARY_CACHE_PATH}" + fi time docker push "$img" fi diff --git a/scripts/ci-helpers/prepare_data_image_job.yml b/scripts/ci-helpers/prepare_data_image_job.yml index c9ef04d15..25cbb1259 100644 --- a/scripts/ci-helpers/prepare_data_image_job.yml +++ b/scripts/ci-helpers/prepare_data_image_job.yml @@ -25,10 +25,10 @@ include: SUBMODULE_DIR: "$CI_PROJECT_DIR" REGISTRY_USER: "$CI_IMG_BUILDER_USER" REGISTRY_PASS: $CI_IMG_BUILDER_PASSWORD - SCRIPTS_PATH: "$SUBMODULE_DIR/scripts" + BUILDKIT_CACHE_PATH: "buildkit-cache" script: - - $SCRIPTS_PATH/ci-helpers/get_image4submodule.sh "$SUBMODULE_DIR" registry.gitlab.syncad.com/hive/hive/ "HIVED_IMAGE_NAME" "$REGISTRY_USER" "$REGISTRY_PASS" "hived-mainnet-binaries" $CI_COMMIT_REF_SLUG + - $SCRIPTS_PATH/ci-helpers/get_image4submodule.sh "$SUBMODULE_DIR" registry.gitlab.syncad.com/hive/hive/ "HIVED_IMAGE_NAME" "$REGISTRY_USER" "$REGISTRY_PASS" "hived-mainnet-binaries" $BUILDKIT_CACHE_PATH - ls -la ./hived-mainnet-binaries/* artifacts: -- GitLab From b16bc868c91ada8636be8db54aeaf75b276e5bf9 Mon Sep 17 00:00:00 2001 From: Konrad Botor Date: Tue, 10 Jan 2023 13:50:37 +0100 Subject: [PATCH 05/10] Updated Docker build jobs to use cache stored in registry, rather than local - ref #406 --- .gitlab-ci.yaml | 15 +++++---------- doc/building.md | 2 +- docker-bake.hcl | 12 ++++++------ scripts/ci-helpers/build_data.sh | 6 ++---- scripts/ci-helpers/build_instance.sh | 9 +-------- scripts/ci-helpers/prepare_data_image_job.yml | 2 +- 6 files changed, 16 insertions(+), 30 deletions(-) diff --git a/.gitlab-ci.yaml b/.gitlab-ci.yaml index c937b829c..8bc343c00 100644 --- a/.gitlab-ci.yaml +++ b/.gitlab-ci.yaml @@ -27,19 +27,12 @@ include: - template: Workflows/Branch-Pipelines.gitlab-ci.yml - local: '/scripts/ci-helpers/prepare_data_image_job.yml' -.buildkit-cache-config: - cache: - key: buildkit-cache-$CI_JOB_NAME-$CI_COMMIT_REF_SLUG - paths: - - buildkit-cache/ - prepare_hived_data_image: extends: .prepare_hived_data_5m_image stage: build variables: REGISTRY_USER: "$HIVED_CI_IMGBUILDER_USER" - REGISTRY_PASS: $HIVED_CI_IMGBUILDER_PASSWORD - cache: !reference [.buildkit-cache-config, cache] + REGISTRY_PASS: "$HIVED_CI_IMGBUILDER_PASSWORD" tags: - public-runner-docker - hived-for-tests @@ -90,20 +83,22 @@ mirrornet_node_build: SOURCES_DIR: "." REGISTRY_URL: "$CI_REGISTRY_IMAGE" BINARIES_DIR: "hived-mirrornet-binaries" + REGISTRY_USER: "$HIVED_CI_IMGBUILDER_USER" + REGISTRY_PASS: "$HIVED_CI_IMGBUILDER_PASSWORD" script: - echo "Building hived in mirrornet mode" + - echo "$REGISTRY_PASS" | docker login -u "$REGISTRY_USER" "$REGISTRY_URL" --password-stdin - ./scripts/ci-helpers/build_instance.sh "$IMAGE_TAG" "$SOURCES_DIR" "$REGISTRY_URL" - --cache-path=buildkit-cache + --cache-path=$CI_COMMIT_REF_SLUG --network-type="mirrornet" --export-binaries="$BINARIES_DIR" - chmod -Rc a+rwx "$BINARIES_DIR" artifacts: paths: - "$BINARIES_DIR" - cache: !reference [.buildkit-cache-config, cache] tags: - public-runner-docker - hived-for-tests diff --git a/doc/building.md b/doc/building.md index 2b374ee2b..3e20109be 100644 --- a/doc/building.md +++ b/doc/building.md @@ -43,7 +43,7 @@ We ship a Dockerfile. This builds both common node type binaries. - mainnet (default) - `--export-binaries=PATH` - allows to extract built binaries from created image -- `--cache-path=PATH` - allows to specify a custom path to BuildKit cache directory (requires BuildKit builder with docker-contaienr driver), meant to be used with CI +- `--cache-path=TAG-SUFFIX` - allows to specify a custom path to BuildKit cache image (requires BuildKit builder with docker-container driver), meant to be used with CI Above example call will create the image: `registry.gitlab.syncad.com/hive/hive/instance:my-local-tag` diff --git a/docker-bake.hcl b/docker-bake.hcl index 70ab937af..efd883193 100644 --- a/docker-bake.hcl +++ b/docker-bake.hcl @@ -18,8 +18,8 @@ target base_instance-ci { HIVE_CONVERTER_BUILD=HIVE_CONVERTER_BUILD BUILD_IMAGE_TAG=BUILD_IMAGE_TAG } - cache-from = [ "type=local,src=${CACHE_REF}" ] - cache-to = [ "type=local,mode=max,dest=${CACHE_REF}" ] + cache-from = [ "type=registry,ref=${REGISTRY}base_instance:base_instance-${CACHE_REF}" ] + cache-to = [ "type=registry,mode=max,ref=${REGISTRY}base_instance:base_instance-${CACHE_REF}" ] tags = [ "${REGISTRY}base_instance:base_instance-${BUILD_IMAGE_TAG}" ] target = "base_instance" } @@ -31,8 +31,8 @@ target instance-ci { HIVE_CONVERTER_BUILD=HIVE_CONVERTER_BUILD BUILD_IMAGE_TAG=BUILD_IMAGE_TAG } - cache-from = [ "type=local,src=${CACHE_REF}" ] - cache-to = [ "type=local,mode=max,dest=${CACHE_REF}" ] + cache-from = [ "type=registry,ref=${REGISTRY}${IMAGE_TAG_PREFIX}instance:instance-${CACHE_REF}" ] + cache-to = [ "type=registry,mode=max,ref=${REGISTRY}${IMAGE_TAG_PREFIX}instance:instance-${CACHE_REF}" ] contexts = { "${REGISTRY}base_instance:base_instance-${BUILD_IMAGE_TAG}" = "target:base_instance-ci" } @@ -48,8 +48,8 @@ target data-ci { BUILD_IMAGE_TAG=BUILD_IMAGE_TAG } # Cache disabled - takes too much space due to replay data - #cache-from = [ "type=local,src=${CACHE_REF}" ] - #cache-to = [ "type=local,mode=max,dest=${CACHE_REF}" ] + #cache-from = [ "type=registry,ref=${REGISTRY}data:data-${CACHE_REF}" ] + #cache-to = [ "type=registry,mode=max,ref=${REGISTRY}data:data-${CACHE_REF}" ] contexts = { "${REGISTRY}base_instance:base_instance-${BUILD_IMAGE_TAG}" = "target:base_instance-ci" } diff --git a/scripts/ci-helpers/build_data.sh b/scripts/ci-helpers/build_data.sh index 4a91dfcd6..52510b374 100755 --- a/scripts/ci-helpers/build_data.sh +++ b/scripts/ci-helpers/build_data.sh @@ -29,7 +29,7 @@ then BINARY_CACHE_PATH=${1:?"Missing argument #4: binary cache path"} shift - CACHE_REF="${CI_PROJECT_DIR}/${BUILDKIT_CACHE_PATH}" + CACHE_REF="${BUILDKIT_CACHE_PATH}" export CACHE_REF export REGISTRY export BUILD_HIVE_TESTNET @@ -40,8 +40,6 @@ then pushd "$SRCROOTDIR" || exit 1 docker buildx bake --progress=plain --load data-ci - - du -h "$CACHE_REF" docker image ls popd || exit 1 @@ -58,7 +56,7 @@ else pushd "$SRCROOTDIR" || exit 1 echo "Instance image built. Attempting to build a data image basing on it..." - docker buildx build --target=data --progress=plain \ + docker buildx build --target=data --progress=plain \ --build-arg CI_REGISTRY_IMAGE="$REGISTRY" \ --build-arg BUILD_HIVE_TESTNET=$BUILD_HIVE_TESTNET \ --build-arg HIVE_CONVERTER_BUILD=$HIVE_CONVERTER_BUILD \ diff --git a/scripts/ci-helpers/build_instance.sh b/scripts/ci-helpers/build_instance.sh index e537236b4..9dda2ec1e 100755 --- a/scripts/ci-helpers/build_instance.sh +++ b/scripts/ci-helpers/build_instance.sh @@ -106,13 +106,7 @@ pushd "$SRCROOTDIR" || exit 1 if [ -n "$BUILDKIT_CACHE_PATH" ]; then - if [ -n "${CI:-}" ]; - then - CACHE_REF="${CI_PROJECT_DIR}/${BUILDKIT_CACHE_PATH}" - else - CACHE_REF="${BUILDKIT_CACHE_PATH}" - fi - mkdir -p "${CACHE_REF}" + CACHE_REF="${BUILDKIT_CACHE_PATH}" export REGISTRY export BUILD_HIVE_TESTNET export HIVE_CONVERTER_BUILD @@ -124,7 +118,6 @@ then echo "Building instance image with cache ${CACHE_REF}" docker buildx bake --progress=plain --load instance-ci - du -h "$CACHE_REF" docker image ls else echo "Building base instance image" diff --git a/scripts/ci-helpers/prepare_data_image_job.yml b/scripts/ci-helpers/prepare_data_image_job.yml index 25cbb1259..c75b17bed 100644 --- a/scripts/ci-helpers/prepare_data_image_job.yml +++ b/scripts/ci-helpers/prepare_data_image_job.yml @@ -26,7 +26,7 @@ include: REGISTRY_USER: "$CI_IMG_BUILDER_USER" REGISTRY_PASS: $CI_IMG_BUILDER_PASSWORD SCRIPTS_PATH: "$SUBMODULE_DIR/scripts" - BUILDKIT_CACHE_PATH: "buildkit-cache" + BUILDKIT_CACHE_PATH: "$CI_COMMIT_REF_SLUG" script: - $SCRIPTS_PATH/ci-helpers/get_image4submodule.sh "$SUBMODULE_DIR" registry.gitlab.syncad.com/hive/hive/ "HIVED_IMAGE_NAME" "$REGISTRY_USER" "$REGISTRY_PASS" "hived-mainnet-binaries" $BUILDKIT_CACHE_PATH - ls -la ./hived-mainnet-binaries/* -- GitLab From 6e0b19a25494ea337e819c7a64dea1cb485a4c2d Mon Sep 17 00:00:00 2001 From: Konrad Botor Date: Wed, 11 Jan 2023 14:22:06 +0100 Subject: [PATCH 06/10] Updated build_data.sh to account for the way it's invoked in haf> pipeline - ref. #406 --- scripts/ci-helpers/build_data.sh | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/scripts/ci-helpers/build_data.sh b/scripts/ci-helpers/build_data.sh index 52510b374..cb364d6af 100755 --- a/scripts/ci-helpers/build_data.sh +++ b/scripts/ci-helpers/build_data.sh @@ -26,8 +26,13 @@ if [ -n "${CI:-}" ]; then BUILDKIT_CACHE_PATH=${1:?"Missing argument #3: Docker BuildKit cache path"} shift - BINARY_CACHE_PATH=${1:?"Missing argument #4: binary cache path"} - shift + BINARY_CACHE_PATH=${1:-} + if [ "a${BINARY_CACHE_PATH:0:2}" != "a--" ] + then + shift + else + BINARY_CACHE_PATH="" + fi CACHE_REF="${BUILDKIT_CACHE_PATH}" export CACHE_REF @@ -45,11 +50,14 @@ then popd || exit 1 set -x - BUILDER_NAME=$(docker buildx inspect | head -n 1 | awk '{print $2}') - echo "BUILDER_NAME=${BUILDER_NAME}" - docker buildx use default - "$SCRIPTPATH/export-binaries.sh" "${REGISTRY}data:data-${BUILD_IMAGE_TAG}" "${BINARY_CACHE_PATH}" - docker buildx use "$BUILDER_NAME" + if [ -n "${BINARY_CACHE_PATH}" ]; + then + BUILDER_NAME=$(docker buildx inspect | head -n 1 | awk '{print $2}') + echo "BUILDER_NAME=${BUILDER_NAME}" + docker buildx use default + "$SCRIPTPATH/export-binaries.sh" "${REGISTRY}data:data-${BUILD_IMAGE_TAG}" "${BINARY_CACHE_PATH}" + docker buildx use "$BUILDER_NAME" + fi set +x else "$SCRIPTSDIR/ci-helpers/build_instance.sh" "${BUILD_IMAGE_TAG}" "${SRCROOTDIR}" "${REGISTRY}" "$@" -- GitLab From 7f72b4709ba20489e38d1b8a8e963960ce30a2d5 Mon Sep 17 00:00:00 2001 From: Konrad Botor Date: Fri, 13 Jan 2023 11:53:37 +0100 Subject: [PATCH 07/10] Updated build_data4commit.sh to account for the way it's invoked in haf> pipeline - ref. #406 --- scripts/ci-helpers/build_data4commit.sh | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/scripts/ci-helpers/build_data4commit.sh b/scripts/ci-helpers/build_data4commit.sh index 4b033b17d..8ad432901 100755 --- a/scripts/ci-helpers/build_data4commit.sh +++ b/scripts/ci-helpers/build_data4commit.sh @@ -18,13 +18,16 @@ BRANCH="master" BUILD_IMAGE_TAG=$COMMIT -do_clone "$BRANCH" "./hive-${COMMIT}" https://gitlab.syncad.com/hive/hive.git "$COMMIT" +DIRECTORY_PREFIX=${DIRECTORY_PREFIX:"hive-"} +GIT_REPOSITORY=${GIT_REPOSITORY:"https://gitlab.syncad.com/hive/hive.git"} + +do_clone "$BRANCH" "./${DIRECTORY_PREFIX}${COMMIT}" "${GIT_REPOSITORY}" "$COMMIT" if [ -n "${CI:-}" ]; then BUILDKIT_CACHE_PATH=${1:?"Missing argument #3: Docker BuildKit cache path"} shift - "$SCRIPTSDIR/ci-helpers/build_data.sh" "$BUILD_IMAGE_TAG" "./hive-${COMMIT}" "$REGISTRY" "$BUILDKIT_CACHE_PATH" "$@" + "$SCRIPTSDIR/ci-helpers/build_data.sh" "$BUILD_IMAGE_TAG" "./${DIRECTORY_PREFIX}${COMMIT}" "$REGISTRY" "$BUILDKIT_CACHE_PATH" "$@" else - "$SCRIPTSDIR/ci-helpers/build_data.sh" "$BUILD_IMAGE_TAG" "./hive-${COMMIT}" "$REGISTRY" "$@" + "$SCRIPTSDIR/ci-helpers/build_data.sh" "$BUILD_IMAGE_TAG" "./${DIRECTORY_PREFIX}${COMMIT}" "$REGISTRY" "$@" fi -- GitLab From 93d7792eb5f1cd94c4eac8bc90934c83190d2613 Mon Sep 17 00:00:00 2001 From: Konrad Botor Date: Fri, 13 Jan 2023 12:13:51 +0100 Subject: [PATCH 08/10] Updated build_data4commit.sh to account for the way it's invoked in haf> pipeline - ref. #406 --- scripts/ci-helpers/build_data4commit.sh | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/scripts/ci-helpers/build_data4commit.sh b/scripts/ci-helpers/build_data4commit.sh index 8ad432901..1504bf1f7 100755 --- a/scripts/ci-helpers/build_data4commit.sh +++ b/scripts/ci-helpers/build_data4commit.sh @@ -6,6 +6,10 @@ SCRIPTSDIR="$SCRIPTPATH/.." # shellcheck disable=SC2034 LOG_FILE=build_data4commit.log + +DIRECTORY_PREFIX=${DIRECTORY_PREFIX:"hive-"} +GIT_REPOSITORY=${GIT_REPOSITORY:"https://gitlab.syncad.com/hive/hive.git"} + # shellcheck source=../common.sh source "$SCRIPTSDIR/common.sh" @@ -18,9 +22,6 @@ BRANCH="master" BUILD_IMAGE_TAG=$COMMIT -DIRECTORY_PREFIX=${DIRECTORY_PREFIX:"hive-"} -GIT_REPOSITORY=${GIT_REPOSITORY:"https://gitlab.syncad.com/hive/hive.git"} - do_clone "$BRANCH" "./${DIRECTORY_PREFIX}${COMMIT}" "${GIT_REPOSITORY}" "$COMMIT" if [ -n "${CI:-}" ]; -- GitLab From ca506161ec614e6f133dcec43260651118fb07fa Mon Sep 17 00:00:00 2001 From: Konrad Botor Date: Fri, 13 Jan 2023 12:52:38 +0100 Subject: [PATCH 09/10] Updated build_data4commit.sh to account for the way it's invoked in haf> pipeline - ref. #406 --- scripts/ci-helpers/build_data4commit.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/ci-helpers/build_data4commit.sh b/scripts/ci-helpers/build_data4commit.sh index 1504bf1f7..05ab72553 100755 --- a/scripts/ci-helpers/build_data4commit.sh +++ b/scripts/ci-helpers/build_data4commit.sh @@ -10,6 +10,9 @@ LOG_FILE=build_data4commit.log DIRECTORY_PREFIX=${DIRECTORY_PREFIX:"hive-"} GIT_REPOSITORY=${GIT_REPOSITORY:"https://gitlab.syncad.com/hive/hive.git"} +echo $DIRECTORY_PREFIX +echo $GIT_REPOSITORY + # shellcheck source=../common.sh source "$SCRIPTSDIR/common.sh" -- GitLab From bde78862f29cf911a2dda6c56e24f62ceac6f7d8 Mon Sep 17 00:00:00 2001 From: Konrad Botor Date: Fri, 13 Jan 2023 13:07:29 +0100 Subject: [PATCH 10/10] Updated build_data4commit.sh to account for the way it's invoked in haf> pipeline - ref. #406 --- scripts/ci-helpers/build_data4commit.sh | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/scripts/ci-helpers/build_data4commit.sh b/scripts/ci-helpers/build_data4commit.sh index 05ab72553..ebfaf3b97 100755 --- a/scripts/ci-helpers/build_data4commit.sh +++ b/scripts/ci-helpers/build_data4commit.sh @@ -7,11 +7,8 @@ SCRIPTSDIR="$SCRIPTPATH/.." # shellcheck disable=SC2034 LOG_FILE=build_data4commit.log -DIRECTORY_PREFIX=${DIRECTORY_PREFIX:"hive-"} -GIT_REPOSITORY=${GIT_REPOSITORY:"https://gitlab.syncad.com/hive/hive.git"} - -echo $DIRECTORY_PREFIX -echo $GIT_REPOSITORY +DIRECTORY_PREFIX=${DIRECTORY_PREFIX:-"hive-"} +GIT_REPOSITORY=${GIT_REPOSITORY:-"https://gitlab.syncad.com/hive/hive.git"} # shellcheck source=../common.sh source "$SCRIPTSDIR/common.sh" -- GitLab