Skip to content

Commit 32fa8dc

Browse files
committed
Support SONiC Reproduceable Build
1 parent 7d4ab42 commit 32fa8dc

File tree

74 files changed

+10196
-27
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

74 files changed

+10196
-27
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ target/
2020
*-dbg
2121
*dbg.j2
2222
*.img
23+
**/buildinfo
2324

2425
# Autogenerated Dockerfiles
2526
sonic-slave*/Dockerfile

Makefile.work

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -89,10 +89,18 @@ else
8989
SLAVE_DIR = sonic-slave-jessie
9090
endif
9191

92-
SLAVE_BASE_TAG = $(shell CONFIGURED_ARCH=$(CONFIGURED_ARCH) j2 $(SLAVE_DIR)/Dockerfile.j2 > $(SLAVE_DIR)/Dockerfile && sha1sum $(SLAVE_DIR)/Dockerfile | awk '{print substr($$1,0,11);}')
93-
SLAVE_TAG = $(shell cat $(SLAVE_DIR)/Dockerfile.user $(SLAVE_DIR)/Dockerfile | sha1sum | awk '{print substr($$1,0,11);}')
92+
include rules/config
93+
9494
SLAVE_BASE_IMAGE = $(SLAVE_DIR)
9595
SLAVE_IMAGE = $(SLAVE_BASE_IMAGE)-$(USER)
96+
$(shell SONIC_ENABLE_VERSION_CONTROL=$(SONIC_ENABLE_VERSION_CONTROL) \
97+
SONIC_VERSION_CONTROL_COMPONENTS=$(SONIC_VERSION_CONTROL_COMPONENTS) \
98+
TRUSTED_GPG_URLS=$(TRUSTED_GPG_URLS) PACKAGE_URL_PREFIX=$(PACKAGE_URL_PREFIX) \
99+
scripts/generate_buildinfo_config.sh)
100+
$(shell CONFIGURED_ARCH=$(CONFIGURED_ARCH) j2 $(SLAVE_DIR)/Dockerfile.j2 > $(SLAVE_DIR)/Dockerfile)
101+
$(shell BUILD_SLAVE=y scripts/prepare_docker_buildinfo.sh $(SLAVE_BASE_IMAGE) $(SLAVE_DIR)/Dockerfile $(CONFIGURED_ARCH) "" $(BLDENV))
102+
SLAVE_BASE_TAG = $(shell cat $(SLAVE_DIR)/Dockerfile $(SLAVE_DIR)/buildinfo/versions/versions-* | sha1sum | awk '{print substr($$1,0,11);}')
103+
SLAVE_TAG = $(shell cat $(SLAVE_DIR)/Dockerfile.user $(SLAVE_DIR)/Dockerfile $(SLAVE_DIR)/buildinfo/versions/versions-* | sha1sum | awk '{print substr($$1,0,11);}')
96104

97105
OVERLAY_MODULE_CHECK := \
98106
lsmod | grep -q "^overlay " &>/dev/null || \
@@ -118,8 +126,6 @@ DOCKER_RUN := docker run --rm=true --privileged --init \
118126
-i$(if $(TERM),t,) \
119127
$(SONIC_BUILDER_EXTRA_CMDLINE)
120128

121-
include rules/config
122-
123129
ifneq ($(DOCKER_BUILDER_USER_MOUNT),)
124130
DOCKER_RUN += $(foreach mount,$(subst $(comma), ,$(DOCKER_BUILDER_USER_MOUNT)), $(addprefix -v , $(mount)))
125131
endif
@@ -172,7 +178,8 @@ DOCKER_BASE_BUILD = docker build --no-cache \
172178
-t $(SLAVE_BASE_IMAGE):$(SLAVE_BASE_TAG) \
173179
--build-arg http_proxy=$(http_proxy) \
174180
--build-arg https_proxy=$(https_proxy) \
175-
$(SLAVE_DIR)
181+
$(SLAVE_DIR); \
182+
scripts/collect_docker_version_files.sh $(SLAVE_BASE_IMAGE):$(SLAVE_BASE_TAG) target
176183

177184
DOCKER_BUILD = docker build --no-cache \
178185
--build-arg user=$(USER) \
@@ -217,7 +224,7 @@ SONIC_BUILD_INSTRUCTION := make \
217224
TELEMETRY_WRITABLE=$(TELEMETRY_WRITABLE) \
218225
EXTRA_DOCKER_TARGETS=$(EXTRA_DOCKER_TARGETS) \
219226
BUILD_LOG_TIMESTAMP=$(BUILD_LOG_TIMESTAMP) \
220-
SONIC_ENABLE_IMAGE_SIGNATURE=$(ENABLE_IMAGE_SIGNATURE) \
227+
SLAVE_DIR=$(SLAVE_DIR) \
221228
$(SONIC_OVERRIDE_BUILD_VARS)
222229

