3894: Use gem install --user-install to avoid sudo/rvm requirement
[arvados-dev.git] / jenkins / run-tests.sh
index d9e6db1d46b063eb9564bedf9771cfc217b88355..44bb60392d2f015d698453f4568acd0007fd19d5 100755 (executable)
@@ -7,16 +7,39 @@
 # Arguments:
 # --skip FOO     Do not test the FOO component.
 # --only FOO     Do not test anything except the FOO component.
+# WORKSPACE=path Arvados source tree to test.
+# CONFIGSRC=path Dir with api server config files to copy into source tree.
 # envvar=value   Set $envvar to value
 #
 # Regardless of which components are tested, install all components in
 # the usual sequence. (Many test suites depend on other components
 # being installed.)
 #
-# Useful environment variables include $workbench_test, $apiserver_test and
-# $cli_test.  To run a specific test, use a command line such as:
+# To run a specific Ruby test, set $workbench_test, $apiserver_test or
+# $cli_test on the command line:
 #
-# $ ./run-tests.sh --only workbench workbench_test=TEST=test/integration/pipeline_instances_test.rb
+# $ run-tests.sh --only workbench workbench_test=TEST=test/integration/pipeline_instances_test.rb
+#
+#
+# To run a specific Python test set $python_sdk_test or $fuse_test.
+#
+# $ run-tests.sh --only python_sdk python_sdk_test="--test-suite tests.test_keep_locator"
+#
+#
+# You can also pass "export ARVADOS_DEBUG=1" to enable additional debugging output:
+#
+# $ run-tests.sh "export ARVADOS_DEBUG=1"
+#
+#
+# Finally, you can skip the installation steps on subsequent runs this way:
+#
+## First run
+# $ run-tests.sh --leave-temp
+#
+## Subsequent runs: record the values of VENVDIR and GOPATH from the first run, and
+# provide them on the command line in subsequent runs:
+#
+# $ run-tests.sh --skip-install VENVDIR="/tmp/tmp.y3tsTmigio" GOPATH="/tmp/tmp.3r4sSA9F3l"
 
 
 # First make sure to remove any ARVADOS_ variables from the calling environment
@@ -25,13 +48,43 @@ unset $(env | cut -d= -f1 | grep \^ARVADOS_)
 
 COLUMNS=80
 
-export GOPATH=$(mktemp -d)
-VENVDIR=$(mktemp -d)
+GITDIR=
+GOPATH=
+VENVDIR=
+PYTHONPATH=
 cli_test=
 workbench_test=
 apiserver_test=
+python_sdk_test=
+ruby_sdk_test=
+fuse_test=
+leave_temp=
+skip_install=
 
-source /etc/profile.d/rvm.sh
+if [[ -f /etc/profile.d/rvm.sh ]]
+then
+    source /etc/profile.d/rvm.sh
+fi
+
+declare -A leave_temp
+clear_temp() {
+    leaving=""
+    for var in VENVDIR GOPATH GITDIR
+    do
+        if [[ -z "${leave_temp[$var]}" ]]
+        then
+            if [[ -n "${!var}" ]]
+            then
+                rm -rf "${!var}"
+            fi
+        else
+            leaving+=" $var=\"${!var}\""
+        fi
+    done
+    if [[ -z "$leaving" ]]; then
+        echo "Leaving behind temp dirs: $leaving"
+    fi
+}
 
 fatal() {
     clear_temp
@@ -39,18 +92,6 @@ fatal() {
     exit 1
 }
 
-# Sanity check
-echo "WORKSPACE=$WORKSPACE"
-[[ -n "$WORKSPACE" ]] || fatal "WORKSPACE not set"
-
-# Set up temporary install dirs
-mkdir -p "$GOPATH/src/git.curoverse.com"
-ln -sfn "$WORKSPACE" "$GOPATH/src/git.curoverse.com/arvados.git" \
-    || fatal "symlink failed"
-
-virtualenv --setuptools "$VENVDIR" || fatal "virtualenv $VENVDIR failed"
-PATH="$VENVDIR/bin:$PATH"
-
 declare -a failures
 declare -A skip
 
@@ -72,10 +113,11 @@ do
             skip_install=1
             ;;
         --leave-temp)
-            leave_temp=1
+            leave_temp[VENVDIR]=1
+            leave_temp[GOPATH]=1
             ;;
         *=*)
-            eval $arg
+            eval $(echo $arg | cut -d= -f1)=\"$(echo $arg | cut -d= -f2-)\"
             ;;
         *)
             echo >&2 "$0: Unrecognized option: '$arg'"
@@ -84,6 +126,36 @@ do
     esac
 done
 
