1
1
#! /bin/bash
2
2
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
+
4
14
DOCKER_IMAGE=$1
5
15
TARGET_PATH=$2
6
16
DOCKER_IMAGE_TAG=$3
@@ -13,6 +23,8 @@ DOCKER_IMAGE_NAME=$(echo $DOCKER_IMAGE | cut -d: -f1 | sed "s/-$DOCKER_USERNAME\
13
23
# Create the container specific to the user tag and slave tag
14
24
DOCKER_CONTAINER=${DOCKER_IMAGE_TAG/:/ -}
15
25
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}
16
28
17
29
[ -d $TARGET_VERSIONS_PATH ] && rm -rf $TARGET_VERSIONS_PATH
18
30
mkdir -p $TARGET_VERSIONS_PATH
@@ -34,5 +46,57 @@ docker tag ${DOCKER_IMAGE_TAG} tmp-${DOCKER_IMAGE_TAG}
34
46
DOCKER_BUILDKIT=1 docker build -f ${DOCKER_PATH} /Dockerfile.cleanup --target output -o target/vcache/${DOCKER_IMAGE_NAME} ${DOCKER_PATH}
35
47
DOCKER_BUILDKIT=1 docker build -f ${DOCKER_PATH} /Dockerfile.cleanup --no-cache --target final --tag ${DOCKER_IMAGE_TAG} ${DOCKER_PATH}
36
48
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
37
101
38
102
docker container rm $DOCKER_CONTAINER
0 commit comments