223230
.PHONY: sonic-slave-build sonic-slave-bash init reset
@@ -242,12 +249,12 @@ endif
242249
$(DOCKER_BUILD) ; }
243250
ifeq "$(KEEP_SLAVE_ON)" "yes"
244251
ifdef SOURCE_FOLDER
245-
@$(DOCKER_RUN) -v $(SOURCE_FOLDER):/var/$(USER)/src $(SLAVE_IMAGE):$(SLAVE_TAG) bash -c "$(SONIC_BUILD_INSTRUCTION) $@; /bin/bash"
252+
@$(DOCKER_RUN) -v $(SOURCE_FOLDER):/var/$(USER)/src $(SLAVE_IMAGE):$(SLAVE_TAG) bash -c "$(SONIC_BUILD_INSTRUCTION) $@; scripts/collect_build_version_files.sh $$?; /bin/bash"
246253
else
247-
@$(DOCKER_RUN) $(SLAVE_IMAGE):$(SLAVE_TAG) bash -c "$(SONIC_BUILD_INSTRUCTION) $@; /bin/bash"
254+
@$(DOCKER_RUN) $(SLAVE_IMAGE):$(SLAVE_TAG) bash -c "$(SONIC_BUILD_INSTRUCTION) $@; scripts/collect_build_version_files.sh $$?; /bin/bash"
248255
endif
249256
else
250-
@$(DOCKER_RUN) $(SLAVE_IMAGE):$(SLAVE_TAG) $(SONIC_BUILD_INSTRUCTION) $@
257+
@$(DOCKER_RUN) $(SLAVE_IMAGE):$(SLAVE_TAG) bash -c "$(SONIC_BUILD_INSTRUCTION) $@; scripts/collect_build_version_files.sh $$?"
251258
endif
252259

253260
sonic-slave-base-build :

build_debian.sh

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -75,16 +75,16 @@ pushd $FILESYSTEM_ROOT
7575
sudo mount --bind . .
7676
popd
7777

78-
## Build a basic Debian system by debootstrap
79-
echo '[INFO] Debootstrap...'
80-
if [[ $CONFIGURED_ARCH == armhf || $CONFIGURED_ARCH == arm64 ]]; then
81-
# qemu arm bin executable for cross-building
82-
sudo mkdir -p $FILESYSTEM_ROOT/usr/bin
83-
sudo cp /usr/bin/qemu*static $FILESYSTEM_ROOT/usr/bin || true
84-
sudo http_proxy=$http_proxy debootstrap --variant=minbase --arch $CONFIGURED_ARCH $IMAGE_DISTRO $FILESYSTEM_ROOT http://deb.debian.org/debian
85-
else
86-
sudo http_proxy=$http_proxy debootstrap --variant=minbase --arch $CONFIGURED_ARCH $IMAGE_DISTRO $FILESYSTEM_ROOT http://debian-archive.trafficmanager.net/debian
87-
fi
78+
## Build the host base debian system
79+
echo '[INFO] Build host base image...'
80+
TARGET_PATH=$TARGET_PATH scripts/build_host_base_image.sh $CONFIGURED_ARCH $IMAGE_DISTRO $FILESYSTEM_ROOT
81+
82+
# Prepare buildinfo
83+
sudo scripts/prepare_base_image_buildinfo.sh $CONFIGURED_ARCH $IMAGE_DISTRO $FILESYSTEM_ROOT $http_proxy
84+
85+
# Generate version files for apt/pip/pip3 packages
86+
# sudo LANG=C chroot $FILESYSTEM_ROOT generate_version_files
87+
8888

8989
## Config hostname and hosts, otherwise 'sudo ...' will complain 'sudo: unable to resolve host ...'
9090
sudo LANG=C chroot $FILESYSTEM_ROOT /bin/bash -c "echo '$HOSTNAME' > /etc/hostname"
@@ -568,6 +568,8 @@ sudo du -hsx $FILESYSTEM_ROOT
568568
sudo mkdir -p $FILESYSTEM_ROOT/var/lib/docker
569569
sudo mksquashfs $FILESYSTEM_ROOT $FILESYSTEM_SQUASHFS -e boot -e var/lib/docker -e $PLATFORM_DIR
570570

571+
scripts/collect_host_image_version_files.sh $TARGET_PATH $FILESYSTEM_ROOT
572+
571573
## Compress docker files
572574
pushd $FILESYSTEM_ROOT && sudo tar czf $OLDPWD/$FILESYSTEM_DOCKERFS -C ${DOCKERFS_PATH}var/lib/docker .; popd
573575

dockers/docker-base-buster/Dockerfile.j2

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ FROM multiarch/debian-debootstrap:arm64-buster
77
FROM debian:buster
88
{% endif %}
99

10+
RUN echo "deb [arch=amd64] http://packages.trafficmanager.net/debian/debian buster main contrib non-free" >> /etc/apt/sources.list && \
11+
echo "deb [arch=amd64] http://packages.trafficmanager.net/debian/debian buster-updates main contrib non-free" >> /etc/apt/sources.list
12+
1013
# Clean documentation in FROM image
1114
RUN find /usr/share/doc -depth \( -type f -o -type l \) ! -name copyright | xargs rm || true
1215

