-
Notifications
You must be signed in to change notification settings - Fork 41
/
Copy pathbuild-rpm.sh
executable file
·159 lines (135 loc) · 4.95 KB
/
build-rpm.sh
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
#!/usr/bin/bash
set -e
MOCK_BIN="/usr/bin/mock"
MOCK_CONF_FOLDER="/etc/mock"
OUTPUT_FOLDER="${MOUNT_POINT}/output"
CACHE_FOLDER="${MOUNT_POINT}/cache"
# shellcheck disable=SC2206
MOCK_DEFINES=(${MOCK_DEFINES})
DEF_SIZE="${#MOCK_DEFINES[@]}"
if [ "${DEF_SIZE}" -gt 0 ]
then
for ((i=0; i < DEF_SIZE; i++));
do
# shellcheck disable=SC2116
DEFINE_CMD+=" --define '$(echo "${MOCK_DEFINES[$i]//=/ }")'"
done
fi
if [ -z "${MOCK_CONFIG}" ]
then
echo "MOCK_CONFIG is empty. Should bin one of: "
ls -l "${MOCK_CONF_FOLDER}"
elif [ ! -f "${MOCK_CONF_FOLDER}/${MOCK_CONFIG}.cfg" ]
then
echo "MOCK_CONFIG is invalid. Should bin one of: "
ls -l "${MOCK_CONF_FOLDER}"
elif [ -z "${SOURCE_RPM}" ] && [ -z "${SPEC_FILE}" ]
then
echo "Please provide the src.rpm or spec file to build"
echo "Set SOURCE_RPM or SPEC_FILE environment variables"
exit 1
fi
if [ -n "${NO_CLEANUP}" ]
then
echo "WARNING: Disabling clean up of the build folder after build"
fi
# If proxy env variable is set, add the proxy value to the configuration file
if [ -n "${HTTP_PROXY}" ] || [ -n "${http_proxy}" ]
then
TEMP_PROXY=""
if [ -n "${HTTP_PROXY}" ]
then
TEMP_PROXY=$(echo "${HTTP_PROXY}" | sed s/\\//\\\\\\//g)
fi
if [ -n "${http_proxy}" ]
then
TEMP_PROXY=$(echo "${http_proxy}" | sed s/\\//\\\\\\//g)
fi
echo "Configuring http proxy to the mock build file to: ${TEMP_PROXY}"
cp "/etc/mock/${MOCK_CONFIG}.cfg" "/tmp/$MOCK_CONFIG.cfg"
sed s/\\[main\\]/\[main\]\\\nproxy="${TEMP_PROXY}"/g \
"/tmp/${MOCK_CONFIG}.cfg" > "/etc/mock/${MOCK_CONFIG}.cfg"
fi
OUTPUT_FOLDER="${OUTPUT_FOLDER}/${MOCK_CONFIG}"
rm -rf "${OUTPUT_FOLDER}"
MOCK_CONFIG_OPTS="--config-opts='cache_topdir=${CACHE_FOLDER}'"
mkdir -p "${OUTPUT_FOLDER}"
chown -R mockbuilder:mock "${OUTPUT_FOLDER}"
mkdir -p "${CACHE_FOLDER}"
chown -R mockbuilder:mock "${CACHE_FOLDER}"
if [ -n "${NETWORK}" ]
then
MOCK_CONFIG_OPTS="${MOCK_CONFIG_OPTS} --enable-network"
fi
echo "=> Building parameters:"
echo "================================================================="
echo " MOCK_CONFIG: ${MOCK_CONFIG}"
# Priority to SOURCE_RPM if both source and spec file env variable are set
if [ -n "${SOURCE_RPM}" ]
then
echo " SOURCE_RPM: ${SOURCE_RPM}"
echo " OUTPUT_FOLDER: -e${OUTPUT_FOLDER}"
echo "================================================================="
if [ -n "${NO_CLEANUP}" ]
then
echo "${MOCK_BIN} ${MOCK_CONFIG_OPTS} ${DEFINE_CMD} -r ${MOCK_CONFIG} \
--rebuild ${MOUNT_POINT}/${SOURCE_RPM} --resultdir=${OUTPUT_FOLDER} \
--no-clean" > "${OUTPUT_FOLDER}/build-script.sh"
else
echo "${MOCK_BIN} ${MOCK_CONFIG_OPTS} ${DEFINE_CMD} -r ${MOCK_CONFIG} \
--rebuild ${MOUNT_POINT}/${SOURCE_RPM} --resultdir=${OUTPUT_FOLDER}" > \
"${OUTPUT_FOLDER}/build-script.sh"
fi
elif [ -n "${SPEC_FILE}" ]
then
if [ -z "${SOURCES}" ]
then
SOURCES="sources"
mkdir -p "${MOUNT_POINT}/${SOURCES}"
fi
echo " SPEC_FILE: ${SPEC_FILE}"
echo " SOURCES: ${SOURCES}"
echo " OUTPUT_FOLDER: ${OUTPUT_FOLDER}"
echo " MOCK_DEFINES: ${MOCK_DEFINES[*]}"
echo " MOCK_CONFIG_OPTS: ${MOCK_CONFIG_OPTS[*]}"
echo "================================================================="
BUILD_COMMAND="${MOCK_BIN} ${MOCK_CONFIG_OPTS} ${DEFINE_CMD} -r \
${MOCK_CONFIG} --buildsrpm --spec=${MOUNT_POINT}/${SPEC_FILE} \
--resultdir=${OUTPUT_FOLDER} --sources=${MOUNT_POINT}/${SOURCES}"
REBUILD_COMMAND="${MOCK_BIN} ${MOCK_CONFIG_OPTS} ${DEFINE_CMD} -r \
${MOCK_CONFIG} --rebuild \$(find ${OUTPUT_FOLDER} -type f -name \"*.src.rpm\") \
--resultdir=${OUTPUT_FOLDER}"
if [ -n "${NO_CLEANUP}" ]
then
# do not cleanup chroot between both mock calls as 1st does not alter
# it
BUILD_COMMAND="${BUILD_COMMAND} --no-cleanup-after"
REBUILD_COMMAND="${REBUILD_COMMAND} --no-clean"
fi
{
echo "set -e"
echo "${BUILD_COMMAND}"
echo "${REBUILD_COMMAND}"
} >> "${OUTPUT_FOLDER}/build-script.sh"
fi
if [[ "${SOURCES}" == "sources" ]]
then
/usr/bin/rpmbuild --nobuild --define "_topdir ${MOUNT_POINT}/${SOURCES}" \
--define "_sourcedir ${MOUNT_POINT}/${SOURCES}" \
--define "source_date_epoch_from_changelog false" \
--undefine "_disable_source_fetch" "${MOUNT_POINT}/${SPEC_FILE}"
fi
chmod 755 "${OUTPUT_FOLDER}/build-script.sh"
sudo -u mockbuilder "${OUTPUT_FOLDER}/build-script.sh" 2> /dev/stderr
rm "${OUTPUT_FOLDER}/build-script.sh"
if [ -n "${SIGNATURE}" ]
then
echo "%_signature gpg" > "${HOME}/.rpmmacros"
echo "%_gpg_name ${SIGNATURE}" >> "${HOME}/.rpmmacros"
echo "Signing RPM using ${SIGNATURE} key"
find "${OUTPUT_FOLDER}" -type f -name "*.rpm" -exec /rpm-sign.exp {} \
"${GPG_PASS}" \;
else
echo "No RPMs signature requested"
fi
echo "Build finished. Check results inside 'output' directory"