summaryrefslogtreecommitdiffstats
path: root/tests/basic/rpm.t
blob: e5da49bb7e04ee79d60d0549ebe316791c3dc7e1 (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
#!/bin/bash
#
# This test will run mock and rebuild the srpm for the latest two EPEL version.
# By default, the results and the chroots are deleted.
#
# When debugging is needed, make sure to set DEBUG=1 in the environment or this
# script. When debugging is enabled, the resulting log files and chroots are
# kept. With debugging enabled, this test will fail the regression test, and
# all output is saved to rpmbuild-mock.log. Tests are run in parallel, so the
# logfile may be difficult to read.
#
# chroots are configured in /etc/mock/*.cfg, with site-defaults.cfg as main
# configuration file. The default for chroots is /var/lib/mock, but this
# depends on the 'basedir' configuration option set in the mentioned files.
#

. $(dirname $0)/../include.rc

case $OSTYPE in
Linux)
        ;;
*)
        echo "Skip test using mock, which requires Linux" >&2
        SKIP_TESTS
        exit 0
        ;;
esac

# enable some extra debugging
if [ -n "${DEBUG}" -a "${DEBUG}" != "0" ]
then
	exec &> rpmbuild-mock.log
	set -x
        MOCK_CLEANUP='--no-cleanup-after'
else
        MOCK_CLEANUP='--cleanup-after'
fi

# detect the branch we're based off
if [ -n "${BRANCH}" ] ; then
        # $BRANCH is set in the environment (by Jenkins or other)
        GIT_PARENT="origin/${BRANCH}"
else
        # get a reference to the latest clean tree
        GIT_PARENT=$(git describe --abbrev=0)
fi

# Filter out everything and what remains needs to be built
BUILD_FILES=$(git diff --name-status ${GIT_PARENT} | grep -Ev '^M.*\.(c|h|py)' | awk {'print $2'})
SELFTEST=$(grep -e 'tests/basic/rpm.t' <<< "${BUILD_FILES}")
BUILD_FILES=$(grep -Ev '^tests/' <<< "${BUILD_FILES}")
if [ -z "${BUILD_FILES}" -a -z "${SELFTEST}" ]
then
        # nothing affecting packaging changed, no need to retest rpmbuild
        SKIP_TESTS
        cleanup
        exit 0
fi

# checkout the sources to a new directory to execute ./configure and all
REPO=${PWD}
COMMIT=$(git describe)

# make sure to cleanup in case DEBUG was enabled in a previous run
[ -d rpmbuild-mock.d ] && rm -rf rpmbuild-mock.d
mkdir rpmbuild-mock.d
pushd rpmbuild-mock.d 2>/dev/null

function git_quiet() {
        git ${@} 2>&1 > /dev/null
}

TEST git_quiet clone -s file://${REPO} .
TEST git_quiet checkout -b rpm-test ${COMMIT}

# build the glusterfs-*.tar.gz
function build_srpm_from_tgz() {
        rpmbuild -ts $1 \
                --define "_srcrpmdir ${PWD}" \
                --define '_source_payload w9.gzdio' \
                --define '_source_filedigest_algorithm 1'
}

TEST ./autogen.sh
TEST ./configure
TEST make dist

# build the glusterfs src.rpm
TEST build_srpm_from_tgz ${PWD}/*.tar.gz

# even though the last two Fedora EPEL releases are x86_64 only, we allow other arches to build
for MOCK_CONF in $(ls -x1 /etc/mock/*.cfg | egrep -e 'epel-[0-9]+-'`uname -i`'.cfg$' | tail -n2)
do
	EPEL_RELEASE=$(basename ${MOCK_CONF} .cfg)
	mkdir -p "${PWD}/mock.d/${EPEL_RELEASE}"
	chgrp mock "${PWD}/mock.d/${EPEL_RELEASE}"
	chmod 0775 "${PWD}/mock.d/${EPEL_RELEASE}"
	MOCK_RESULTDIR="--resultdir ${PWD}/mock.d/${EPEL_RELEASE}"
	# expand the mock command line
	MOCK_CMD="/usr/bin/mock ${MOCK_CLEANUP} \
		${MOCK_RESULTDIR} \
		-r ${EPEL_RELEASE} --rebuild ${PWD}/*.src.rpm"

	# write the mock command to a file, so that its easier to execute
	cat << EOF > mock-${EPEL_RELEASE}.sh
#!/bin/sh
${MOCK_CMD}
EOF
	chmod +x mock-${EPEL_RELEASE}.sh

	# root can not run 'mock', it needs to drop privileges
	if (groups | grep -q mock)
	then
		# the current user is in group 'mock'
		${PWD}/mock-${EPEL_RELEASE}.sh &
	else
		# "su" might not work, using sudo instead
		sudo -u mock -E ${PWD}/mock-${EPEL_RELEASE}.sh &
	fi
	sleep 5
done

# TAP and Prove aren't smart about loops
TESTS_EXPECTED_IN_LOOP=2
for mockjob in $(jobs -p)
do
	TEST_IN_LOOP wait ${mockjob}
done

# we could build for the last two Fedora releases too, but that is not
# possible on EPEL-5/6 installations, Fedora 17 and newer have unmet
# dependencies on the build-server :-/

# logs are archived by Jenkins
if [ -d '/build/install/var' ]
then
        LOGS=$(find mock.d -type f -name '*.log')
        [ -n "${LOGS}" ] && xargs cp --parents ${LOGS} /build/install/var/
fi

popd 2>/dev/null
# only remove rpmbuild-mock.d if we're not debugging
[ "${DEBUG}" = "0" ] && rm -rf rpmbuild-mock.d

cleanup