Skip to content

Commit 8427897

Browse files
Revert "Revert "05.Version cache - docker dpkg caching support (sonic-net#12005)""
This reverts commit 4be0805.
1 parent d659288 commit 8427897

21 files changed

+586
-76
lines changed

Makefile.work

+21-1
Original file line numberDiff line numberDiff line change
@@ -182,11 +182,22 @@ ifeq ($(ENABLE_FIPS), y)
182182
endif
183183
endif
184184

185+
SONIC_VERSION_CACHE := $(filter-out none,$(SONIC_VERSION_CACHE_METHOD))
186+
SONIC_OVERRIDE_BUILD_VARS += SONIC_VERSION_CACHE=$(SONIC_VERSION_CACHE)
187+
SONIC_OVERRIDE_BUILD_VARS += SONIC_VERSION_CACHE_SOURCE=$(SONIC_VERSION_CACHE_SOURCE)
188+
export SONIC_VERSION_CACHE SONIC_VERSION_CACHE_SOURCE
189+
$(shell test -d $(SONIC_VERSION_CACHE_SOURCE) || \
190+
mkdir -p $(SONIC_VERSION_CACHE_SOURCE) && chmod -f 777 $(SONIC_VERSION_CACHE_SOURCE) 2>/dev/null )
191+
185192
# Generate the version control build info
186193
$(shell \
187194
SONIC_VERSION_CONTROL_COMPONENTS=$(SONIC_VERSION_CONTROL_COMPONENTS) \
188195
TRUSTED_GPG_URLS=$(TRUSTED_GPG_URLS) \
189196
PACKAGE_URL_PREFIX=$(PACKAGE_URL_PREFIX) \
197+
DISTRO=$(BLDENV) \
198+
SONIC_VERSION_CACHE=$(SONIC_VERSION_CACHE) \
199+
SONIC_VERSION_CACHE_SOURCE=$(SONIC_VERSION_CACHE_SOURCE) \
200+
DBGOPT='$(DBGOPT)' \
190201
scripts/generate_buildinfo_config.sh)
191202

192203
# Generate the slave Dockerfile, and prepare build info for it
@@ -206,6 +217,8 @@ $(shell CONFIGURED_ARCH=$(CONFIGURED_ARCH) \
206217

207218
PREPARE_DOCKER=BUILD_SLAVE=y \
208219
DEFAULT_CONTAINER_REGISTRY=$(DEFAULT_CONTAINER_REGISTRY) \
220+
SONIC_VERSION_CACHE=$(SONIC_VERSION_CACHE) \
221+
DBGOPT='$(DBGOPT)' \
209222
scripts/prepare_docker_buildinfo.sh \
210223
$(SLAVE_BASE_IMAGE) \
211224
$(SLAVE_DIR)/Dockerfile \
@@ -228,12 +241,13 @@ SLAVE_TAG = $(shell \
228241
(cat $(SLAVE_DIR)/Dockerfile.user \
229242
$(SLAVE_DIR)/Dockerfile \
230243
$(SLAVE_DIR)/buildinfo/versions/versions-* \
231-
.git/HEAD \
232244
&& echo $(USER)/$(PWD)/$(CONFIGURED_PLATFORM)) \
233245
| sha1sum \
234246
| awk '{print substr($$1,0,11);}')
235247

236248
COLLECT_DOCKER=DEFAULT_CONTAINER_REGISTRY=$(DEFAULT_CONTAINER_REGISTRY) \
249+
SONIC_VERSION_CACHE=$(SONIC_VERSION_CACHE) \
250+
DBGOPT='$(DBGOPT)' \
237251
scripts/collect_docker_version_files.sh \
238252
$(SLAVE_BASE_IMAGE) \
239253
target \
@@ -294,6 +308,10 @@ ifneq ($(SONIC_DPKG_CACHE_SOURCE),)
294308
DOCKER_RUN += -v "$(SONIC_DPKG_CACHE_SOURCE):/dpkg_cache:rw"
295309
endif
296310

311+
ifneq ($(SONIC_VERSION_CACHE_SOURCE),)
312+
DOCKER_RUN += -v "$(SONIC_VERSION_CACHE_SOURCE):/vcache:rw"
313+
endif
314+
297315
ifeq ($(SONIC_ENABLE_SECUREBOOT_SIGNATURE), y)
298316
ifneq ($(SIGNING_KEY),)
299317
DOCKER_SIGNING_SOURCE := $(shell dirname $(SIGNING_KEY))
@@ -387,6 +405,8 @@ DOCKER_SLAVE_BASE_BUILD = docker build --no-cache \
387405
--build-arg http_proxy=$(http_proxy) \
388406
--build-arg https_proxy=$(https_proxy) \
389407
--build-arg no_proxy=$(no_proxy) \
408+
--build-arg SONIC_VERSION_CACHE=$(SONIC_VERSION_CACHE) \
409+
--build-arg SONIC_VERSION_CONTROL_COMPONENTS=$(SONIC_VERSION_CONTROL_COMPONENTS) \
390410
$(SLAVE_DIR) \
391411
$(SPLIT_LOG) $(DOCKER_BASE_LOG)
392412

build_debian.sh

+9-4
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,10 @@ echo '[INFO] Build host debian base system...'
8181
TARGET_PATH=$TARGET_PATH scripts/build_debian_base_system.sh $CONFIGURED_ARCH $IMAGE_DISTRO $FILESYSTEM_ROOT
8282

8383
# Prepare buildinfo
84-
sudo scripts/prepare_debian_image_buildinfo.sh $CONFIGURED_ARCH $IMAGE_DISTRO $FILESYSTEM_ROOT $http_proxy
84+
sudo SONIC_VERSION_CACHE=${SONIC_VERSION_CACHE} \
85+
DBGOPT="${DBGOPT}" \
86+
scripts/prepare_debian_image_buildinfo.sh $CONFIGURED_ARCH $IMAGE_DISTRO $FILESYSTEM_ROOT $http_proxy
87+
8588

8689
sudo chown root:root $FILESYSTEM_ROOT
8790

@@ -450,10 +453,10 @@ if [[ $TARGET_BOOTLOADER == grub ]]; then
450453
GRUB_PKG=grub-efi-arm64-bin
451454
fi
452455

453-
sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y download \
456+
sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get install -d -o dir::cache=/var/cache/apt \
454457
$GRUB_PKG
455458

456-
sudo mv $FILESYSTEM_ROOT/grub*.deb $FILESYSTEM_ROOT/$PLATFORM_DIR/grub
459+
sudo cp $FILESYSTEM_ROOT/var/cache/apt/archives/grub*.deb $FILESYSTEM_ROOT/$PLATFORM_DIR/grub
457460
fi
458461

459462
## Disable kexec supported reboot which was installed by default
@@ -645,7 +648,9 @@ if [[ $TARGET_BOOTLOADER == uboot ]]; then
645648
fi
646649

647650
# Collect host image version files before cleanup
648-
scripts/collect_host_image_version_files.sh $TARGET_PATH $FILESYSTEM_ROOT
651+
SONIC_VERSION_CACHE=${SONIC_VERSION_CACHE} \
652+
DBGOPT="${DBGOPT}" \
653+
scripts/collect_host_image_version_files.sh $CONFIGURED_ARCH $IMAGE_DISTRO $TARGET_PATH $FILESYSTEM_ROOT
649654

650655
# Remove GCC
651656
sudo LANG=C DEBIAN_FRONTEND=noninteractive chroot $FILESYSTEM_ROOT apt-get -y remove gcc

platform/broadcom/sai.mk

+5
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,9 @@ $(BRCM_DNX_SAI)_URL = "$(LIBSAIBCM_DNX_URL_PREFIX)/$(BRCM_DNX_SAI)"
1717
SONIC_ONLINE_DEBS += $(BRCM_XGS_SAI)
1818
SONIC_ONLINE_DEBS += $(BRCM_DNX_SAI)
1919
$(BRCM_XGS_SAI_DEV)_DEPENDS += $(BRCM_XGS_SAI)
20+
21+
$(BRCM_XGS_SAI)_SKIP_VERSION=y
22+
$(BRCM_XGS_SAI_DEV)_SKIP_VERSION=y
23+
$(BRCM_DNX_SAI)_SKIP_VERSION=y
24+
2025
$(eval $(call add_conflict_package,$(BRCM_XGS_SAI_DEV),$(LIBSAIVS_DEV)))

rules/config

+9
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,15 @@ TRUSTED_GPG_URLS = https://packages.trafficmanager.net/debian/public_key.gpg,htt
241241
# docker: docker base images
242242
SONIC_VERSION_CONTROL_COMPONENTS ?= none
243243

244+
# SONIC_VERSION_CACHE allows the .deb,.py, wget, git, docker and go files to be stored in the cache path. This allows the submodules to
245+
# cache standard installation package and restored back to avoid the package download every time.
246+
# SONIC_VERSION_CACHE - Method of deb package caching
247+
# none : no caching
248+
# cache : Use cache if exists else build the source and update the cache
249+
# SONIC_VERSION_CACHE_SOURCE - Defines the version cache location details
250+
SONIC_VERSION_CACHE_METHOD ?= none
251+
SONIC_VERSION_CACHE_SOURCE ?= $(SONIC_DPKG_CACHE_SOURCE)/vcache
252+
244253
# SONiC docker registry
245254
#
246255
# Set the env variable ENABLE_DOCKER_BASE_PULL = y to enable pulling sonic-slave docker from registry

scripts/build_debian_base_system.sh

+2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
#!/bin/bash
22

3+
[[ ! -z "${DBGOPT}" && $0 =~ ${DBGOPT} ]] && set -x
4+
35
CONFIGURED_ARCH=$1
46
IMAGE_DISTRO=$2
57
FILESYSTEM_ROOT=$3

scripts/collect_build_version_files.sh

+7
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
#!/bin/bash
22

3+
[[ ! -z "${DBGOPT}" && $0 =~ ${DBGOPT} ]] && set -x
4+
35
RET=$1
46
BLDENV=$2
57
TARGET_PATH=$3
@@ -15,12 +17,17 @@ TIMESTAMP=$(date +"%Y%m%d%H%M%S")
1517
VERSION_BUILD_PATH=$TARGET_PATH/versions/build
1618
VERSION_SLAVE_PATH=$VERSION_BUILD_PATH/build-sonic-slave-${BLDENV}
1719
LOG_VERSION_PATH=$VERSION_BUILD_PATH/log-${TIMESTAMP}
20+
DEFAULT_VERSION_PATH=files/build/versions/default
21+
BUILD_LOG_PATH=/sonic/target/versions/log/sonic-slave-${BLDENV}/
1822

1923
sudo chmod -R a+rw $BUILDINFO_PATH
2024
collect_version_files $LOG_VERSION_PATH
2125
([ -d $BUILD_VERSION_PATH ] && [ ! -z "$(ls $BUILD_VERSION_PATH/)" ]) && cp -rf $BUILD_VERSION_PATH/* $LOG_VERSION_PATH/
2226
mkdir -p $VERSION_SLAVE_PATH
2327

28+
mkdir -p ${BUILD_LOG_PATH}
29+
([ -d ${LOG_PATH} ] && [ ! -z "$(ls ${LOG_PATH})" ]) && cp ${LOG_PATH}/* ${BUILD_LOG_PATH}
30+
2431
scripts/versions_manager.py merge -t $VERSION_SLAVE_PATH -b $LOG_VERSION_PATH -e $POST_VERSION_PATH
2532

2633
[ -d $BUILD_VERSION_PATH ] && rm -rf $BUILD_VERSION_PATH/*

scripts/collect_docker_version_files.sh

+65-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,16 @@
11
#!/bin/bash
22

3-
set -x
3+
[[ ! -z "${DBGOPT}" && $0 =~ ${DBGOPT} ]] && set -x
4+
5+
BUILDINFO_BASE=/usr/local/share/buildinfo
6+
7+
SCRIPT_SRC_PATH=src/sonic-build-hooks
8+
if [ -e ${SCRIPT_SRC_PATH} ]; then
9+
. ${SCRIPT_SRC_PATH}/scripts/utils.sh
10+
else
11+
. ${BUILDINFO_BASE}/scripts/utils.sh
12+
fi
13+
414
DOCKER_IMAGE=$1
515
TARGET_PATH=$2
616
DOCKER_IMAGE_TAG=$3
@@ -13,6 +23,8 @@ DOCKER_IMAGE_NAME=$(echo $DOCKER_IMAGE | cut -d: -f1 | sed "s/-$DOCKER_USERNAME\
1323
#Create the container specific to the user tag and slave tag
1424
DOCKER_CONTAINER=${DOCKER_IMAGE_TAG/:/-}
1525
TARGET_VERSIONS_PATH=$TARGET_PATH/versions/dockers/$DOCKER_IMAGE_NAME
26+
BUILD_LOG_PATH=target/versions/log/$DOCKER_IMAGE_NAME
27+
mkdir -p ${BUILD_LOG_PATH}
1628

1729
[ -d $TARGET_VERSIONS_PATH ] && rm -rf $TARGET_VERSIONS_PATH
1830
mkdir -p $TARGET_VERSIONS_PATH
@@ -34,5 +46,57 @@ docker tag ${DOCKER_IMAGE_TAG} tmp-${DOCKER_IMAGE_TAG}
3446
DOCKER_BUILDKIT=1 docker build -f ${DOCKER_PATH}/Dockerfile.cleanup --target output -o target/vcache/${DOCKER_IMAGE_NAME} ${DOCKER_PATH}
3547
DOCKER_BUILDKIT=1 docker build -f ${DOCKER_PATH}/Dockerfile.cleanup --no-cache --target final --tag ${DOCKER_IMAGE_TAG} ${DOCKER_PATH}
3648
docker rmi tmp-${DOCKER_IMAGE_TAG}
49+
docker cp -L $DOCKER_CONTAINER:/usr/local/share/buildinfo/log ${BUILD_LOG_PATH}/
50+
51+
52+
# Save the cache contents from docker build
53+
LOCAL_CACHE_FILE=target/vcache/${DOCKER_IMAGE_NAME}/cache.tgz
54+
CACHE_ENCODE_FILE=${DOCKER_PATH}/vcache/cache.base64
55+
sleep 1; sync ${CACHE_ENCODE_FILE}
56+
57+
# Decode the cache content into gz format
58+
SRC_VERSION_PATH=files/build/versions
59+
if [[ -e ${CACHE_ENCODE_FILE} ]]; then
60+
61+
cat ${CACHE_ENCODE_FILE} | base64 -d >${LOCAL_CACHE_FILE}
62+
rm -f ${CACHE_ENCODE_FILE}
63+
fi
64+
65+
# Version package cache
66+
IMAGE_DBGS_NAME=${DOCKER_IMAGE_NAME//-/_}_image_dbgs
67+
if [[ ${DOCKER_IMAGE_NAME} == sonic-slave-* ]]; then
68+
GLOBAL_CACHE_DIR=${SONIC_VERSION_CACHE_SOURCE}/${DOCKER_IMAGE_NAME}
69+
else
70+
GLOBAL_CACHE_DIR=/vcache/${DOCKER_IMAGE_NAME}
71+
fi
72+
73+
if [[ ! -z ${SONIC_VERSION_CACHE} && -e ${CACHE_ENCODE_FILE} ]]; then
74+
75+
# Select version files for SHA calculation
76+
VERSION_FILES="${SRC_VERSION_PATH}/dockers/${DOCKER_IMAGE_NAME}/versions-*-${DISTRO}-${ARCH} ${SRC_VERSION_PATH}/default/versions-*"
77+
DEP_FILES="${DOCKER_PATH}/Dockerfile.j2"
78+
if [[ ${DOCKER_IMAGE_NAME} =~ '-dbg' ]]; then
79+
DEP_FILES="${DEP_FILES} build_debug_docker_j2.sh"
80+
fi
81+
82+
# Calculate the version SHA
83+
VERSION_SHA="$( (echo -n "${!IMAGE_DBGS_NAME}"; cat ${DEP_FILES} ${VERSION_FILES}) | sha1sum | awk '{print substr($1,0,23);}')"
84+
GLOBAL_CACHE_FILE=${GLOBAL_CACHE_DIR}/${DOCKER_IMAGE_NAME}-${VERSION_SHA}.tgz
85+
86+
GIT_FILE_STATUS=$(git status -s ${DEP_FILES})
87+
88+
# If the cache file is not exists in the global cache for the given SHA,
89+
# store the new cache file into version cache path.
90+
if [ -f ${LOCAL_CACHE_FILE} ]; then
91+
if [[ -z ${GIT_FILE_STATUS} && ! -e ${GLOBAL_CACHE_FILE} ]]; then
92+
mkdir -p ${GLOBAL_CACHE_DIR}
93+
chmod -f 777 ${GLOBAL_CACHE_DIR}
94+
FLOCK ${GLOBAL_CACHE_FILE}
95+
cp ${LOCAL_CACHE_FILE} ${GLOBAL_CACHE_FILE}
96+
chmod -f 777 ${LOCAL_CACHE_FILE} ${GLOBAL_CACHE_FILE}
97+
FUNLOCK ${GLOBAL_CACHE_FILE}
98+
fi
99+
fi
100+
fi
37101

38102
docker container rm $DOCKER_CONTAINER

scripts/collect_host_image_version_files.sh

+13-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,16 @@
11
#!/bin/bash
22

3-
TARGET=$1
4-
FILESYSTEM_ROOT=$2
3+
[[ ! -z "${DBGOPT}" && $0 =~ ${DBGOPT} ]] && set -x
4+
5+
SCRIPT_SRC_PATH=src/sonic-build-hooks
6+
if [ -e ${SCRIPT_SRC_PATH} ]; then
7+
. ${SCRIPT_SRC_PATH}/scripts/utils.sh
8+
fi
9+
10+
ARCH=$1
11+
DISTRO=$2
12+
TARGET=$3
13+
FILESYSTEM_ROOT=$4
514
VERSIONS_PATH=$TARGET/versions/host-image
615
IMAGENAME="host-image"
716

@@ -13,3 +22,5 @@ sudo LANG=C chroot $FILESYSTEM_ROOT post_run_buildinfo ${IMAGENAME}
1322

1423
cp -r $FILESYSTEM_ROOT/usr/local/share/buildinfo/pre-versions $VERSIONS_PATH/
1524
cp -r $FILESYSTEM_ROOT/usr/local/share/buildinfo/post-versions $VERSIONS_PATH/
25+
26+
sudo LANG=C chroot $FILESYSTEM_ROOT post_run_cleanup ${IMAGENAME}

scripts/generate_buildinfo_config.sh

+5-2
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,8 @@ BUILDINFO_CONFIG=$BUILDINFO_PATH/buildinfo/config/buildinfo.config
66

77
mkdir -p $BUILDINFO_PATH/buildinfo/config
88

9-
echo "PACKAGE_URL_PREFIX=$PACKAGE_URL_PREFIX" > $BUILDINFO_CONFIG
10-
echo "SONIC_VERSION_CONTROL_COMPONENTS=$SONIC_VERSION_CONTROL_COMPONENTS" >> $BUILDINFO_CONFIG
9+
echo "export PACKAGE_URL_PREFIX=$PACKAGE_URL_PREFIX" > $BUILDINFO_CONFIG
10+
echo "export SONIC_VERSION_CONTROL_COMPONENTS=$SONIC_VERSION_CONTROL_COMPONENTS" >> $BUILDINFO_CONFIG
11+
echo "export SONIC_VERSION_CACHE=${SONIC_VERSION_CACHE}" >> $BUILDINFO_CONFIG
12+
echo "export SONIC_VERSION_CACHE_SOURCE=${SONIC_VERSION_CACHE_SOURCE}" >> $BUILDINFO_CONFIG
13+
echo "export DISTRO=${DISTRO}" >> $BUILDINFO_CONFIG

scripts/prepare_debian_image_buildinfo.sh

+9-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
#!/bin/bash
22

3+
[[ ! -z "${DBGOPT}" && $0 =~ ${DBGOPT} ]] && set -x
4+
35

46
ARCH=$1
57
DISTRO=$2
68
FILESYSTEM_ROOT=$3
9+
HOST_IMAGE_NAME=host-image
10+
IMAGENAME=${HOST_IMAGE_NAME}
711

812
. /usr/local/share/buildinfo/scripts/buildinfo_base.sh
913
VERSION_DEB_PREFERENCE="01-versions-deb"
@@ -26,4 +30,8 @@ if [ "$ENABLE_VERSION_CONTROL_DEB" == "y" ]; then
2630
fi
2731

2832
sudo LANG=C chroot $FILESYSTEM_ROOT /bin/bash -c "dpkg -i /usr/local/share/buildinfo/sonic-build-hooks_1.0_all.deb"
29-
sudo LANG=C chroot $FILESYSTEM_ROOT /bin/bash -c "pre_run_buildinfo"
33+
#sudo LANG=C chroot $FILESYSTEM_ROOT /bin/bash -c "pre_run_buildinfo"
34+
sudo LANG=C chroot $FILESYSTEM_ROOT /bin/bash -c "echo export DISTRO=${DISTRO} >> /usr/local/share/buildinfo/config/buildinfo.config"
35+
sudo LANG=C chroot $FILESYSTEM_ROOT /bin/bash -c "echo export IMAGENAME=${IMAGENAME} >> /usr/local/share/buildinfo/config/buildinfo.config"
36+
37+
sudo LANG=C chroot $FILESYSTEM_ROOT /bin/bash -c "pre_run_buildinfo ${HOST_IMAGE_NAME}"

0 commit comments

Comments
 (0)