Skip to content

Commit bf90b49

Browse files
authored
[Build] use pigz to speed up a build (#12825)
Why I did it It's possible to speed up some parts of a build using parallel compression/decompression. This is especially important for build_debian.sh. How I did it pigz is a parallel implementation of gzip: https://zlib.net/pigz/ Some programs like docker and mkinitramfs can automatically detect and use it instead of gzip. For tar we need to select it directly. To enable this feature you need to set GZ_COMPRESS_PROGRAM=pigz
1 parent abc8ed8 commit bf90b49

File tree

9 files changed

+33
-8
lines changed

9 files changed

+33
-8
lines changed

Makefile.work

+9
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,9 @@
5353
# * ENABLE_BOOTCHART: Enable SONiC bootchart
5454
# * Default: n
5555
# * Values: y,n
56+
# * GZ_COMPRESS_PROGRAM: Select pigz to reduce build time
57+
# * Default: gzip
58+
# * Values: pigz,gzip
5659
#
5760
###############################################################################
5861

@@ -140,6 +143,10 @@ ifeq ($(ENABLE_DOCKER_BASE_PULL),)
140143
override ENABLE_DOCKER_BASE_PULL = n
141144
endif
142145

146+
ifneq ($(GZ_COMPRESS_PROGRAM), pigz)
147+
override GZ_COMPRESS_PROGRAM = gzip
148+
endif
149+
143150
ifeq ($(CONFIGURED_ARCH),amd64)
144151
SLAVE_BASE_IMAGE = $(SLAVE_DIR)
145152
MULTIARCH_QEMU_ENVIRON = n
@@ -200,6 +207,7 @@ $(shell CONFIGURED_ARCH=$(CONFIGURED_ARCH) \
200207
ENABLE_FIPS_FEATURE=$(ENABLE_FIPS_FEATURE) \
201208
DOCKER_EXTRA_OPTS=$(DOCKER_EXTRA_OPTS) \
202209
DEFAULT_CONTAINER_REGISTRY=$(DEFAULT_CONTAINER_REGISTRY) \
210+
GZ_COMPRESS_PROGRAM=$(GZ_COMPRESS_PROGRAM) \
203211
j2 $(SLAVE_DIR)/Dockerfile.j2 > $(SLAVE_DIR)/Dockerfile)
204212

205213
$(shell CONFIGURED_ARCH=$(CONFIGURED_ARCH) \
@@ -525,6 +533,7 @@ SONIC_BUILD_INSTRUCTION := $(MAKE) \
525533
SONIC_SLAVE_DOCKER_DRIVER=$(SONIC_SLAVE_DOCKER_DRIVER) \
526534
MIRROR_URLS=$(MIRROR_URLS) \
527535
MIRROR_SECURITY_URLS=$(MIRROR_SECURITY_URLS) \
536+
GZ_COMPRESS_PROGRAM=$(GZ_COMPRESS_PROGRAM) \
528537
$(SONIC_OVERRIDE_BUILD_VARS)
529538

530539
.PHONY: sonic-slave-build sonic-slave-bash init reset

build_debian.sh

+8-2
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,12 @@ if [[ $CONFIGURED_ARCH == armhf || $CONFIGURED_ARCH == arm64 ]]; then
138138
else
139139
sudo LANG=C chroot $FILESYSTEM_ROOT /bin/bash -c 'cd /dev && MAKEDEV generic'
140140
fi
141+
142+
## docker and mkinitramfs on target system will use pigz/unpigz automatically
143+
if [[ $GZ_COMPRESS_PROGRAM == pigz ]]; then
144+
sudo LANG=C chroot $FILESYSTEM_ROOT apt-get -y install pigz
145+
fi
146+
141147
## Install initramfs-tools and linux kernel
142148
## Note: initramfs-tools recommends depending on busybox, and we really want busybox for
143149
## 1. commands such as touch
@@ -699,8 +705,8 @@ if [[ $MULTIARCH_QEMU_ENVIRON == y || $CROSS_BUILD_ENVIRON == y ]]; then
699705
fi
700706

701707
## Compress docker files
702-
pushd $FILESYSTEM_ROOT && sudo tar czf $OLDPWD/$FILESYSTEM_DOCKERFS -C ${DOCKERFS_PATH}var/lib/docker .; popd
708+
pushd $FILESYSTEM_ROOT && sudo tar -I $GZ_COMPRESS_PROGRAM -cf $OLDPWD/$FILESYSTEM_DOCKERFS -C ${DOCKERFS_PATH}var/lib/docker .; popd
703709

704710
## Compress together with /boot, /var/lib/docker and $PLATFORM_DIR as an installer payload zip file
705-
pushd $FILESYSTEM_ROOT && sudo tar czf platform.tar.gz -C $PLATFORM_DIR . && sudo zip -n .gz $OLDPWD/$ONIE_INSTALLER_PAYLOAD -r boot/ platform.tar.gz; popd
711+
pushd $FILESYSTEM_ROOT && sudo tar -I $GZ_COMPRESS_PROGRAM -cf platform.tar.gz -C $PLATFORM_DIR . && sudo zip -n .gz $OLDPWD/$ONIE_INSTALLER_PAYLOAD -r boot/ platform.tar.gz; popd
706712
sudo zip -g -n .squashfs:.gz $ONIE_INSTALLER_PAYLOAD $FILESYSTEM_SQUASHFS $FILESYSTEM_DOCKERFS

build_docker.sh

+2-1
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,8 @@ fi
101101

102102
## Save the docker image in a gz file
103103
mkdir -p target
104-
docker save $docker_image_name | gzip -c > target/$docker_image_name.gz
104+
command -v pigz > /dev/null && GZ_COMPRESS_PROGRAM=pigz || GZ_COMPRESS_PROGRAM=gzip
105+
docker save $docker_image_name | $GZ_COMPRESS_PROGRAM -c > target/$docker_image_name.gz
105106

106107
if [ -n "$1" ]; then
107108
./push_docker.sh target/$docker_image_name.gz $@ $docker_image_tag

build_image.sh

+4-4
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,10 @@ generate_kvm_image()
5656
exit 1
5757
}
5858

59-
gzip $KVM_IMAGE_DISK
59+
$GZ_COMPRESS_PROGRAM $KVM_IMAGE_DISK
6060

6161
[ -r $KVM_IMAGE_DISK.gz ] || {
62-
echo "Error : gzip $KVM_IMAGE_DISK failed!"
62+
echo "Error : $GZ_COMPRESS_PROGRAM $KVM_IMAGE_DISK failed!"
6363
exit 1
6464
}
6565

@@ -147,10 +147,10 @@ elif [ "$IMAGE_TYPE" = "raw" ]; then
147147
exit 1
148148
}
149149