+# Sanity check
+echo "WORKSPACE=$WORKSPACE"
+[[ -n "$WORKSPACE" ]] || fatal "WORKSPACE not set"
+
+if [[ -n "$CONFIGSRC" ]]; then
+    if [[ -d "$HOME/arvados-api-server" ]]; then
+        # Jenkins expects us to use this by default.
+        CONFIGSRC="$HOME/arvados-api-server"
+    fi
+fi
+
+# Set up temporary install dirs (unless existing dirs were supplied)
+if [[ -n "$VENVDIR" ]]; then
+    leave_temp[VENVDIR]=1
+else
+    VENVDIR=$(mktemp -d)
+fi
+if [[ -n "$GOPATH" ]]; then
+    leave_temp[GOPATH]=1
+else
+    GOPATH=$(mktemp -d)
+fi
+export GOPATH
+mkdir -p "$GOPATH/src/git.curoverse.com"
+ln -sfn "$WORKSPACE" "$GOPATH/src/git.curoverse.com/arvados.git" \
+    || fatal "symlink failed"
+
+virtualenv --setuptools "$VENVDIR" || fatal "virtualenv $VENVDIR failed"
+PATH="$VENVDIR/bin:$PATH"
+
 checkexit() {
     if [[ "$?" != "0" ]]; then
         title "!!!!!! $1 FAILED !!!!!!"
@@ -142,21 +214,9 @@ title () {
     printf "\n%*s%s\n\n" $((($COLUMNS-${#txt})/2)) "" "$txt"
 }
 
-clear_temp() {
-    for t in "$VENVDIR" "$GOPATH"
-    do
-        if [[ -n "$t" && -z "$leave-temp" ]]
-        then
-            rm -rf "$t"
-        else
-            echo "Leaving $t"
-        fi
-    done
-}
-
 test_docs() {
     cd "$WORKSPACE/doc"
-    bundle install --deployment
+    bundle install --no-deployment
     rm -rf .site
     # Make sure python-epydoc is installed or the next line won't do much good!
     ARVADOS_API_HOST=qr1hi.arvadosapi.com
@@ -171,15 +231,50 @@ test_doclinkchecker() {
 }
 do_test doclinkchecker
 
+test_ruby_sdk() {
+    cd "$WORKSPACE/sdk/ruby" \
+        && bundle install --no-deployment \
+        && bundle exec rake test
+}
+do_test ruby_sdk
+
+install_ruby_sdk() {
+    cd "$WORKSPACE/sdk/ruby" \
+        && gem build arvados.gemspec \
+        && gem install --user-install --no-ri --no-rdoc `ls -t arvados-*.gem|head -n1`
+}
+do_install ruby_sdk
+
+install_cli() {
+    cd "$WORKSPACE/sdk/cli" \
+        && gem build arvados-cli.gemspec \
+        && gem install --user-install --no-ri --no-rdoc `ls -t arvados-cli-*.gem|head -n1`
+}
+do_install cli
+
+test_cli() {
+    title "Starting SDK CLI tests"
+    cd "$WORKSPACE/sdk/cli" \
+        && bundle install --no-deployment \
+        && mkdir -p /tmp/keep \
+        && KEEP_LOCAL_STORE=/tmp/keep bundle exec rake test $cli_test
+}
+do_test cli
+
 install_apiserver() {
     cd "$WORKSPACE/services/api"
-    bundle install --deployment
+    bundle install --no-deployment
 
     rm -f config/environments/test.rb
     cp config/environments/test.rb.example config/environments/test.rb
 
-    cp $HOME/arvados-api-server/database.yml config/ || fatal "database.yml"
-    cp $HOME/arvados-api-server/application.yml config/ || fatal "application.yml"
+    if [ -n "$CONFIGSRC" ]
+    then
+        for f in database.yml application.yml
+        do
+            cp "$CONFIGSRC/$f" config/ || fatal "$f"
+        done
+    fi
 
     # Fill in a random secret_token and blob_signing_key for testing
     SECRET_TOKEN=`echo 'puts rand(2**512).to_s(36)' |ruby`
@@ -191,7 +286,7 @@ install_apiserver() {
     export RAILS_ENV=test
 
     # Set up empty git repo (for git tests)
-    GITDIR="$WORKSPACE/tmpgit"
+    GITDIR=$(mktemp -d)
     sed -i'' -e "s:/var/cache/git:$GITDIR:" config/application.default.yml
 
     rm -rf $GITDIR
@@ -204,6 +299,10 @@ install_apiserver() {
         && git add tmp \
         && git commit -m 'initial commit'
 
+    # Clear out any lingering postgresql connections to arvados_test, so that we can drop it
+    # This assumes the current user is a postgresql superuser
+    psql arvados_test -c "SELECT pg_terminate_backend (pg_stat_activity.procpid::int) FROM pg_stat_activity WHERE pg_stat_activity.datname = 'arvados_test';" 2>/dev/null
+
     cd "$WORKSPACE/services/api" \
         && bundle exec rake db:drop \
         && bundle exec rake db:create \
@@ -217,12 +316,6 @@ test_apiserver() {
 }
 do_test apiserver
 
-install_cli() {
-    cd "$WORKSPACE/sdk/cli"
-    bundle install --deployment
-}
-do_install cli
-
 declare -a gostuff
 gostuff=(
     services/keepstore
@@ -264,7 +357,7 @@ test_python_sdk() {
     # the .egg files that setup.py downloads.
 
     cd "$WORKSPACE/sdk/python" \
-        && python setup.py test
+        && python setup.py test $python_sdk_test
     r=$?
     easy_install *.egg
     return $r
@@ -274,7 +367,7 @@ do_test python_sdk
 test_fuse() {
     # Install test dependencies here too, in case run_test_server needs them.
     cd "$WORKSPACE/services/fuse" \
-        && python setup.py test
+        && python setup.py test $fuse_test
     r=$?
     easy_install *.egg
     return $r
@@ -288,20 +381,11 @@ done
 
 test_workbench() {
     cd "$WORKSPACE/apps/workbench" \
-        && bundle install --deployment \
+        && bundle install --no-deployment \
         && bundle exec rake test $workbench_test
 }
 do_test workbench
 
-test_cli() {
-    title "Starting SDK CLI tests"
-    cd "$WORKSPACE/sdk/cli" \
-        && bundle install --deployment \
-        && mkdir -p /tmp/keep \
-        && KEEP_LOCAL_STORE=/tmp/keep bundle exec rake test $cli_test
-}
-do_test cli
-
 clear_temp
 
 for x in "${successes[@]}"