master
pre 130 lines 3.36 KB
Raw
1 #!/bin/sh
2 #
3 # Simple wrapper for debootstrap, run in the docker build context
4 #
5 FAKEROOT=$(which fakeroot 2> /dev/null)
6 # debootstrap < 1.0.67 generates empty sources.list, see Debian#732255
7 MIN_DEBOOTSTRAP_VERSION=1.0.67
8
9 exit_and_skip()
10 {
11 exit 3
12 }
13
14 #
15 # fakeroot is needed to run the bootstrap stage
16 #
17 if [ -z $FAKEROOT ]; then
18 echo "Please install fakeroot to enable bootstraping" >&2
19 exit_and_skip
20
21 fi
22
23 if [ -z "${DEB_ARCH}" ]; then
24 echo "Please set DEB_ARCH to choose an architecture (e.g. armhf)" >&2
25 exit_and_skip
26
27 fi
28
29 if [ -z "${DEB_TYPE}" ]; then
30 echo "Please set DEB_TYPE to a Debian archive name (e.g. testing)" >&2
31 exit_and_skip
32
33 fi
34
35 # The following allow finer grain control over the defaults
36 if [ -z "${DEB_VARIANT}" ]; then
37 DEB_VARIANT=buildd
38 fi
39
40 if [ -z "${DEB_URL}" ]; then
41 DEB_URL="http://httpredir.debian.org/debian"
42 fi
43
44 # We check in order for
45 #
46 # - DEBOOTSTRAP_DIR pointing at a development checkout
47 # - PATH for the debootstrap script (installed)
48 #
49 # If neither option works then we checkout debootstrap from its
50 # upstream SCM and run it from there.
51 #
52
53 if [ -z $DEBOOTSTRAP_DIR ]; then
54 NEED_DEBOOTSTRAP=false
55 DEBOOTSTRAP=$(which debootstrap 2> /dev/null)
56 if [ -z $DEBOOTSTRAP ]; then
57 echo "No debootstrap installed, attempting to install from SCM"
58 NEED_DEBOOTSTRAP=true
59 else
60 INSTALLED_VERSION=$(${DEBOOTSTRAP} --version | sed 's/debootstrap \([0-9\.]*\)[^0-9\.]*.*/\1/')
61 if ! (echo "${MIN_DEBOOTSTRAP_VERSION}" ; echo "${INSTALLED_VERSION}") \
62 | sort -t . -n -k 1,1 -k 2,2 -k 3,3 -C ; then
63 echo "debootstrap too old, attempting to install from SCM"
64 NEED_DEBOOTSTRAP=true
65 fi
66 fi
67 if $NEED_DEBOOTSTRAP; then
68 DEBOOTSTRAP_SOURCE=https://salsa.debian.org/installer-team/debootstrap.git
69 git clone ${DEBOOTSTRAP_SOURCE} ./debootstrap.git
70 export DEBOOTSTRAP_DIR=./debootstrap.git
71 DEBOOTSTRAP=./debootstrap.git/debootstrap
72 (cd "${DEBOOTSTRAP_DIR}" && "${FAKEROOT}" make )
73 fi
74 else
75 DEBOOTSTRAP=${DEBOOTSTRAP_DIR}/debootstrap
76 if [ ! -f $DEBOOTSTRAP ]; then
77 echo "Couldn't find script at ${DEBOOTSTRAP}" >&2
78 exit_and_skip
79 fi
80 fi
81
82 #
83 # Add optional args
84 #
85 if [ -n "${DEB_KEYRING}" ]; then
86 DEBOOTSTRAP="${DEBOOTSTRAP} --keyring=${DEB_KEYRING}"
87 fi
88
89 #
90 # Finally check to see if any qemu's are installed
91 #
92 BINFMT_DIR=/proc/sys/fs/binfmt_misc
93 if [ ! -e $BINFMT_DIR ]; then
94 echo "binfmt_misc needs enabling for a QEMU bootstrap to work" >&2
95 exit_and_skip
96 else
97 # DEB_ARCH and QEMU arch names are not totally aligned
98 case "${DEB_ARCH}" in
99 amd64)
100 QEMU=qemu-i386
101 ;;
102 armel|armhf)
103 QEMU=qemu-arm
104 ;;
105 arm64)
106 QEMU=qemu-aarch64
107 ;;
108 powerpc)
109 QEMU=qemu-ppc
110 ;;
111 ppc64el)
112 QEMU=qemu-ppc64le
113 ;;
114 s390)
115 QEMU=qemu-s390x
116 ;;
117 *)
118 QEMU=qemu-${DEB_ARCH}
119 ;;
120 esac
121 if [ ! -e "${BINFMT_DIR}/$QEMU" ]; then
122 echo "No binfmt_misc rule to run $QEMU, can't bootstrap" >&2
123 exit_and_skip
124 fi
125 fi
126
127 echo "Building a rootfs using ${FAKEROOT} and ${DEBOOTSTRAP} ${DEB_ARCH}/${DEB_TYPE}"
128
129 ${FAKEROOT} ${DEBOOTSTRAP} --variant=$DEB_VARIANT --foreign --arch=$DEB_ARCH $DEB_TYPE . $DEB_URL || exit 1
130 exit 0