150-
gzip $OUTPUT_RAW_IMAGE
150+
$GZ_COMPRESS_PROGRAM $OUTPUT_RAW_IMAGE
151151

152152
[ -r $OUTPUT_RAW_IMAGE.gz ] || {
153-
echo "Error : gzip $OUTPUT_RAW_IMAGE failed!"
153+
echo "Error : $GZ_COMPRESS_PROGRAM $OUTPUT_RAW_IMAGE failed!"
154154
exit 1
155155
}
156156

rules/config

+4
Original file line numberDiff line numberDiff line change
@@ -275,3 +275,7 @@ ENABLE_FIPS ?= n
275275

276276
# SONIC_SLAVE_DOCKER_DRIVER - set the sonic slave docker storage driver
277277
SONIC_SLAVE_DOCKER_DRIVER ?= vfs
278+
279+
# GZ_COMPRESS_PROGRAM - select pigz (a parallel implementation of gzip) to reduce a build time
280+
# and speed up a decompression of docker images on target system
281+
GZ_COMPRESS_PROGRAM ?= gzip

slave.mk

+3-1
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ export DOCKER_BASE_ARCH
8686
export CROSS_BUILD_ENVIRON
8787
export BLDENV
8888
export BUILD_WORKDIR
89+
export GZ_COMPRESS_PROGRAM
8990

9091
###############################################################################
9192
## Utility rules
@@ -431,6 +432,7 @@ ifeq ($(CONFIGURED_PLATFORM),vs)
431432
$(info "BUILD_MULTIASIC_KVM" : "$(BUILD_MULTIASIC_KVM)")
432433
endif
433434
$(info "CROSS_BUILD_ENVIRON" : "$(CROSS_BUILD_ENVIRON)")
435+
$(info "GZ_COMPRESS_PROGRAM" : "$(GZ_COMPRESS_PROGRAM)")
434436
$(info )
435437
else
436438
$(info SONiC Build System for $(CONFIGURED_PLATFORM):$(CONFIGURED_ARCH))
@@ -489,7 +491,7 @@ define docker-image-save
489491
@echo "Tagging docker image $(1)-$(DOCKER_USERNAME):$(DOCKER_USERTAG) as $(1):$(call docker-get-tag,$(1))" $(LOG)
490492
docker tag $(1)-$(DOCKER_USERNAME):$(DOCKER_USERTAG) $(1):$(call docker-get-tag,$(1)) $(LOG)
491493
@echo "Saving docker image $(1):$(call docker-get-tag,$(1))" $(LOG)
492-
docker save $(1):$(call docker-get-tag,$(1)) | gzip -c > $(2)
494+
docker save $(1):$(call docker-get-tag,$(1)) | $(GZ_COMPRESS_PROGRAM) -c > $(2)
493495
if [ x$(SONIC_CONFIG_USE_NATIVE_DOCKERD_FOR_BUILD) == x"y" ]; then
494496
@echo "Removing docker image $(1):$(call docker-get-tag,$(1))" $(LOG)
495497
docker rmi -f $(1):$(call docker-get-tag,$(1)) $(LOG)

sonic-slave-bullseye/Dockerfile.j2

+1
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ RUN apt-get update && apt-get install -y \
8787
curl \
8888
wget \
8989
unzip \
90+
{{ GZ_COMPRESS_PROGRAM }} \
9091
git \
9192
build-essential \
9293
libtool \

sonic-slave-buster/Dockerfile.j2

+1
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ RUN apt-get update && apt-get install -y \
8989
curl \
9090
wget \
9191
unzip \
92+
{{ GZ_COMPRESS_PROGRAM }} \
9293
git \
9394
build-essential \
9495
libtool \

sonic-slave-stretch/Dockerfile.j2

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ RUN apt-get update && apt-get install -y \
2222
curl \
2323
wget \
2424
unzip \
25+
{{ GZ_COMPRESS_PROGRAM }} \
2526
git \
2627
build-essential \
2728
libtool \

0 commit comments

Comments
 (0)