summaryrefslogtreecommitdiff
path: root/run-bootstrap-in-chroot
blob: fbe1e9f53fb569847cda20b498f6ea289bf8b21e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
#!/bin/bash

set -e

unmount_virtual()
{
    umount "$1/proc" || true
    umount "$1/sys" || true
    umount "$1/tree/proc" || true
    umount "$1/tree/sys" || true
}

pass_snapshot()
{
    echo -n "$snapshotdir/$1-snapshot.tar.gz"
}

has_pass()
{
    if [ -e $(pass_snapshot "$1") ]
    then
        return 0
    else
        return 1
    fi
}

update_morph()
{
    local dir="$1"
    cp baserock-bootstrap "$dir/." # update bootstrap script
    rm -rf "$dir/tree/baserock/gits/morph"
    mkdir -p "$dir/tree/baserock/gits/morph"

    # Copy everything except the target directory into the target directory.
    # The point is to be able to keep the working area for a bootstrap inside
    # the morph source directory. This is useful for Jenkins jobs.
    local base=$(basename $(basename "$dir"))
    find . -mindepth 1 -maxdepth 1 ! -name "$base" ! -name '*.tar.gz' \
        -exec cp -a '{}' "$dir/tree/baserock/gits/morph" ';'
}

run_pass()
{
    local dir="$1"
    local passname="$2"
    local tarball=$(pass_snapshot "$passname")

    if "$snapshot" && has_pass "$passname"
    then
        tar -C "$dir" -xhf "$tarball"
        update_morph "$dir"
    else
        update_morph "$dir"
        "./do-squeeze-chroot" bash -x baserock-bootstrap "$passname" || exit 1
        if "$snapshot"
        then
            tar -C "$dir" -caf "$tarball" .
        fi
    fi
}

export LC_ALL=C

if [ "x$1" = x ]
then
    echo "Usage: $0 chroot-dir" 1>&2
    exit 1
fi

mkdir -p "$1"
dir="$1/squeeze-chroot"
: ${snapshot:=true}
snapshotdir="$1"

cat >"./do-squeeze-chroot" <<EOF
#!/bin/sh

# clear the temporary directory used outside the chroot
export TMPDIR=

if mount -t proc proc "$dir/proc"; then
  trap "umount \"$dir/proc\"" INT TERM EXIT
  if mount -t sysfs sysfs "$dir/sys"; then
    trap "umount \"$dir/proc\" \"$dir/sys\"" INT TERM EXIT
    if [ "x$CCACHE_HOST_DIR" != "x" ]; then
      if mount --bind "$CCACHE_HOST_DIR" "$dir/var/tmp/ccache"; then
        trap "umount \"$dir/proc\" \"$dir/sys\" \"$dir/var/tmp/ccache\"" \
          INT TERM EXIT
        chroot "$dir" "\$@"
      fi
    else
      chroot "$dir" "\$@"
    fi
  fi
fi
EOF
chmod +x "./do-squeeze-chroot"

if ([ "x$DEBIAN_MIRROR" = x ] && echo DEBIAN_MIRROR is unspecified >&2) ||
    ([ "x$GIT_TARBALLS" = x ] && echo GIT_TARBALLS is unspecified >&2)
then
    echo You have to set DEBIAN_MIRROR and other environment variables 1>&2
    exit 1
fi

if ! which dpkg 2> /dev/null; then
    echo "Warning: dpkg not found -- should debootstrap fail to autodetect "
    echo "your architecture, set ARCH in the environment (probably to amd64)"
fi

# prepare the ccache directory in the chroot, if necessary
if [ "x$CCACHE_HOST_DIR" = "x" ]; then
    # print a warning if the CCACHE_HOST_DIR is not set
    echo "CCACHE_HOST_DIR is unspecified, but that's ok" >&2
fi

unmount_virtual "$dir"
rm -rf "$dir"
mkdir "$dir"

chrootsnapshot="$snapshotdir/squeeze.tar.gz"
if ! "$snapshot" || ! has_pass pass1a; then
    if "$snapshot" && [ -e "$chrootsnapshot" ]
    then
        tar -C "$dir" -xhf "$chrootsnapshot"
    else
        EXTRAPACKAGES="build-essential,gawk,bison,flex,python,autoconf"
        EXTRAPACKAGES="$EXTRAPACKAGES,autopoint,automake,gettext,libtool"
        EXTRAPACKAGES="$EXTRAPACKAGES,help2man,texinfo,sudo,ccache,gperf"
        EXTRAPACKAGES="$EXTRAPACKAGES,python-pip,python-simplejson,python-yaml"

        EXTRAARGS=
        if [ -n $ARCH]; then
            EXTRAARGS=$ARCH
        fi

        debootstrap $EXTRAARGS --include="$EXTRAPACKAGES" squeeze \
                    "$dir" "$DEBIAN_MIRROR"

        mkdir -p "$dir/etc"
        hostname > "$dir/etc/hostname"
        cat <<EOF > "$dir/etc/hosts"
127.0.0.1   localhost
127.0.1.1   `hostname`
EOF
   
        # create the directory for cached ccache object files
        mkdir -p "$dir/var/tmp/ccache"
    
        # manually build and install cliapp
        "./do-squeeze-chroot" mkdir -p /src
        "./do-squeeze-chroot" \
            git clone git://roadtrain.codethink.co.uk/delta/cliapp /src/cliapp
        "./do-squeeze-chroot" \
            sh -c 'cd /src/cliapp && "$@"' -- python setup.py build
        "./do-squeeze-chroot" \
            sh -c 'cd /src/cliapp && "$@"' -- python setup.py install
        
        "./do-squeeze-chroot" pip install ordereddict
    
        if "$snapshot"
        then
            tar -caf "$chrootsnapshot" -C "$dir" .
        fi
    fi
fi

# Unpack existing snapshot, or run pass1 of bootstrap and then make snapshot.

if ! "$snapshot" || ! has_pass pass1b
then
    run_pass "$dir" pass1a
fi

if ! "$snapshot" || ! has_pass pass2a
then
    run_pass "$dir" pass1b
fi

if ! "$snapshot" || ! has_pass pass2b
then
    run_pass "$dir" pass2a
fi

if ! "$snapshot" || ! has_pass pass3a
then
    run_pass "$dir" pass2b
fi

if ! "$snapshot" || ! has_pass pass3b
then
    run_pass "$dir" pass3a
fi

snapshot=false run_pass "$dir" pass3b

echo "Passes 1, 2, and 3 of bootstrap done (possibly cached)."