[Tarantool-patches] [PATCH v1] gitlab-ci: add script for VBOX VMs orchestrate

Alexander Tikhonov avtikhon at tarantool.org
Mon Jan 20 15:59:05 MSK 2020



Oleg,

Please review the patch.

>Вторник,  3 декабря 2019, 13:34 +03:00 от Alexander V. Tikhonov <avtikhon at tarantool.org>:
>
>Added 'tools/run_vm.sh' script for VBOX VMs orchestrate.
>It starts the VM on the local host at the previously
>prepared configurations. It uses the template in options:
>  osx_13_*|osx_14_*|freebsd_12_*
>to be able to choose free VM from the list:
>  osx_13_[1-X]|osx_14_*[1-X]|freebsd_12_[1-X]
>
>Gitlab-ci orchestrator chooses the host, where it's job can
>be run, so to make it always workable without delays in
>waiting the free VMs by the new local orchestrator script,
>the limit of the overall started jobs must be not bigger
>than requested template can find the appropriate VMs on the
>host. Each of the template can use up to X pre-configured
>VMs, so the gitlab-runner configuration file:
>  /etc/gitlab-runner/config.toml
>has common configuration option:
>  concurrent = X
>and each gitlab runner has limit option:
>  limit = X
>X value should be manually found by testing at each used host.
>---
>
>Github:  https://github.com/tarantool/tarantool/tree/avtikhon/vms-orchestrate
>
> .gitlab-ci.yml  |  30 ++-------
> .gitlab.mk      |  15 +----
> tools/run_vm.sh | 176 ++++++++++++++++++++++++++++++++++++++++++++++++
> 3 files changed, 185 insertions(+), 36 deletions(-)
> create mode 100755 tools/run_vm.sh
>
>diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
>index cf13c382e..4542f8d75 100644
>--- a/.gitlab-ci.yml
>+++ b/.gitlab-ci.yml
>@@ -42,10 +42,8 @@ variables:
> 
> .vbox_template: &vbox_definition
>   stage: test
>-  before_script:
>-    - ${GITLAB_MAKE} vms_start
>-  after_script:
>-    - ${GITLAB_MAKE} vms_shutdown
>+  tags:
>+    - vms_test
> 
> # Tests
> 
>@@ -93,47 +91,31 @@ release_asan_clang8:
> osx_13_release:
>   <<: *release_only_definition
>   <<: *vbox_definition
>-  tags:
>-    - vms_osx_13
>   variables:
>-    VMS_NAME: 'osx_13'
>-    VMS_USER: 'tarantool'
>-    VMS_PORT: '2212'
>+    VMS_NAME: 'osx_13_*'
>   script:
>     - ${GITLAB_MAKE} vms_test_osx
> 
> osx_14_release:
>   <<: *vbox_definition
>-  tags:
>-    - vms_osx_14
>   variables:
>-    VMS_NAME: 'osx_14'
>-    VMS_USER: 'tarantool'
>-    VMS_PORT: '2222'
>+    VMS_NAME: 'osx_14_*'
>   script:
>     - ${GITLAB_MAKE} vms_test_osx
> 
> osx_14_release_lto:
>   <<: *release_only_definition
>   <<: *vbox_definition
>-  tags:
>-    - vms_osx_14
>   variables:
>     EXTRA_ENV: "export CMAKE_EXTRA_PARAMS=-DENABLE_LTO=ON ;"
>-    VMS_NAME: 'osx_14'
>-    VMS_USER: 'tarantool'
>-    VMS_PORT: '2222'
>+    VMS_NAME: 'osx_14_*'
>   script:
>     - ${GITLAB_MAKE} vms_test_osx
> 
> freebsd_12_release:
>   <<: *vbox_definition
>-  tags:
>-    - vms_freebsd_12
>   variables:
>-    VMS_NAME: 'freebsd_12'
>-    VMS_USER: 'vagrant'
>-    VMS_PORT: '2232'
>+    VMS_NAME: 'freebsd_12_*'
>     MAKE: 'gmake'
>   script:
>     - ${GITLAB_MAKE} vms_test_freebsd
>diff --git a/.gitlab.mk b/.gitlab.mk
>index 48a92e518..863d5fdf7 100644
>--- a/.gitlab.mk
>+++ b/.gitlab.mk
>@@ -82,21 +82,12 @@ docker_bootstrap:
> # Run tests under a virtual machine
> # #################################
> 
>-vms_start:
>-	VBoxManage controlvm ${VMS_NAME} poweroff || true
>-	VBoxManage snapshot ${VMS_NAME} restore ${VMS_NAME}
>-	VBoxManage startvm ${VMS_NAME} --type headless
>-
> vms_test_%:
>-	tar czf - ../tarantool | ssh ${VMS_USER}@127.0.0.1 -p ${VMS_PORT} tar xzf -
>-	ssh ${VMS_USER}@127.0.0.1 -p ${VMS_PORT} "/bin/bash -c \
>-		'${EXTRA_ENV} \
>+	./tools/run_vm.sh -t=${VMS_NAME} -s -a=try_restore,start,login,stop \
>+		-c="${EXTRA_ENV} \
> 		cd tarantool && \
> 		${GITLAB_MAKE} git_submodule_update && \
>-		${TRAVIS_MAKE} $(subst vms_,,$@)'"
>-
>-vms_shutdown:
>-	VBoxManage controlvm ${VMS_NAME} poweroff
>+		${TRAVIS_MAKE} $(subst vms_,,$@)"
> 
> # ########################
> # Build RPM / Deb packages
>diff --git a/tools/run_vm.sh b/tools/run_vm.sh
>new file mode 100755
>index 000000000..abe409441
>--- /dev/null
>+++ b/tools/run_vm.sh
>@@ -0,0 +1,176 @@
>+#!/bin/bash
>+
>+set -e
>+
>+usage() {
>+    echo "Usage: $0 -t=<freebsd_12[_*]|osx_1[34][_*]> [-a=<download,install,restore,start,login,snapshot,stop>] [-c=<command to run in VM>]"
>+}
>+
>+NAME=
>+choose_vm() {
>+    os_dist=$1
>+    all_vms=`VBoxManage list vms | awk -F '"' '{print $2}' | sort | grep "^${os_dist}_[1-9]*$" || true`
>+    if [ "$all_vms" == "" ]; then
>+        echo "ERROR: the VM for the given os=$os and dist=$dist by pattern '^${os_dist}_[1-9]*\$' is not available"
>+        usage
>+        exit 1
>+    fi
>+    run_vms=`VBoxManage list runningvms | awk -F '"' '{print $2}' | sort | grep "^${os_dist}_[1-9]*$" || true`
>+    for vm in $all_vms ; do
>+        used=0
>+        for rvm in $run_vms ; do
>+            if [ "$vm" == "$rvm" ]; then
>+                used=1
>+                break
>+            fi
>+        done
>+
>+        # let's setup the lock the file which will pause the
>+        # next job till the current job will start the VM:
>+        # lockfile will hold the current VM for 10 seconds
>+        # to start up the VM in this delay, while next job
>+        # will wait for 30 seconds for the lockfile released
>+        # to recheck the VM, otherwise it will try to find
>+        # the other free VM
>+        lfile=/tmp/$vm
>+        lockfile -1 -r 30 -l 10 $lfile
>+        if [ "$used" == "0" ] && ! VBoxManage list runningvms | awk -F '"' '{print $2}' | grep "^${vm}$" ; then
>+            NAME=$vm
>+            echo "Found free VM: $NAME"
>+            break
>+        fi
>+    done
>+    if [ "$NAME" == "" ]; then
>+        echo "WARNING: all of the appropriate VMs are in use!"
>+        echo "VMs: $all_vms"
>+    fi
>+}
>+
>+SCP_LOCAL_SOURCES=0
>+for i in "$@"
>+do
>+case $i in
>+    -s|--scp_local_sources)
>+    SCP_LOCAL_SOURCES=1
>+    ;;
>+    -t=*|--template=*)
>+    TEMPLATE="${i#*=}"
>+    shift # past argument=value
>+    ;;
>+    -a=*|--actions=*)
>+    ACTIONS="${i#*=}"
>+    shift # past argument=value
>+    ;;
>+    -c=*|--command=*)
>+    COMMAND="${i#*=}"
>+    shift # past argument=value
>+    ;;
>+    -h|--help)
>+    usage
>+    exit 0
>+    ;;
>+    *)
>+    usage
>+    exit 1
>+    ;;
>+esac
>+done
>+
>+if [[ $TEMPLATE =~ .*_.*_\* ]]; then
>+    while [ 1 ]; do
>+        choose_vm $TEMPLATE
>+        if [ "$NAME" != "" ]; then
>+            break
>+        fi
>+        echo "INFO: wait a minute to recheck for the free VM ..."
>+        sleep 60
>+    done
>+else
>+    NAME=$TEMPLATE
>+fi
>+
>+if [ "$ACTIONS" == "" ]; then
>+    ACTIONS=restore,start,login,stop
>+    echo "WARNING: actions to start was not set: using default '$ACTIONS'"
>+    echo
>+fi
>+
>+if [[ $ACTIONS =~ .*download.* ]]; then
>+    echo "Images drives and configuration can be downloaded from:"
>+    echo "  https://mcs.mail.ru/app/services/storage/bucket/objects/packages/?Prefix=testing%2Fvms%2F "
>+
>+    # download the files
>+    for ftype in .ovf .mf -disk001.vmdk; do
>+        file=${NAME}$ftype
>+        wget -O - " https://download.tarantool.io/testing/vms/$file " >/tmp/$file
>+    done
>+fi
>+
>+if [[ $ACTIONS =~ .*install.* ]]; then
>+    echo "Unregister the old VM with the same name"
>+    VBoxManage unregistervm $NAME --delete 2>/dev/null || true
>+
>+    echo "Register the VM"
>+    VBoxManage import /tmp/${NAME}.ovf
>+fi
>+
>+if [[ $ACTIONS =~ .*restore.* ]]; then
>+    echo "Restore the virtual machine snapshot"
>+    if ! VBoxManage snapshot $NAME restore $NAME ; then
>+        if ! [[ $ACTIONS =~ .*try_restore.* ]]; then
>+            exit 1
>+        fi
>+        echo "WARNING: the restore action failed, but it was expected - continuing"
>+    fi
>+fi
>+
>+if [[ $ACTIONS =~ .*start.* ]]; then
>+    echo "Start the virtual machine without GUI"
>+    VBoxManage startvm $NAME --type headless
>+fi
>+
>+exit_code=0
>+if [[ $ACTIONS =~ .*login.* ]]; then
>+    if [[ $NAME =~ freebsd_.* ]] ; then
>+        VMUSER=vagrant
>+    else
>+        VMUSER=tarantool
>+    fi
>+
>+    host="${VMUSER}@127.0.0.1"
>+    ssh="ssh $host -p "`VBoxManage showvminfo $NAME | grep "host port = " \
>+	    | sed 's#.* host port = ##g' | sed 's#,.*##g'`
>+
>+    echo "Try to ssh into the virtual machine"
>+    i=0
>+    while [[ $i -lt 1000 ]] || exit 1 ; do
>+        if $ssh "exit 0" ; then
>+            break
>+        fi
>+        echo "The host is not ready, let's wait a little to recheck ..."
>+        i=$(($i+1))
>+        sleep 10
>+    done
>+    if [ "$SCP_LOCAL_SOURCES" == "1" ]; then
>+        $ssh "cd ~ && rm -rf tarantool"
>+        tar czf - ../tarantool | $ssh tar xzf -
>+    fi
>+    if [ "$COMMAND" == "" ]; then
>+        $ssh || exit_code=$?
>+    else
>+        $ssh "$COMMAND" || exit_code=$?
>+    fi
>+    echo "The task exited with code: $exit_code"
>+fi
>+
>+if [[ $ACTIONS =~ .*snapshot.* ]]; then
>+    echo "Take the virtual machine snapshot"
>+    VBoxManage snapshot $NAME delete $NAME 2>/dev/null || true
>+    VBoxManage snapshot $NAME take $NAME --pause
>+fi
>+
>+if [[ $ACTIONS =~ .*stop.* ]]; then
>+    VBoxManage controlvm $NAME poweroff
>+fi
>+
>+exit $exit_code
>-- 
>2.17.1
>


-- 
Alexander Tikhonov
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.tarantool.org/pipermail/tarantool-patches/attachments/20200120/8243e294/attachment.html>


More information about the Tarantool-patches mailing list