micobu/micobu.sh

118 lines
2.5 KiB
Bash
Executable File

#!/bin/bash
# Chroot instructions
# ArchLinux root via pacstrap, configured with build tools
# User: builduser 1000
BUILD_BASE='/opt/micobu/rootfs/home/builduser/base'
ARTEFACT_BASE='/opt/micobu/rootfs/home/builduser/artefacts'
BUILD_TIMEOUT='600'
API_KEY='mykey'
SERVER_PIPE='/var/tmp/micobu_pipe'
function build() {
NAME="$1"
REPO="$2"
HASH="$3"
BUILD_DIR="$BUILD_BASE/$NAME"
ARTEFACT_DIR="$ARTEFACT_BASE/$NAME/$HASH"
MICOBU_TEMP_NAME="micobu_$NAME_$HASH" # Relative to $BUILD_BASE
if [ -d "$ARTEFACT_DIR" ]; then
echo "$NAME revision $HASH has already been built."
echo "Removing old version"
rm -rf $ARTEFACT_DIR
#return
fi
echo "[env] Building in $BUILD_DIR."
if [ ! -d "$BUILD_DIR" ]; then
echo "[git] Performing initial clone"
mkdir -p $BUILD_DIR
git clone --recurse-submodules "$REPO" "$BUILD_DIR"
cd $BUILD_DIR
else
echo "[git] Updating existing repo."
cd $BUILD_DIR
git fetch
fi
git clean -xdf
git reset --hard
git checkout $HASH
DESCRIPTION="`git describe --all`"
mkdir -p $BUILD_BASE/$MICOBU_TEMP_NAME
cat <<EOF > $BUILD_BASE/micobu_run.sh
#!/bin/bash
cd ~/$NAME
./run.py --no-color
RET=\$?
cd vunit_out/test_output
tar cvJf ~/$MICOBU_TEMP_NAME/artefacts.tar.xz *
exit \$RET
EOF
chmod +x $BUILD_BASE/micobu_run.sh
echo "[sec] Creating jail"
META_DATE_START="`date '+%s'`"
set +e
set -o pipefail
firejail --noprofile --chroot=/opt/micobu-rootfs --net=none --read-write="$BUILD_DIR" env -i HOME=/home/builduser PATH=/bin:/usr/bin "bash" "-c" "timeout $BUILD_TIMEOUT ~/micobu_run.sh" | tee $BUILD_BASE/$MICOBU_TEMP_NAME/log.txt
RET=$?
set +o pipefail
set -e
META_DATE_STOP="`date '+%s'`"
rm $BUILD_BASE/micobu_run.sh
cat <<EOF > $BUILD_BASE/$MICOBU_TEMP_NAME/meta.json
{
"name" : "$NAME",
"url" : "$REPO",
"hash" : "$HASH",
"description" : "$DESCRIPTION",
"time_start" : "$META_DATE_START",
"time_stop" : "$META_DATE_STOP",
"result" : "$RET"
}
EOF
mkdir -p $ARTEFACT_DIR
mv -T $BUILD_BASE/$MICOBU_TEMP_NAME $ARTEFACT_DIR
echo "Stored artefacts in $ARTEFACT_DIR"
find $ARTEFACT_BASE
cat $ARTEFACT_DIR/meta.json
echo ""
if [ $RET -eq 0 ]; then
echo 'BUILD SUCCEEDED!'
else
echo "BUILD FAILED (exit code $RET)!"
fi
return 0
}
function build_s()
{
if [ "$1" != "$API_KEY" ]; then
echo "error: invalid key"
return
fi
shift
echo Starting build of $@
build $@
}
set -e
[ ! -p "$SERVER_PIPE" ] && mkfifo "$SERVER_PIPE"
while true; do
args=`cat $SERVER_PIPE | sed -n 's/\([a-zA-Z0-9]\+\) \([a-zA-Z0-9]\+\) \([a-zA-Z0-9:\-_\/\.]\+\) \([a-z0-9]\+\)/\1 \2 \3 \4/p'`
build_s $args
done