328 lines
15 KiB
Bash
Executable File
328 lines
15 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
docker_init_mock() {
|
|
local CONFIG_CONTENT_BASE64=$(echo "${CONFIG_CONTENT}" | base64 -w0)
|
|
docker run ${DOCKER_OPTS} --privileged --rm \
|
|
-v ${CACHE_DIR}:/var/cache/mock ${CONTAINER_NAME} \
|
|
bash ${BASH_OPTS} -c "
|
|
mkdir -p /var/cache/mock/configs
|
|
[ ! -f /var/cache/mock/configs/logging.ini ] \
|
|
&& cp /etc/mock/logging.ini /var/cache/mock/configs/
|
|
rm -rf /etc/mock
|
|
ln -s /var/cache/mock/configs /etc/mock
|
|
conffile=/etc/mock/${DIST}.cfg
|
|
tmpconffile=/etc/mock/tmp.${DIST}.cfg
|
|
rootpath=/var/cache/mock/$ROOT_NAME
|
|
tmprootpath=/var/cache/mock/tmp.$ROOT_NAME
|
|
[ -f \$conffile ] && mv \$conffile \$tmpconffile
|
|
[ -d \$rootpath ] && mv \$rootpath \$tmprootpath
|
|
echo \"${CONFIG_CONTENT_BASE64}\" \
|
|
| base64 -d > \$conffile
|
|
echo 'Current config file:'
|
|
cat \$conffile
|
|
chown -R abuild:mock /var/cache/mock
|
|
chmod g+s /var/cache/mock
|
|
if su - abuild -c \
|
|
'mock -r ${DIST} ${MOCK_OPTS} --init'
|
|
then
|
|
rm -rf \$tmprootpath \$tmpconffile
|
|
else
|
|
rm -rf \$conffile \$rootpath
|
|
[ -d \$tmprootpath ] && mv \$tmprootpath \$rootpath
|
|
[ -f \$tmpconffile ] && mv \$tmpconffile \$conffile
|
|
fi"
|
|
}
|
|
|
|
docker_init_sbuild() {
|
|
local MIRROR=$(echo "${APT_SOURCES_CONTENT}" | fgrep deb | head -1 | awk '{print $2}')
|
|
local APT_SOURCES_CONTENT_BASE64=$(echo "$APT_SOURCES_CONTENT" | base64 -w0)
|
|
docker run ${DOCKER_OPTS} --privileged --rm \
|
|
-v ${CACHE_DIR}:/srv/images ${CONTAINER_NAME} \
|
|
bash ${BASH_OPTS} -c "
|
|
mkdir -p /srv/images/chroot.d
|
|
rm -rf /etc/schroot/chroot.d
|
|
ln -s /srv/images/chroot.d /etc/schroot/chroot.d
|
|
conffile=/etc/schroot/chroot.d/$ROOT_NAME
|
|
tmpconffile=/etc/schroot/chroot.d/tmp.$ROOT_NAME
|
|
rootpath=/srv/images/$ROOT_NAME
|
|
tmprootpath=/srv/images/tmp.$ROOT_NAME
|
|
[ -f \$conffile ] && mv \$conffile \$tmpconffile
|
|
[ -d \$rootpath ] && mv \$rootpath \$tmprootpath
|
|
if sbuild-createchroot ${DIST} \$rootpath ${MIRROR}
|
|
then
|
|
mv \${conffile}* \$conffile
|
|
echo 'union-type=aufs' >> \$conffile
|
|
echo $APT_SOURCES_CONTENT_BASE64 | base64 -d \
|
|
> \${rootpath}/etc/apt/sources.list
|
|
echo '#!/bin/bash' > \${rootpath}/usr/bin/apt-add-repo
|
|
echo 'echo \$* >> /etc/apt/sources.list' >> \${rootpath}/usr/bin/apt-add-repo
|
|
chmod +x \${rootpath}/usr/bin/apt-add-repo
|
|
echo '#!/bin/bash' > \${rootpath}/usr/bin/set-apt-prefs
|
|
echo 'echo \$* | base64 -d > /etc/apt/preferences' >> \${rootpath}/usr/bin/set-apt-prefs
|
|
chmod +x \${rootpath}/usr/bin/set-apt-prefs
|
|
if sbuild-update -udcar ${DIST}
|
|
then
|
|
rm -rf \$tmprootpath \$tmpconffile
|
|
else
|
|
rm -rf \$conffile \$rootpath
|
|
[ -d \$tmprootpath ] && mv \$tmprootpath \$rootpath
|
|
[ -f \$tmpconffile ] && mv \$tmpconffile \$conffile
|
|
fi
|
|
else
|
|
rm -rf \$conffile \$rootpath
|
|
[ -d \$tmprootpath ] && mv \$tmprootpath \$rootpath
|
|
[ -f \$tmpconffile ] && mv \$tmpconffile \$conffile
|
|
fi"
|
|
}
|
|
|
|
docker_update_mock() {
|
|
docker run ${DOCKER_OPTS} --privileged --rm \
|
|
-v ${CACHE_DIR}:/var/cache/mock ${CONTAINER_NAME} \
|
|
bash ${BASH_OPTS} -c "
|
|
rm -rf /etc/mock
|
|
mkdir -p /var/cache/mock/configs
|
|
ln -s /var/cache/mock/configs /etc/mock
|
|
conffile=/etc/mock/${DIST}.cfg
|
|
tmpconffile=/etc/mock/tmp.${DIST}.cfg
|
|
rootpath=/var/cache/mock/$ROOT_NAME
|
|
tmprootpath=/var/cache/mock/tmp.$ROOT_NAME
|
|
cp -Rl \$rootpath \$tmprootpath
|
|
cp \$conffile \$tmpconffile
|
|
rm -rf \${rootpath}/yum_cache
|
|
touch \$conffile -r \${rootpath}/root_cache/cache.tar.gz
|
|
echo 'Current config file:'
|
|
cat \$conffile
|
|
chown -R abuild:mock \$rootpath
|
|
chmod g+s \$rootpath
|
|
if su - abuild -c \
|
|
'mock -r ${DIST} ${MOCK_OPTS} --update'
|
|
then
|
|
rm -rf \$tmprootpath \$tmpconffile
|
|
else
|
|
rm -rf \$rootpath \$conffile
|
|
mv \$tmpconffile \$conffile
|
|
mv \$tmprootpath \$rootpath
|
|
fi"
|
|
}
|
|
|
|
docker_update_sbuild() {
|
|
local MIRROR=$(echo "${APT_SOURCES_CONTENT}" | fgrep deb | head -1 | awk '{print $2}')
|
|
local APT_SOURCES_CONTENT_BASE64=$(echo "${APT_SOURCES_CONTENT}" | base64 -w0)
|
|
docker run ${DOCKER_OPTS} --privileged --rm \
|
|
-v ${CACHE_DIR}:/srv/images ${CONTAINER_NAME} \
|
|
bash ${BASH_OPTS} -c "
|
|
mkdir -p /srv/images/chroot.d
|
|
rm -rf /etc/schroot/chroot.d
|
|
ln -s /srv/images/chroot.d /etc/schroot/chroot.d
|
|
rootpath=/srv/images/$ROOT_NAME
|
|
tmprootpath=/srv/images/tmp.$ROOT_NAME
|
|
cp -Rl \$rootpath \$tmprootpath
|
|
echo ${APT_SOURCES_CONTENT_BASE64} | base64 -d \
|
|
> \${rootpath}/etc/apt/sources.list
|
|
if sbuild-update -udcar ${DIST}
|
|
then
|
|
rm -rf \$tmprootpath
|
|
else
|
|
rm -rf \$rootpath
|
|
mv \$tmprootpath \$rootpath
|
|
fi"
|
|
}
|
|
|
|
docker_build_mock() {
|
|
[ $(ls -1 ${SOURCE_PATH}/*.{src.rpm,spec} 2>/dev/null | wc -l) -eq 0 ] \
|
|
&& fail_exit "ERROR: No RPM sources found at ${SOURCE_PATH}"
|
|
## Parse additional repositories
|
|
for repo in ${repos[@]} ; do
|
|
local reponame=$(mktemp -u XXXXXXXX)
|
|
local repourl=${repo%%,*}
|
|
local priority=${repo##*,}
|
|
if [ "$priority" == "$repourl" ] ; then
|
|
unset priority
|
|
else
|
|
priority="priority=$priority\n"
|
|
fi
|
|
local ADD_REPO_CMD="$ADD_REPO_CMD -e \"/^\[base\]/i[${reponame}]\nname=${reponame}\nbaseurl=${repourl}\ngpgcheck=0\nenabled=1\nskip_if_unavailable=1\n${priority}\""
|
|
done
|
|
[ ${#repos[@]} -gt 0 ] \
|
|
&& ADD_REPO_CMD="sed $ADD_REPO_CMD -i /etc/mock/${DIST}.cfg"
|
|
##
|
|
|
|
[ "$KEEP_CHROOT" == "true" ] \
|
|
&& local DOCKER_OPTS="${DOCKER_OPTS} -v ${ROOT_DIR}:/var/lib/mock"
|
|
|
|
local CLEANUP_SCRIPT=$(cat ${BIN_DIR}/functions/cleanup-functions | base64 -w0)
|
|
|
|
docker run ${DOCKER_OPTS} --privileged --rm \
|
|
-v ${CACHE_DIR}:/srv/mock/cache:ro \
|
|
-v ${SOURCE_PATH}:/home/abuild/rpmbuild \
|
|
-v ${DEST_PATH}:/home/abuild/buildresult \
|
|
${CONTAINER_NAME} \
|
|
bash ${BASH_OPTS} -c "
|
|
echo ${CLEANUP_SCRIPT} | base64 -d > /cleanup
|
|
sed -e 's|%ROOT_NAME%|${ROOT_NAME}|g' \
|
|
-e 's|%TYPE%|${TYPE}|g' \
|
|
-e 's|%UNAME%|${UNAME}|g' \
|
|
-e 's|%GNAME%|${GNAME}|g' \
|
|
-i /cleanup
|
|
source /cleanup
|
|
rm -rf /var/lib/mock/${ROOT_NAME}
|
|
mkdir -p /srv/tmpfs/cache
|
|
mount -t tmpfs overlay /srv/tmpfs/cache
|
|
mount -t aufs -o br=/srv/tmpfs/cache:/srv/mock/cache \
|
|
none /var/cache/mock
|
|
rm -rf /etc/mock
|
|
ln -s /var/cache/mock/configs /etc/mock
|
|
${ADD_REPO_CMD}
|
|
touch /etc/mock/${DIST}.cfg -r \
|
|
/var/cache/mock/${ROOT_NAME}/root_cache/cache.tar.gz
|
|
echo 'Current config file:'
|
|
cat /etc/mock/${DIST}.cfg
|
|
chown -R abuild.mock /home/abuild
|
|
rm -rf /var/cache/mock/${ROOT_NAME}/yum_cache
|
|
ulimit -n 10000
|
|
su - abuild -c 'mock -r ${DIST} ${MOCK_OPTS} --update'
|
|
if [ x${KEEP_CHROOT} = xtrue ] ; then
|
|
sed -i /etc/mock/${DIST}.cfg -e '/tmpfs_enable/s|True|False|'
|
|
mkdir -p /var/lib/mock/${ROOT_NAME}/root
|
|
tar -xf /var/cache/mock/${ROOT_NAME}/root_cache/cache.tar.gz \
|
|
-C /var/lib/mock/${ROOT_NAME}/root
|
|
fi
|
|
[ \$(ls /home/abuild/rpmbuild/*.src.rpm 2>/dev/null | wc -l) -eq 0 ] \
|
|
&& su - abuild -c 'mock -r ${DIST} --no-clean \
|
|
--no-cleanup-after --buildsrpm \
|
|
--sources=/home/abuild/rpmbuild \
|
|
--spec=\$(ls /home/abuild/rpmbuild/*.spec) \
|
|
--resultdir=/home/abuild/rpmbuild ${MOCK_OPTS}'
|
|
rm -rf /home/abuild/rpmbuild/build
|
|
su - abuild -c 'mock -r ${DIST} --no-clean \
|
|
--no-cleanup-after ${MOCK_OPTS} \
|
|
--resultdir=/home/abuild/buildresult \
|
|
\$(ls /home/abuild/rpmbuild/*.src.rpm)'
|
|
echo \$? > /home/abuild/buildresult/exitstatus"
|
|
}
|
|
|
|
docker_build_sbuild() {
|
|
find ${SOURCE_PATH} | egrep "(debian/rules|\.dsc)$" &>/dev/null \
|
|
|| fail_exit "ERROR: No DEB sources found at ${SOURCE_PATH}"
|
|
local SOURCE_TARGET=$(find ${SOURCE_PATH} | egrep "(debian/rules|\.dsc)$" | head -1 2>/dev/null)
|
|
[ "${SOURCE_TARGET##*/}" == "rules" ] \
|
|
&& SOURCE_TARGET=$(basename $(dirname $(dirname ${SOURCE_TARGET})))/ \
|
|
|| SOURCE_TARGET=$(basename ${SOURCE_TARGET})
|
|
## Parse additional repositories
|
|
for repo_id in $(seq 0 $(( ${#repos[@]} - 1 ))) ; do
|
|
ADD_REPO_CMD="${ADD_REPO_CMD} --chroot-setup-commands=\"apt-add-repo deb ${repos[${repo_id}]}\" "
|
|
done
|
|
## Parse Apt pinning options
|
|
unset PIN_CONTENT
|
|
if [ ${#pins[@]} -gt 0 ] ; then
|
|
for pin_id in $(seq 0 $(( ${#pins[@]} - 1 ))) ; do
|
|
local PIN_CONTENT="${PIN_CONTENT}Package: ${pinpkgs[${pin_id}]}\nPin: ${pins[${pin_id}]}\nPin-Priority: ${pinprios[${pin_id}]}\n"
|
|
done
|
|
fi
|
|
unset PIN_CONTENT_BASE64
|
|
[ -n "${PIN_CONTENT}" ] \
|
|
&& PIN_CONTENT_BASE64=$(echo -e "${PIN_CONTENT}" | base64 -w0)
|
|
unset SET_APT_PREFS_CMD
|
|
[ -n "${PIN_CONTENT_BASE64}" ] \
|
|
&& local SET_APT_PREFS_CMD="--chroot-setup-commands=\"set-apt-prefs ${PIN_CONTENT_BASE64}\""
|
|
##
|
|
local SBUILD_OPTS="--nolog --source --force-orig-source"
|
|
if [ "$KEEP_CHROOT" = "true" ] ; then
|
|
local DOCKER_OPTS="${DOCKER_OPTS} -v ${ROOT_DIR}/${ROOT_NAME}:/srv/overlay"
|
|
local SBUILD_OPTS="${SBUILD_OPTS} --purge-build=never --purge-session=never"
|
|
local SBUILD_OPTS=${SBUILD_OPTS/--force-orig-source/}
|
|
fi
|
|
|
|
local CLEANUP_SCRIPT=$(cat ${BIN_DIR}/functions/cleanup-functions | base64 -w0)
|
|
docker run ${DOCKER_OPTS} --privileged --rm \
|
|
-v ${CACHE_DIR}:/srv/images:ro \
|
|
-v ${SOURCE_PATH}:/srv/source \
|
|
-v ${DEST_PATH}:/srv/build \
|
|
${CONTAINER_NAME} \
|
|
bash ${BASH_OPTS} -c "
|
|
echo ${CLEANUP_SCRIPT} | base64 -d > /cleanup
|
|
sed -e 's|%ROOT_NAME%|${ROOT_NAME}|g' \
|
|
-e 's|%TYPE%|${TYPE}|g' \
|
|
-e 's|%UNAME%|${UNAME}|g' \
|
|
-e 's|%GNAME%|${GNAME}|g' \
|
|
-i /cleanup
|
|
source /cleanup
|
|
rm -rf /etc/schroot/chroot.d
|
|
ln -s /srv/images/chroot.d /etc/schroot/chroot.d
|
|
ulimit -n 10000
|
|
( sed -i /usr/bin/sbuild -e '/debian\/rules/d'
|
|
DEB_BUILD_OPTIONS=nocheck /usr/bin/sbuild -d ${DIST} \
|
|
${SBUILD_OPTS} \
|
|
${ADD_REPO_CMD} \
|
|
${SET_APT_PREFS_CMD} \
|
|
--chroot-setup-commands=\"apt-get update\" \
|
|
--chroot-setup-commands=\"apt-get upgrade -f -y --force-yes\" \
|
|
/srv/source/${SOURCE_TARGET} 2>&1
|
|
echo \$? > /srv/build/exitstatus ) \
|
|
| tee /srv/build/buildlog.sbuild
|
|
if [ x$KEEP_CHROOT = xtrue ] ; then
|
|
rm -rf /srv/overlay/*
|
|
SESSION=\$(schroot --info --all-sessions | grep \"^ Name\" | awk '{print \$2}')
|
|
cp -R /var/lib/schroot/union/overlay/\${SESSION}/* /srv/overlay
|
|
cp -R /var/lib/schroot/mount/\${SESSION}/build /srv/overlay/
|
|
fi"
|
|
}
|
|
|
|
docker_shell_mock() {
|
|
local CLEANUP_SCRIPT=$(cat ${BIN_DIR}/functions/cleanup-functions | base64 -w0)
|
|
local DOCKER_OPTS="${DOCKER_OPTS} -v ${ROOT_DIR}:/var/lib/mock"
|
|
docker run ${DOCKER_OPTS} -ti --privileged --rm \
|
|
-v ${CACHE_DIR}:/var/cache/mock:ro \
|
|
${CONTAINER_NAME} \
|
|
bash ${BASH_OPTS} -c "
|
|
echo ${CLEANUP_SCRIPT} | base64 -d > /cleanup
|
|
sed -e 's|%ROOT_NAME%|${ROOT_NAME}|g' \
|
|
-e 's|%TYPE%|${TYPE}|g' \
|
|
-e 's|%UNAME%|${UNAME}|g' \
|
|
-e 's|%GNAME%|${GNAME}|g' \
|
|
-i /cleanup
|
|
source /cleanup
|
|
mkdir -p /var/lib/mock/${ROOT_NAME}/root/{proc,sys,dev/{shm,pts},var/cache/yum,tmp/ccache}
|
|
mount -n -t proc proc /var/lib/mock/${ROOT_NAME}/root/proc
|
|
mount -n -t sysfs sysfs /var/lib/mock/${ROOT_NAME}/root/sys
|
|
mount -n -t tmpfs tmpfs /var/lib/mock/${ROOT_NAME}/root/dev/shm
|
|
mount -n -t devpts -o gid=5,mode=0620,ptmxmode=0666,newinstance devpts /var/lib/mock/${ROOT_NAME}/root/dev/pts
|
|
mount -n --bind /var/cache/mock/${ROOT_NAME}/yum_cache/ /var/lib/mock/${ROOT_NAME}/root/var/cache/yum
|
|
mount -n --bind /var/cache/mock/${ROOT_NAME}/ccache/u1000/ /var/lib/mock/${ROOT_NAME}/root/tmp/ccache
|
|
chroot /var/lib/mock/${ROOT_NAME}/root \
|
|
/bin/bash -c 'export LANG=en_US.UTF-8
|
|
export HOME=/builddir
|
|
export CCACHE_DIR=/tmp/ccache
|
|
export CCACHE_UMASK=002
|
|
cd \${HOME}/build
|
|
bash'"
|
|
}
|
|
|
|
docker_shell_sbuild() {
|
|
local DOCKER_OPTS="${DOCKER_OPTS} -v ${ROOT_DIR}:/srv/overlay"
|
|
local CLEANUP_SCRIPT=$(cat ${BIN_DIR}/functions/cleanup-functions | base64 -w0)
|
|
docker run ${DOCKER_OPTS} -ti --privileged --rm \
|
|
-v ${CACHE_DIR}:/srv/images:ro \
|
|
-v ${DEST_PATH}:/srv/build \
|
|
${CONTAINER_NAME} \
|
|
bash ${BASH_OPTS} -c "
|
|
echo ${CLEANUP_SCRIPT} | base64 -d > /cleanup
|
|
sed -e 's|%ROOT_NAME%|${ROOT_NAME}|g' \
|
|
-e 's|%TYPE%|${TYPE}|g' \
|
|
-e 's|%UNAME%|${UNAME}|g' \
|
|
-e 's|%GNAME%|${GNAME}|g' \
|
|
-i /cleanup
|
|
source /cleanup
|
|
mkdir -p /srv/root
|
|
mount -t aufs -o br=/srv/overlay/${ROOT_NAME}:/srv/images/${ROOT_NAME} \
|
|
none /srv/root
|
|
mount -n -t proc proc /srv/root/proc
|
|
mount -n -t sysfs sysfs /srv/root/sys
|
|
mount -n -t tmpfs tmpfs /srv/root/dev/shm
|
|
mount -n -t devpts -o gid=5,mode=0620,ptmxmode=0666,newinstance devpts /srv/root/dev/pts
|
|
chroot /srv/root \
|
|
/bin/bash -c '
|
|
cd /build/*/
|
|
bash'"
|
|
}
|