Pin pip to 20.3.3 and disable tmpfs in DIB
[ta/build-tools.git] / build_step_create_install_cd.sh
1 #!/bin/bash
2 # Copyright 2019 Nokia
3 #
4 # Licensed under the Apache License, Version 2.0 (the "License");
5 # you may not use this file except in compliance with the License.
6 # You may obtain a copy of the License at
7 #
8 #     http://www.apache.org/licenses/LICENSE-2.0
9 #
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
15
16 set -x
17 set -e
18
19 scriptdir="$(dirname $(readlink -f ${BASH_SOURCE[0]}))"
20 source $scriptdir/lib.sh
21 _read_manifest_vars
22
23 tmp=$WORKTMP/install_cd
24 iso_build_dir=$tmp/build
25
26 input_image=$(readlink -f ${1:-$WORKTMP/goldenimage/$GOLDEN_IMAGE_NAME})
27 output_image_path=${2:-$RESULT_IMAGES_DIR/install.iso}
28 output_bootcd_path=${3:-$RESULT_IMAGES_DIR/bootcd.iso}
29 mkdir -p $tmp
30 rm -rf $iso_build_dir
31 mkdir -p $iso_build_dir
32
33 iso_arch="$(uname -m)"
34 reposnap_base=$(_read_build_config DEFAULT centos_reposnap)
35 release_version=$PRODUCT_RELEASE_LABEL
36 reposnap_base_dir="${reposnap_base}/os/${iso_arch}/"
37 iso_image_label=$(_read_build_config DEFAULT iso_image_label)
38 cd_efi_dir="${reposnap_base_dir}/EFI"
39 cd_images_dir="${reposnap_base_dir}/images"
40 cd_isolinux_dir="${reposnap_base_dir}/isolinux"
41
42 remove_extra_slashes_from_url() {
43   echo $1 | sed -re 's#([^:])//+#\1/#g'
44 }
45
46 wget_dir() {
47   local url=$1
48   echo $url | grep -q /$ || _abort "wget path '$url' must end with slash for recursive wget"
49   # if any extra slashes within path, it messes up the --cut-dirs count
50   url=$(remove_extra_slashes_from_url $url)
51   # count cut length in case url depth changes
52   cut_dirs=$(echo $url | sed -re 's|.*://[^/]+/(.+)|\1|' -e 's|/$||' | grep -o / | wc -l)
53   wget -N -r \
54     --no-host-directories \
55     --no-verbose \
56     --cut-dirs=${cut_dirs} \
57     --reject index.html* \
58     --no-parent \
59     --execute robots=off \
60     $url
61 }
62
63 pushd $iso_build_dir
64
65 # Get files needed for generating CD image.
66 wget_dir ${cd_efi_dir}/
67 wget_dir ${cd_images_dir}/
68 rm -f images/boot.iso
69 sync
70 chmod +w -R EFI/ images/
71 # Only x86_64 supports PC-BIOS, so skip all isolinux processing on other platforms
72 if [ "${iso_arch}" = 'x86_64' ]; then
73     wget_dir ${cd_isolinux_dir}/
74     chmod +w -R isolinux/
75
76     if [ -e $scriptdir/isolinux/isolinux.cfg ]; then
77         cp $scriptdir/isolinux/isolinux.cfg isolinux/isolinux.cfg
78     else
79         sed -i "s/^timeout.*/timeout 100/" isolinux/isolinux.cfg
80         sed -i "s/^ -  Press.*/Begin the cloud installation process/" isolinux/boot.msg
81         sed -i "s/^#menu hidden/menu hidden/" isolinux/isolinux.cfg
82         sed -i "s/menu default//" isolinux/isolinux.cfg
83         sed -i "/^label linux/amenu default" isolinux/isolinux.cfg
84         sed -i "/append initrd/ s/$/ console=tty0 console=ttyS1,115200/" isolinux/isolinux.cfg
85     fi
86     cp -f $scriptdir/akraino_splash.png isolinux/splash.png
87 fi
88
89 # Update grub.cfg for EFI booting, similar to isolinux
90 sed -i '/menuentry/{N;N;N;q}' EFI/BOOT/grub.cfg
91 sed -i -e 's|Install CentOS 7|Begin the cloud installation process|' \
92        -e '/vmlinuz/ s/$/ console=tty0 console=ttyS1,115200 console=ttyAMA0,115200/' \
93     EFI/BOOT/grub.cfg
94
95 popd
96
97 pushd $tmp
98
99  # Copy latest kernel and initrd-provisioning from boot dir
100 if [ "${iso_arch}" = 'x86_64' ]; then
101     qemu-img convert $input_image guest-image.raw
102     myloop=$(sudo losetup -fP --show guest-image.raw)
103     mkdir mnt
104     sudo mount -o loop ${myloop}p1 mnt/
105     sudo rsync -avA mnt/boot .
106     sudo chown -R $(id -u):$(id -g) boot
107     sudo umount mnt
108     sudo losetup -d ${myloop}
109     sudo rm -rf guest-image.raw mnt
110 else
111     export LIBGUESTFS_BACKEND=direct
112     virt-copy-out -a $input_image /boot/ ./
113 fi
114
115 chmod u+w boot/
116 KVER=`ls -lrt boot/vmlinuz-* |grep -v rescue |tail -n1 |awk -F 'boot/vmlinuz-' '{print $2}'`
117 if [ "${iso_arch}" = 'x86_64' ]; then
118     rm -f $iso_build_dir/isolinux/vmlinuz $iso_build_dir/isolinux/initrd.img
119     cp -fp boot/vmlinuz-${KVER} $iso_build_dir/isolinux/vmlinuz
120     cp -fp boot/initrd-provisioning.img $iso_build_dir/isolinux/initrd.img
121 fi
122 rm -f $iso_build_dir/images/pxeboot/vmlinuz $iso_build_dir/images/pxeboot/initrd.img
123 cp -fp boot/vmlinuz-${KVER} $iso_build_dir/images/pxeboot/vmlinuz
124 cp -fp boot/initrd-provisioning.img $iso_build_dir/images/pxeboot/initrd.img
125 rm -rf boot/
126
127 echo "Generating boot iso"
128 if [ "${iso_arch}" = 'x86_64' ]; then
129     bios_specific_args="-b isolinux/isolinux.bin -c isolinux/boot.cat \
130                         -no-emul-boot -boot-load-size 4 -boot-info-table"
131 fi
132 genisoimage  -U -r -v -T -J -joliet-long \
133   -V "${release_version}" -A "${release_version}" -P ${iso_image_label} \
134   ${bios_specific_args:-} \
135   -eltorito-alt-boot -e images/efiboot.img -no-emul-boot \
136   -o boot.iso $iso_build_dir
137 _publish_image $tmp/boot.iso $output_bootcd_path
138
139 cp -f ${input_image} $iso_build_dir/
140
141 # Keep the placeholder
142 mkdir -p $iso_build_dir/rpms
143
144 echo "Generating product iso"
145 genisoimage  -U -r -v -T -J -joliet-long \
146   -V "${release_version}" -A "${release_version}" -P ${iso_image_label} \
147   ${bios_specific_args:-} \
148   -eltorito-alt-boot -e images/efiboot.img -no-emul-boot \
149   -o release.iso $iso_build_dir
150 [ "${iso_arch}" != 'x86_64' ] || isohybrid $tmp/release.iso
151 _publish_image $tmp/release.iso $output_image_path
152
153 echo "Clean up to preserve workspace footprint"
154 rm -f $iso_build_dir/$(basename ${input_image})
155 rm -rf $iso_build_dir/rpms
156
157 popd