files/build/scripts/apt-get

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
#!/bin/bash
2+
3+
INSTALL=
4+
5+
VERSION_FILE="/usr/local/share/buildinfo/base-versions/versions-deb"
6+
for para in $@
7+
do
8+
if [[ "$para" != -* ]]; then
9+
continue
10+
fi
11+
if [ ! -z "$INSTALL" ]; then
12+
if [[ "$para" == *=* ]]; then
13+
continue
14+
package=$(echo "$para" | cut -d= -f1)
15+
version=$(echo "$para" | cut -d= -f2)
16+
if grep "^${package}=" $VERSION_FILE; then
17+
if ! grep "^${package}==${version}$" $VERSION_FILE; then
18+
EXPECTED_VERSION=$(grep "^${package}=" $VERSION_FILE | cut -d= -f3)
19+
echo "${package}=${version}, expected version is ${EXPECTED_VERSION}"
20+
exit 1
21+
fi
22+
fi
23+
else
24+
if ! grep "^${package}=" $VERSION_FILE; then
25+
echo "The version of the package ${package} is not specified."
26+
exit 1
27+
fi
28+
fi
29+
elif [[ "$para" == "install" ]]; then
30+
INSTALL=y
31+
fi
32+
done
33+
34+
35+
/usr/bin/apt-get $@
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
#!/bin/bash
2+
3+
#apt list --installed | sed "1d" | awk '{gsub("/.*", "", $1); print $1"="$2}'
4+
dpkg-query -W -f '${Package}==${Version}\n'
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#!/bin/bash
2+
3+
rm -f /usr/local/sbin/apt-get
4+
rm -f /usr/local/sbin/pip
5+
rm -f /usr/local/sbin/pip3
6+
rm -f /usr/local/sbin/wget
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
#!/bin/bash
2+
3+
TARGET_PATH=$1
4+
5+
mkdir -p $TARGET_PATH
6+
dpkg-query -W -f '${Package}==${Version}\n' > "${TARGET_PATH}/versions-deb"
7+
([ -x "/usr/local/bin/pip" ] || [ -x "/usr/bin/pip" ]) && pip freeze > "${TARGET_PATH}/versions-py2"
8+
([ -x "/usr/local/bin/pip3" ] || [ -x "/usr/bin/pip3" ]) && pip3 freeze > "${TARGET_PATH}/versions-py3"
9+
10+
exit 0

files/build/scripts/curl

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#!/bin/bash
2+
3+
4+
PARENT_PATH=$(dirname $0)
5+
REAL_COMMAND=/usr/bin/curl
6+
7+
REAL_COMMAND=$REAL_COMMAND ${PARENT_PATH}/wget $@

files/build/scripts/pip

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
#!/bin/bash
2+
3+
. /usr/local/share/buildinfo/config/buildinfo.config
4+
5+
[ -z "$PIP_COMPONENT" ] && PIP_COMPONENT=py2
6+
7+
if [ "$PIP_COMPONENT" == "py2" ]; then
8+
PIP_COMMAND=/usr/local/bin/pip
9+
[ ! -f $PIP_COMMAND ] && PIP_COMMAND=/usr/bin/pip
10+
else
11+
PIP_COMMAND=/usr/bin/pip3
12+
fi
13+
14+
VERSION_FILE="$BUILDINFO_PATH/versions/versions-${PIP_COMPONENT}"
15+
ENABLE_VERSION_CONTROL=$(check_version_control "$PIP_COMPONENT")
16+
17+
18+
if [ "$ENABLE_VERSION_CONTROL" != "y" ]; then
19+
$PIP_COMMAND "$@"
20+
exit $?
21+
fi
22+
23+
paras=("$@")
24+
FOUND=false
25+
INSTALL=false
26+
VERSION_CONFIG_FILE="${VERSION_FILE}.config"
27+
cp -f $VERSION_FILE $VERSION_CONFIG_FILE
28+
for para in "${paras[@]}"
29+
do
30+
([ "$para" == "-c" ] || [ "$para" == "--constraint" ]) && FOUND=true
31+
[ "$para" == "install" ] && INSTALL=true
32+
if [[ "$para" == *.whl ]]; then
33+
package_name=$(echo $para | cut -d- -f1 | tr _ .)
34+
sed "/^${package_name}==/d" -i $VERSION_CONFIG_FILE
35+
fi
36+
done
37+
38+
if [ "$SONIC_ENABLE_VERSION_CONTROL" == "y" ] && [ "$FOUND" == "false" ] && [ "$INSTALL" == "true" ]; then
39+
paras+=("-c")
40+
paras+=("${VERSION_CONFIG_FILE}")
41+
fi
42+
43+
44+
if [ ! -x "$PIP_COMMAND" ] && [ " $1" == "freeze" ]; then
45+
exit 1
46+
fi
47+
48+
$PIP_COMMAND ${paras[@]}

0 commit comments

Comments
 (0)