summaryrefslogtreecommitdiffstats
path: root/bin/lvc.sh
blob: 87a596b0c1665afd319cff7dcaaa6f42f416ec22 (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
#!/bin/bash

# Copyright 2012-2015 Holger Levsen <holger@layer-acht.org>
# Copyright 2016 Philip Hands <phil@hands.com>
# released under the GPLv=2

DEBUG=false
. /srv/jenkins/bin/common-functions.sh
common_init "$@"

# $1 = wget url/jigdo url
URL=$1 ; shift

replace_origin_pu() {
    PREFIX=$1 ; shift
    BRANCH=$1 ; shift
    expr "$BRANCH" : 'origin/pu/' >/dev/null || return 1
    echo "${PREFIX}${BRANCH#origin/pu/}"
}

# if $URL is set to "use_PU_GIT_BRANCH" then use the contents of $PU_GIT_BRANCH to work out the locally built ISO name
if [ "use_PU_GIT_BRANCH" = "$URL" ] ; then
	if PU_ISO="$(replace_origin_pu "/srv/d-i/isos/mini-gtk-" $PU_GIT_BRANCH).iso" ; then
		[ -f "$PU_ISO" ] || {
			echo "looks like we're meant to be testing '$PU_ISO', but it's missing"
			exit 1
			}
		URL=$PU_ISO
	else
		echo "URL='$URL' but PU_GIT_BRANCH='$PU_GIT_BRANCH' -- aborting"
		exit 1
	fi
fi

cleanup_all() {
        find . -name \*.vlog.png -print0 | xargs -0 -r rm
	echo "Trying to preserve last screenshot…"
	LAST_SCREENSHOT=$(ls -t1 $RESULTS/*.png | head -1)
	if [ -e "$LAST_SCREENSHOT" ] ; then
	        cp $LAST_SCREENSHOT $WORKSPACE/screenshot.png
		convert $WORKSPACE/screenshot.png -adaptive-resize 128x96 $WORKSPACE/screenshot-thumb.png
	fi
}

fetch_if_newer() {
        url="$2"
        file="$1"
	if [ -f $url ] ; then
		echo "the URL turns out to be a local path ($url) -- linking"
		ln -sf $url $file
		return
        fi
        echo "Downloading $url"
        curlopts="-L -s -S"
        if [ -f "$file" ] ; then
                ls -l $file
                echo "File exists, will only re-download if a newer one is available..."
                curlopts="$curlopts -z $file"
        fi
        curl $curlopts -o $file.new $url
        if [ -e  $file.new ] ; then
          mv -f $file.new $file
        fi
}

discard_snapshots() {
    domain=$1 ; shift
    # if more parameters are provided, discard any snapshot younger than the files/dirs listed
    # otherwise, get rid of all of them (hence the [ -z "$1" ] below)

    sudo /usr/bin/virsh -q snapshot-list $domain | \
        while read snap date time tz state ; do
            if [ -z "$1" ] || [ "$(find "$@" -newermt "$date $time $tz" -print -quit)" ] ; then
                sudo /usr/bin/virsh snapshot-delete $domain $snap
            fi
        done
}

#
# define workspace + results
#
if [ -z "$WORKSPACE" ] ; then
    WORKSPACE=$PWD
fi
RESULTS=$WORKSPACE/results

IMAGE=$WORKSPACE/$(basename $URL)

LIBVIRT_DOMAIN_NAME="lvcVM-$JOB_NAME"

rm -rf $RESULTS $WORKSPACE/screenshot{,-thumb}.png

mkdir -p $RESULTS

mkdir -p $WORKSPACE/DebianToasterStorage

trap cleanup_all INT TERM EXIT

#
# install image preparation
#
if [ ! -z "$NETBOOT" ] ; then
        #
        # if there is a netboot installer tarball...
        #
        fetch_if_newer "$NETBOOT" "$URL"
        sha256sum "$NETBOOT"
        # try to extract, otherwise clean up and abort
        if ! tar -zxvf "$NETBOOT" ; then
                echo "tarball seems corrupt;  deleting it"
                rm -f "$NETBOOT"
                exit 1
        fi
elif [ ! -z "$IMAGE" ] ; then
        #
        # if there is a CD image...
        #
        fetch_if_newer "$IMAGE" "$URL"
        # is this really an .iso?
        if [ $(file -L "$IMAGE" | grep -cE '(ISO 9660|DOS/MBR boot sector)') -eq 1 ] ; then
                # yes, so let's md5sum and mount it
                md5sum $IMAGE
#                sudo mkdir -p $IMAGE_MNT
#                grep -q $IMAGE_MNT /proc/mounts && sudo umount -l $IMAGE_MNT
#                sleep 1
#                sudo mount -o loop,ro $IMAGE $IMAGE_MNT
        else
                # something went wrong
                figlet "no .iso"
                echo "ERROR: no valid .iso found"
                if [ $(file "$IMAGE" | grep -c "HTML document") -eq 1 ] ; then
                        mv "$IMAGE" "$IMAGE.html"
                        lynx --dump "$IMAGE.html"
                        rm "$IMAGE.html"
                fi
                exit 1
        fi
else
        #
        # else netboot gtk
        #
        fetch_if_newer "$KERNEL" "$URL/$KERNEL"
        fetch_if_newer "$INITRD" "$URL/$INITRD"
fi

# discard any snapshots that are older than the inputs
for dep in /srv/jenkins/cucumber /srv/jenkins/bin/lvc.sh /srv/jenkins/job-cfg/lvc.yaml $NETBOOT $PU_ISO ; do
  if [ -e "$dep" ] ; then
    LV_SNAP_DEPENDS="$LV_SNAP_DEPENDS $dep"
  fi
done
discard_snapshots $LIBVIRT_DOMAIN_NAME $LV_SNAP_DEPENDS

#  --keep-snapshots -- keeps the VM snapshots -- let's make life simple and not do that until we're using them to pass on state to the next jenkins job

echo "Debug log available at runtime at https://jenkins.debian.net/view/lvc/job/$JOB_NAME/ws/results/debug.log"

/srv/jenkins/cucumber/bin/run_test_suite --capture-all --keep-snapshots --vnc-server-only --iso $IMAGE --tmpdir $WORKSPACE --old-iso $IMAGE -- --format pretty --format pretty_debug --out $RESULTS/debug.log /srv/jenkins/cucumber/features/step_definitions /srv/jenkins/cucumber/features/support "${@}" || {
  RETVAL=$?
  discard_snapshots $LIBVIRT_DOMAIN_NAME
  exit $RETVAL
}

cleanup_all

# don't cleanup twice
trap - INT TERM EXIT