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 priviledges
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
|