From cda1e2e09a3fff60beac508fbc223221ece77c15 Mon Sep 17 00:00:00 2001 From: Thomas Suckow Date: Fri, 8 Jan 2021 08:16:30 -0800 Subject: [PATCH] Remove old build scripts --- .appveyor.yml | 31 ------ .github/workflows/artifacts.yml | 1 + .travis.yml | 47 --------- pipeline/.local_config.sh | 10 -- pipeline/docker-run/docker-run | 97 ------------------ pipeline/docker-run/error_handling.sh | 17 ---- pipeline/docker-run/markers.sh | 11 --- pipeline/docker-run/runner.sh | 108 --------------------- pipeline/jobs/_imports.sh | 10 -- pipeline/jobs/build_job.sh | 7 -- pipeline/jobs/selenium_job.sh | 7 -- pipeline/jobs/unittest_job.sh | 7 -- pipeline/shared/duplicati.sh | 9 -- pipeline/stage_build/job.sh | 32 ------ pipeline/stage_build/trigger.sh | 7 -- pipeline/stage_integrationtests/job.sh | 22 ----- pipeline/stage_integrationtests/trigger.sh | 9 -- pipeline/stage_unittests/job.sh | 19 ---- pipeline/stage_unittests/trigger.sh | 7 -- pipeline/start.sh | 11 --- 20 files changed, 1 insertion(+), 468 deletions(-) delete mode 100644 .appveyor.yml delete mode 100644 .travis.yml delete mode 100644 pipeline/.local_config.sh delete mode 100755 pipeline/docker-run/docker-run delete mode 100644 pipeline/docker-run/error_handling.sh delete mode 100644 pipeline/docker-run/markers.sh delete mode 100755 pipeline/docker-run/runner.sh delete mode 100755 pipeline/jobs/_imports.sh delete mode 100755 pipeline/jobs/build_job.sh delete mode 100755 pipeline/jobs/selenium_job.sh delete mode 100755 pipeline/jobs/unittest_job.sh delete mode 100644 pipeline/shared/duplicati.sh delete mode 100755 pipeline/stage_build/job.sh delete mode 100755 pipeline/stage_build/trigger.sh delete mode 100755 pipeline/stage_integrationtests/job.sh delete mode 100755 pipeline/stage_integrationtests/trigger.sh delete mode 100755 pipeline/stage_unittests/job.sh delete mode 100755 pipeline/stage_unittests/trigger.sh delete mode 100755 pipeline/start.sh diff --git a/.appveyor.yml b/.appveyor.yml deleted file mode 100644 index 3ab28bf43..000000000 --- a/.appveyor.yml +++ /dev/null @@ -1,31 +0,0 @@ -version: 1.0.{build} -image: Visual Studio 2019 -configuration: Debug -platform: Any CPU -#Don't build twice for PR's to same repo -skip_branch_with_pr: true -environment: - AUTOUPDATER_Duplicati_SKIP_UPDATE: 1 - COVERALLS_REPO_TOKEN: - secure: szQsrkP5rvra8L60SomD73/dFvRwot0UuyA566zqzI2qmLOr+MhLN0AyC8BTbhYY -before_build: - - ps: $env:UNITTEST_BASEFOLDER = "$Env:APPVEYOR_BUILD_FOLDER" + "\testdata" -build_script: - cmd: dotnet build Duplicati.sln -test_script: - - ps: | - Start-FileDownload https://s3.amazonaws.com/duplicati-test-file-hosting/DSMCBE.zip - - 7z x DSMCBE.zip -otestdata - mkdir .\testData\data - - dotnet test --verbosity normal Duplicati.sln - $testsPassed = $? - - # Upload test results to AppVeyor. - $wc = New-Object "System.Net.WebClient" - $wc.UploadFile("https://ci.appveyor.com/api/testresults/nunit/$($env:APPVEYOR_JOB_ID)", "TestResults.xml") - - if (!$testsPassed) { - throw "Tests failed." - } diff --git a/.github/workflows/artifacts.yml b/.github/workflows/artifacts.yml index d374343b0..638981acb 100644 --- a/.github/workflows/artifacts.yml +++ b/.github/workflows/artifacts.yml @@ -26,6 +26,7 @@ jobs: - name: Restore dependencies run: dotnet restore --runtime=${{ matrix.cfg.runtime }} Duplicati.sln - name: Package + #TODO: investigate #if __WindowsGTK__ || ENABLE_GTK via -p:DefineConstants=ENABLE_GTK Maybe needed for GUI? run: dotnet publish -c Release --runtime=${{ matrix.cfg.runtime }} -o publish Duplicati.sln - name: Save Artifacts uses: actions/upload-artifact@v2 diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 0263fac07..000000000 --- a/.travis.yml +++ /dev/null @@ -1,47 +0,0 @@ -language: csharp -mono: none -dotnet: 5.0.101 -services: docker -before_install: - - sudo apt-get install moreutils - - set -o pipefail -env: - global: - - USAGEREPORTER_Duplicati_LEVEL=none - - AUTOUPDATER_Duplicati_SKIP_UPDATE=1 - - BUILD_DIR=${TRAVIS_BUILD_DIR}/../.build - - TEST_DIR=${TRAVIS_BUILD_DIR}/../.test - - ROOT_DIR="$TRAVIS_BUILD_DIR" - -# matrix expansion within jobs would be good: -# https://github.com/travis-ci/travis-ci/issues/8295 - -# There is one cache per branch, so concurrent builds on different branches possible! -# DO NOT SET ENVIRONMENT VARIABLES WITHIN JOBS, OR CACHES WILL NOT BE SHARED AMONGST JOBS! - - -jobs: - include: - - stage: build - cache: - directories: - - $BUILD_DIR - script: - - dotnet publish -r linux-x64 -o $BUILD_DIR ${ROOT_DIR}/Duplicati.sln - - cp -R ${ROOT_DIR}/guiTests $BUILD_DIR/ - - - - stage: tests - script: - - dotnet test --verbosity normal ${ROOT_DIR}/Duplicati.sln - - - stage: tests - cache: - directories: - - $BUILD_DIR - script: - - ${ROOT_DIR}/pipeline/jobs/selenium_job.sh - addons: - sauce_connect: - username: $SAUCE_USERNAME - access_key: $SAUCE_ACCESS_KEY diff --git a/pipeline/.local_config.sh b/pipeline/.local_config.sh deleted file mode 100644 index 35475b945..000000000 --- a/pipeline/.local_config.sh +++ /dev/null @@ -1,10 +0,0 @@ - -export ROOT_DIR=${SCRIPT_DIR}/../ -# caches -export BUILD_DIR=/tmp/.duplicati_build -export TEST_DIR=/tmp/.duplicati_test -export ARCHIVE_DIR=${ROOT_DIR}/.duplicati_zip -export PACKAGES_DIR=${ROOT_DIR}/.duplicati_packages -export SIGN_DIR=${ROOT_DIR}/.duplicati_sign -export UPLOAD_DIR=${ROOT_DIR}/.duplicati_upload - diff --git a/pipeline/docker-run/docker-run b/pipeline/docker-run/docker-run deleted file mode 100755 index aa3625825..000000000 --- a/pipeline/docker-run/docker-run +++ /dev/null @@ -1,97 +0,0 @@ -#!/bin/bash -. "$( cd "$(dirname "$0")" ; pwd -P )/error_handling.sh" -. "$( cd "$(dirname "$0")" ; pwd -P )/markers.sh" - -function pull_docker_image () { - travis_mark_begin "PULL MINIMAL DOCKER IMAGE" - docker pull $DOCKER_IMAGE - travis_mark_end "PULL MINIMAL DOCKER IMAGE" -} - -function add_option () { - FORWARD_OPTS[${#FORWARD_OPTS[@]}]="$1" - FORWARD_OPTS[${#FORWARD_OPTS[@]}]="$2" -} - -function add_volumes () { - volume_args=() - - volume_args[${#volume_args[@]}]="-v /var/run/docker.sock:/var/run/docker.sock \ - -v ${TARGET_DIR}:/application \ - ${DOCKER_VOLUME} \ - -v $( cd "$(dirname "$0")" ; pwd -P )/../:/pipeline ${DOCKER_SHARED_MEM}" - - for (( i=1; i<${#SOURCE_DIR[@]}+1; i++ )); do - volume_args[${#volume_args[@]}]="-v ${SOURCE_DIR[$i-1]}:/source_$i" - done -} - -function run_with_docker () { - if [ -z ${TARGET_DIR} ]; then - echo "no target cache specified" - exit 1 - fi - - add_volumes - - docker run ${volume_args[@]} \ - --privileged $DOCKER_AS_ROOT --rm $DOCKER_IMAGE "/pipeline/docker-run/runner.sh" "${FORWARD_OPTS[@]}" -} - -function parse_options () { - FORWARD_OPTS=() - SOURCE_DIR=() - - while true ; do - case "$1" in - --image) - DOCKER_IMAGE="$2" - ;; - --sourcedir) - SOURCE_DIR[${#SOURCE_DIR[@]}]="$2" - ;; - --targetdir) - TARGET_DIR="$2" - ;; - --asroot) - DOCKER_AS_ROOT="-u 0" - ;; - --volume) - DOCKER_VOLUME="-v $2" - ;; - --sharedmem) - DOCKER_SHARED_MEM="-v /dev/shm:/dev/shm" - ;; - --*) - if [[ $2 =~ ^--.* || -z $2 ]]; then - FORWARD_OPTS[${#FORWARD_OPTS[@]}]="$1" - else - FORWARD_OPTS[${#FORWARD_OPTS[@]}]="$1" - FORWARD_OPTS[${#FORWARD_OPTS[@]}]="$2" - fi - ;; - esac - - if [[ -z $1 ]]; then - break - elif [[ $2 =~ ^--.* || -z $2 ]]; then - shift - else - shift - shift - fi - done - - - if [ "${TARGET_DIR##${SOURCE_DIR}}" != "${TARGET_DIR}" ]; then - echo "targetdir $TARGET_DIR is not allowed to be a subdir of sourcedir $SOURCE_DIR" - fi - - - add_option "--workingdir" "$TARGET_DIR" - add_option "--sourcedirnum" ${#SOURCE_DIR[@]} -} - -parse_options "$@" -pull_docker_image -run_with_docker \ No newline at end of file diff --git a/pipeline/docker-run/error_handling.sh b/pipeline/docker-run/error_handling.sh deleted file mode 100644 index baab6e68b..000000000 --- a/pipeline/docker-run/error_handling.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash - -function quit_on_error() { - local parent_lineno="$1" - local message="$2" - local code="${3:-1}" - if [[ -n "$message" ]] ; then - echo "Error in $0 line ${parent_lineno}: ${message}; exiting with status ${code}" - else - echo "Error in $0 line ${parent_lineno}; exiting with status ${code}" - fi - exit "${code}" -} - -set -eE -trap 'quit_on_error $LINENO' ERR -set -o pipefail diff --git a/pipeline/docker-run/markers.sh b/pipeline/docker-run/markers.sh deleted file mode 100644 index f27571163..000000000 --- a/pipeline/docker-run/markers.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash - -function travis_mark_begin () { - echo "travis_fold:start:$1" - echo "+ START $1" -} - -function travis_mark_end () { - echo "travis_fold:end:$1" - echo "+ DONE $1" -} diff --git a/pipeline/docker-run/runner.sh b/pipeline/docker-run/runner.sh deleted file mode 100755 index 4ed08661c..000000000 --- a/pipeline/docker-run/runner.sh +++ /dev/null @@ -1,108 +0,0 @@ -#!/bin/bash -. "$( cd "$(dirname "$0")" ; pwd -P )/error_handling.sh" -. "$( cd "$(dirname "$0")" ; pwd -P )/markers.sh" - -function sync_dirs () { - rsync_delete_option="--delete" - for (( i=1; i<$SOURCE_DIR_NUM+1; i++ )); do - travis_mark_begin "SYNCING DIR source_${i}" - rsync -a $rsync_delete_option "/source_${i}/" "/application/" - unset rsync_delete_option - travis_mark_end "SYNCING DIR source_${i}" - done -} - -function setup () { - travis_mark_begin "INSTALLING PACKAGES IN DOCKER" - - if [ -f /sbin/apk ]; then - apk --update add $DOCKER_PACKAGES - elif [ -f /usr/bin/apt-get ]; then - export DEBIAN_FRONTEND=noninteractive - apt-get update && apt-get install -y $DOCKER_PACKAGES - fi - travis_mark_end "INSTALLING PACKAGES IN DOCKER" -} - -function clean_up () { - if [[ -z $KEEP_TARGET_FILTER ]]; then - return - fi - - cd /application - find . -type f ! -regex "${KEEP_TARGET_FILTER}" -delete - find . -type d -empty -delete - - for (( i=1; i<${#KEEP_SOURCE_FILTER[@]}+1; i++ )); do - cd /source_${i} - find . -type f ! -regex "${KEEP_SOURCE_FILTER[$i-1]}" -delete - find . -type d -empty -delete - done -} - -function parse_options () { - KEEP_SOURCE_FILTER=() - - while true ; do - case "$1" in - --command) - DOCKER_COMMAND="$2" - ;; - --packages) - DOCKER_PACKAGES="$2" - ;; - --sourcedirnum) - SOURCE_DIR_NUM="$2" - ;; - --keeptargetfilter) - KEEP_TARGET_FILTER="$2" - ;; - --keepsourcefilter) - KEEP_SOURCE_FILTER[${#KEEP_SOURCE_FILTER[@]}]="$2" - ;; - --*) - if [[ $2 =~ ^--.* || -z $2 ]]; then - FORWARD_OPTS[${#FORWARD_OPTS[@]}]="$1" - else - FORWARD_OPTS[${#FORWARD_OPTS[@]}]="$1" - FORWARD_OPTS[${#FORWARD_OPTS[@]}]="$2" - fi - ;; - esac - - if [[ -z $1 ]]; then - break - elif [[ $2 =~ ^--.* || -z $2 ]]; then - shift - else - shift - shift - fi - done -} - -function set_user_script_vars () { - option_found=false - for arg in ${FORWARD_OPTS[@]}; do - if [[ $option_found == true ]]; then - eval $option=$arg - export $option - option_found=false - elif [[ $arg =~ ^--.* ]]; then - option_found=true - option=${arg#"--"} - elif [[ $arg =~ ^-.* ]]; then - flag=${arg#"-"} - eval $flag=true - export $flag - fi - done -} - -parse_options "$@" -setup -sync_dirs -cd /application -set_user_script_vars -$DOCKER_COMMAND "${FORWARD_OPTS[@]}" -clean_up \ No newline at end of file diff --git a/pipeline/jobs/_imports.sh b/pipeline/jobs/_imports.sh deleted file mode 100755 index 8d3a04fe8..000000000 --- a/pipeline/jobs/_imports.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash - -export PATH="$PATH:${ROOT_DIR}/pipeline/docker-run" -. error_handling.sh - -which ts > /dev/null -if [[ $? -ne 0 ]]; then - echo "please install ts. e.g. brew install moreutils/apt-get install moreutils" - exit 1 -fi \ No newline at end of file diff --git a/pipeline/jobs/build_job.sh b/pipeline/jobs/build_job.sh deleted file mode 100755 index 46717ce4f..000000000 --- a/pipeline/jobs/build_job.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash -SCRIPT_DIR="$( cd "$(dirname "$0")" ; pwd -P )" -. "${SCRIPT_DIR}/_imports.sh" - -${ROOT_DIR}/pipeline/stage_build/trigger.sh \ ---sourcedir "${ROOT_DIR}" \ ---targetdir "${BUILD_DIR}" $@ | ts diff --git a/pipeline/jobs/selenium_job.sh b/pipeline/jobs/selenium_job.sh deleted file mode 100755 index 32aafd190..000000000 --- a/pipeline/jobs/selenium_job.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash -SCRIPT_DIR="$( cd "$(dirname "$0")" ; pwd -P )" -. "${SCRIPT_DIR}/_imports.sh" - -${ROOT_DIR}/pipeline/stage_integrationtests/trigger.sh \ ---sourcedir "${BUILD_DIR}" \ ---targetdir "${TEST_DIR}" $@ | ts diff --git a/pipeline/jobs/unittest_job.sh b/pipeline/jobs/unittest_job.sh deleted file mode 100755 index 719732915..000000000 --- a/pipeline/jobs/unittest_job.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash -SCRIPT_DIR="$( cd "$(dirname "$0")" ; pwd -P )" -. "${SCRIPT_DIR}/_imports.sh" - -${ROOT_DIR}/pipeline/stage_unittests/trigger.sh \ ---sourcedir $BUILD_DIR \ ---targetdir $TEST_DIR $@ | ts diff --git a/pipeline/shared/duplicati.sh b/pipeline/shared/duplicati.sh deleted file mode 100644 index c58546e3c..000000000 --- a/pipeline/shared/duplicati.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash -. "$( cd "$(dirname "$0")" ; pwd -P )/../docker-run/error_handling.sh" - -export DUPLICATI_ROOT="/application/" -declare -a FORWARD_OPTS - -export UPDATE_SOURCE="${DUPLICATI_ROOT}/Updates/build/${BUILDTAG}_source" -export UPDATE_TARGET="${DUPLICATI_ROOT}/Updates/build/${BUILDTAG}_target" - diff --git a/pipeline/stage_build/job.sh b/pipeline/stage_build/job.sh deleted file mode 100755 index b61f3dd3a..000000000 --- a/pipeline/stage_build/job.sh +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/bash -. /pipeline/docker-run/markers.sh -. /pipeline/shared/duplicati.sh - -function build () { - nuget restore "${DUPLICATI_ROOT}"/Duplicati.sln - - if [ ! -d "${DUPLICATI_ROOT}"/packages/SharpCompress.0.23.0 ]; then - ln -s "${DUPLICATI_ROOT}"/packages/sharpcompress.0.23.0 "${DUPLICATI_ROOT}"/packages/SharpCompress.0.23.0 - fi - - # build version stamper - msbuild -p:Configuration=Release -v:minimal "${DUPLICATI_ROOT}/BuildTools/UpdateVersionStamp/UpdateVersionStamp.csproj" - mono "${DUPLICATI_ROOT}/BuildTools/UpdateVersionStamp/bin/Release/UpdateVersionStamp.exe" --version="${releaseversion}" - - # build autoupdate - nuget restore "${DUPLICATI_ROOT}/BuildTools/AutoUpdateBuilder/AutoUpdateBuilder.sln" - msbuild -p:Configuration=Release -v:minimal "${DUPLICATI_ROOT}/BuildTools/AutoUpdateBuilder/AutoUpdateBuilder.sln" - - # build gpg signing tool - nuget restore "${DUPLICATI_ROOT}/BuildTools/GnupgSigningTool/GnupgSigningTool.sln" - msbuild -p:Configuration=Release -v:minimal "${DUPLICATI_ROOT}/BuildTools/GnupgSigningTool/GnupgSigningTool.sln" - - # build duplicati - msbuild -p:DefineConstants=ENABLE_GTK /p:Configuration=Release "${DUPLICATI_ROOT}/Duplicati.sln" - - cp -r "${DUPLICATI_ROOT}"/Duplicati/Server/webroot "${DUPLICATI_ROOT}"/Duplicati/GUI/Duplicati.GUI.TrayIcon/bin/Release/webroot -} - -travis_mark_begin "BUILDING BINARIES" -build -travis_mark_end "BUILDING BINARIES" diff --git a/pipeline/stage_build/trigger.sh b/pipeline/stage_build/trigger.sh deleted file mode 100755 index c583ffc8b..000000000 --- a/pipeline/stage_build/trigger.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash -. error_handling.sh - -PACKAGES="libgtk2.0-cil rsync" -docker-run --image mono \ ---packages "$PACKAGES" \ ---command "/pipeline/stage_build/job.sh" $@ \ No newline at end of file diff --git a/pipeline/stage_integrationtests/job.sh b/pipeline/stage_integrationtests/job.sh deleted file mode 100755 index d0d9b9ed2..000000000 --- a/pipeline/stage_integrationtests/job.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash -. /pipeline/docker-run/markers.sh -. /pipeline/shared/duplicati.sh - -function start_test () { - pip3 install selenium - #pip install --upgrade urllib3 - - # wget "https://github.com/mozilla/geckodriver/releases/download/v0.23.0/geckodriver-v0.23.0-linux32.tar.gz" - # tar -xvzf geckodriver* - # chmod +x geckodriver - # export PATH=$PATH:/duplicati/ - - #echo -n | openssl s_client -connect scan.coverity.com:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' | tee -a /etc/ssl/certs/ca- - cd - AUTOUPDATER_Duplicati_SKIP_UPDATE=1 "${DUPLICATI_ROOT}/Duplicati.Server" & - python3 "${DUPLICATI_ROOT}/guiTests/guiTest.py" -} - -travis_mark_begin "INTEGRATION TESTING" -start_test -travis_mark_end "INTEGRATION TESTING" diff --git a/pipeline/stage_integrationtests/trigger.sh b/pipeline/stage_integrationtests/trigger.sh deleted file mode 100755 index 5e6967fa8..000000000 --- a/pipeline/stage_integrationtests/trigger.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash -. error_handling.sh - -PACKAGES="python3-pip rsync" -docker-run --image selenium/standalone-firefox \ ---packages "$PACKAGES" \ ---asroot \ ---sharedmem \ ---command "sudo -u seluser /pipeline/stage_integrationtests/job.sh" $@ diff --git a/pipeline/stage_unittests/job.sh b/pipeline/stage_unittests/job.sh deleted file mode 100755 index fece2e7b0..000000000 --- a/pipeline/stage_unittests/job.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash -. /pipeline/docker-run/markers.sh -. /pipeline/shared/duplicati.sh - -function start_test () { - travis_mark_begin "SETUP NUGET" - nuget install NUnit.Runners -Version 3.10.0 -OutputDirectory testrunner - travis_mark_end "SETUP NUGET" - - for CAT in $(echo $testcategories | sed "s/,/ /g") - do - travis_mark_begin "UNIT TESTING CATEGORY $CAT" - mono "${DUPLICATI_ROOT}"/testrunner/NUnit.ConsoleRunner.3.10.0/tools/nunit3-console.exe \ - "${DUPLICATI_ROOT}"/Duplicati/UnitTest/bin/Release/Duplicati.UnitTest.dll --where:cat==$CAT --workers=1 - travis_mark_end "UNIT TESTING CATEGORY $CAT" - done -} - -start_test diff --git a/pipeline/stage_unittests/trigger.sh b/pipeline/stage_unittests/trigger.sh deleted file mode 100755 index 4d493175a..000000000 --- a/pipeline/stage_unittests/trigger.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash -. error_handling.sh - -PACKAGES="wget unzip rsync" -docker-run --image mono \ ---packages "$PACKAGES" \ ---command "/pipeline/stage_unittests/job.sh" $@ \ No newline at end of file diff --git a/pipeline/start.sh b/pipeline/start.sh deleted file mode 100755 index a208fd6b3..000000000 --- a/pipeline/start.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash -SCRIPT_DIR="$( cd "$(dirname "$0")" ; pwd -P )" -. "${SCRIPT_DIR}/docker-run/error_handling.sh" -. "${SCRIPT_DIR}/.local_config.sh" - -${ROOT_DIR}/pipeline/jobs/build_job.sh -${ROOT_DIR}/pipeline/jobs/unittest_job.sh --testcategories BulkNormal -${ROOT_DIR}/pipeline/jobs/unittest_job.sh --testcategories BulkNoSize -${ROOT_DIR}/pipeline/jobs/unittest_job.sh --testcategories SVNDataLong,SVNData,RecoveryTool,ProblematicPath,SymLink -${ROOT_DIR}/pipeline/jobs/unittest_job.sh --testcategories Border -${ROOT_DIR}/pipeline/jobs/unittest_job.sh --testcategories Filter,Targeted,Purge,Serialization,WebApi,Utility,UriUtility,IO,ImportExport,Disruption,RestoreHandler,RepairHandler,DeleteHandler,Controller