fuel-mirror/perestroika/functions/docker-functions

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'"
}