#!/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 < $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 < $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