Split netci functions into smaller functions
authorMichelle McDaniel <adiaaida@gmail.com>
Tue, 20 Dec 2016 18:19:28 +0000 (10:19 -0800)
committerMichelle McDaniel <adiaaida@gmail.com>
Tue, 20 Dec 2016 23:03:45 +0000 (15:03 -0800)
netci.groovy

index c2f6d6310aea4b91b6477f93d8afcc3714e9bb62..90d10f6583ebf7a9cdb756f19e3783483fdfceaf 100755 (executable)
@@ -248,6 +248,7 @@ def static genStressModeScriptStep(def os, def stressModeName, def stressModeVar
 
         // Set the Timeout
         stepScript += "set __TestTimeout=${timeout}\r\n"
+        stepScript += "echo. > ${stepScriptLocation}\r\n"
         stressModeVars.each{ k, v -> 
             // Write out what we are writing to the script file
             stepScript += "echo Setting ${k}=${v}\r\n"
@@ -323,271 +324,276 @@ def static getJobName(def configuration, def architecture, def os, def scenario,
     return baseName + suffix
 }
 
-// **************************
-// Define the basic inner loop builds for PR and commit.  This is basically just the set
-// of coreclr builds over linux/osx/freebsd/windows and debug/release/checked.  In addition, the windows
-// builds will do a couple extra steps.
-// **************************
-
-// Adds a trigger for the PR build if one is needed.  If isFlowJob is true, then this is the
-// flow job that rolls up the build and test for non-windows OS's.  // If the job is a windows build only job,
-// it's just used for internal builds
-// If you add a job with a trigger phrase, please add that phrase to coreclr/Documentation/project-docs/ci-trigger-phrases.md
-def static addTriggers(def job, def branch, def isPR, def architecture, def os, def configuration, def scenario, def isFlowJob, def isWindowsBuildOnlyJob, def isLinuxEmulatorBuild) {
-    if (isWindowsBuildOnlyJob) {
-        return
-    }
-    
-    def bidailyCrossList = ['RHEL7.2', 'Debian8.4', 'OpenSUSE13.2']
-    // Non pull request builds.
-    if (!isPR) {
-        // Check scenario.
-        switch (scenario) {
-            case 'default':
-                switch (architecture) {
-                    case 'x64':
-                    case 'x86':
-                    case 'x86compatjit':
-                    case 'x86lb':
-                        if (isFlowJob || os == 'Windows_NT' || !(os in Constants.crossList)) {
-                            Utilities.addGithubPushTrigger(job)
-                        }
-                        break
-                    case 'arm':
+def static addNonPRTriggers(def job, def branch, def isPR, def architecture, def os, def configuration, def scenario, def isFlowJob, def isWindowsBuildOnlyJob, def isLinuxEmulatorBuild, def bidailyCrossList) {
+    // Check scenario.
+    switch (scenario) {
+        case 'default':
+            switch (architecture) {
+                case 'x64':
+                case 'x86':
+                case 'x86compatjit':
+                case 'x86lb':
+                    if (isFlowJob || os == 'Windows_NT' || !(os in Constants.crossList)) {
                         Utilities.addGithubPushTrigger(job)
-                        break
-                    case 'arm64':
-                        if (os == 'Windows_NT') {
-                            Utilities.addGithubPushTrigger(job)
-                            // TODO: Add once external email sending is available again
-                            // addEmailPublisher(job, 'dotnetonarm64@microsoft.com')
-                        }
-                        break
-                    default:
-                        println("Unknown architecture: ${architecture}");
-                        assert false
-                        break
-                }
-                break
-            case 'pri1':
-                // Pri one gets a push trigger, and only for release
-                if (architecture == 'x64') {
-                    if (configuration == 'Release') {
-                        // We expect release jobs to be Windows, or in the cross list
-                        assert (os == 'Windows_NT') || (os in Constants.crossList)
-                        if (!os in bidailyCrossList) {
-                            if (isFlowJob || os == 'Windows_NT') {
-                                Utilities.addGithubPushTrigger(job)
-                            }
-                        } 
-                        else {
-                            if (isFlowJob) {
-                                Utilities.addPeriodicTrigger(job, 'H H/12 * * *')
-                            }
-                        }
                     }
-                }
-                break
-            case 'r2r':
-                //r2r jobs that aren't pri1 can only be triggered by phrase
-                break
-            case 'pri1r2r':
-                assert !(os in bidailyCrossList)
-                //pri1 r2r gets a push trigger for checked/release
-                if (configuration == 'Checked' || configuration == 'Release') {
+                    break
+                case 'arm':
+                    Utilities.addGithubPushTrigger(job)
+                    break
+                case 'arm64':
+                    if (os == 'Windows_NT') {
+                        Utilities.addGithubPushTrigger(job)
+                        // TODO: Add once external email sending is available again
+                        // addEmailPublisher(job, 'dotnetonarm64@microsoft.com')
+                    }
+                    break
+                default:
+                    println("Unknown architecture: ${architecture}");
+                    assert false
+                    break
+            }
+            break
+        case 'pri1':
+            // Pri one gets a push trigger, and only for release
+            if (architecture == 'x64') {
+                if (configuration == 'Release') {
+                    // We expect release jobs to be Windows, or in the cross list
                     assert (os == 'Windows_NT') || (os in Constants.crossList)
-                    if (architecture == 'x64' && os != 'OSX') {
-                        //Flow jobs should be Windows, Ubuntu, OSX, or CentOS
+                    if (!os in bidailyCrossList) {
                         if (isFlowJob || os == 'Windows_NT') {
                             Utilities.addGithubPushTrigger(job)
                         }
-                    // OSX pri1r2r jobs should only run every 12 hours, not daily.
-                    } else if (architecture == 'x64' && os == 'OSX'){
+                    } 
+                    else {
                         if (isFlowJob) {
                             Utilities.addPeriodicTrigger(job, 'H H/12 * * *')
                         }
                     }
-                    // For x86, only add per-commit jobs for Windows
-                    else if (architecture == 'x86' || architecture == 'x86compatjit' || architecture == 'x86lb') {
-                        if (os == 'Windows_NT') {
-                            Utilities.addGithubPushTrigger(job)
-                        }
-                    }
-                    // arm64 pri1r2r jobs should only run every 12 hours.
-                    else if (architecture == 'arm64') {
-                        if (os == 'Windows_NT') {
-                            Utilities.addPeriodicTrigger(job, 'H H/12 * * *')
-                            // TODO: Add once external email sending is available again
-                            // addEmailPublisher(job, 'dotnetonarm64@microsoft.com')
-                        }
-                    }
-                }
-                break
-            case 'r2r_jitstress1':
-            case 'r2r_jitstress2':
-            case 'r2r_jitstressregs1':
-            case 'r2r_jitstressregs2':
-            case 'r2r_jitstressregs3':
-            case 'r2r_jitstressregs4':
-            case 'r2r_jitstressregs8':
-            case 'r2r_jitstressregsx10':
-            case 'r2r_jitstressregsx80':
-            case 'r2r_jitminopts':
-            case 'r2r_jitforcerelocs':
-            case 'gcstress15_pri1r2r':
-                assert !(os in bidailyCrossList)
-
-                // GCStress=C is currently not supported on OS X
-                if (os == 'OSX' && isGCStressRelatedTesting(scenario)) {
-                    break
                 }
-
-                //GC Stress 15 pri1 r2r gets a push trigger for checked/release
-                if (configuration == 'Checked' || configuration == 'Release') {
-                    assert (os == 'Windows_NT') || (os in Constants.crossList)
-                    if (architecture == 'x64') {
-                        //Flow jobs should be Windows, Ubuntu, OSX, or CentOS
-                        if (isFlowJob || os == 'Windows_NT') {
-                            // Add a weekly periodic trigger
-                            Utilities.addPeriodicTrigger(job, 'H H * * 3,6') // some time every Wednesday and Saturday
-                        }
+            }
+            break
+        case 'r2r':
+            //r2r jobs that aren't pri1 can only be triggered by phrase
+            break
+        case 'pri1r2r':
+            assert !(os in bidailyCrossList)
+            //pri1 r2r gets a push trigger for checked/release
+            if (configuration == 'Checked' || configuration == 'Release') {
+                assert (os == 'Windows_NT') || (os in Constants.crossList)
+                if (architecture == 'x64' && os != 'OSX') {
+                    //Flow jobs should be Windows, Ubuntu, OSX, or CentOS
+                    if (isFlowJob || os == 'Windows_NT') {
+                        Utilities.addGithubPushTrigger(job)
                     }
-                    // For x86, only add per-commit jobs for Windows
-                    else if (architecture == 'x86' || architecture == 'x86compatjit' || architecture == 'x86lb') {
-                        if (os == 'Windows_NT') {
-                            Utilities.addPeriodicTrigger(job, 'H H * * 3,6') // some time every Wednesday and Saturday
-                        }
+                // OSX pri1r2r jobs should only run every 12 hours, not daily.
+                } else if (architecture == 'x64' && os == 'OSX'){
+                    if (isFlowJob) {
+                        Utilities.addPeriodicTrigger(job, 'H H/12 * * *')
                     }
                 }
-                break
-            case 'longgc':
-                assert (os == 'Ubuntu' || os == 'Windows_NT' || os == 'OSX')
-                assert configuration == 'Release'
-                assert architecture == 'x64'
-                Utilities.addPeriodicTrigger(job, '@daily')
-                // TODO: Add once external email sending is available again
-                // addEmailPublisher(job, 'dotnetgctests@microsoft.com')
-                break
-            case 'gcsimulator':
-                assert (os == 'Ubuntu' || os == 'Windows_NT' || os == 'OSX')
-                assert configuration == 'Release'
-                assert architecture == 'x64'
-                Utilities.addPeriodicTrigger(job, 'H H * * 3,6') // some time every Wednesday and Saturday
-                // TODO: Add once external email sending is available again
-                // addEmailPublisher(job, 'dotnetgctests@microsoft.com')
-                break
-            case 'standalone_gc':
-                assert (os == 'Windows_NT')
-                assert (configuration == 'Release' || configuration == 'Checked')
-                // TODO: Add once external email sending is available again
-                // addEmailPublisher(job, 'dotnetgctests@microsoft.com')
-                Utilities.addPeriodicTrigger(job, '@weekly')
-                break
-            case 'ilrt':
-                assert !(os in bidailyCrossList)
-                // ILASM/ILDASM roundtrip one gets a daily build, and only for release
-                if (architecture == 'x64' && configuration == 'Release') {
-                    // We don't expect to see a job generated except in these scenarios
-                    assert (os == 'Windows_NT') || (os in Constants.crossList)
-                    if (isFlowJob || os == 'Windows_NT') {
-                        Utilities.addPeriodicTrigger(job, '@daily')
+                // For x86, only add per-commit jobs for Windows
+                else if (architecture == 'x86' || architecture == 'x86compatjit' || architecture == 'x86lb') {
+                    if (os == 'Windows_NT') {
+                        Utilities.addGithubPushTrigger(job)
                     }
                 }
-                break
-            case 'jitdiff':
-                assert (os == 'Ubuntu' || os == 'Windows_NT' || os == 'OSX')
-                assert configuration == 'Checked'
-                assert (architecture == 'x64' || architecture == 'x86') 
-                Utilities.addGithubPushTrigger(job)
-                break
-            case 'coverage':
-                assert (os == 'Ubuntu' || os == 'Windows_NT')
-                assert configuration == 'Release'
-                assert architecture == 'x64'
-                Utilities.addPeriodicTrigger(job, '@weekly')
-                break
-            case 'formatting':
-                assert (os == 'Windows_NT' || os == "Ubuntu")
-                assert architecture == 'x64'
-                Utilities.addGithubPushTrigger(job)
-                break
-            case 'jitstressregs1':
-            case 'jitstressregs2':
-            case 'jitstressregs3':
-            case 'jitstressregs4':
-            case 'jitstressregs8':
-            case 'jitstressregs0x10':
-            case 'jitstressregs0x80':
-            case 'minopts':
-            case 'forcerelocs':
-            case 'jitstress1':
-            case 'jitstress2':   
-            case 'jitstress2_jitstressregs1':
-            case 'jitstress2_jitstressregs2':
-            case 'jitstress2_jitstressregs3':
-            case 'jitstress2_jitstressregs4':
-            case 'jitstress2_jitstressregs8':
-            case 'jitstress2_jitstressregs0x10':
-            case 'jitstress2_jitstressregs0x80':
-            case 'corefx_baseline': 
-            case 'corefx_minopts':
-            case 'corefx_jitstress1':               
-            case 'corefx_jitstress2':
-            case 'corefx_jitstressregs1':
-            case 'corefx_jitstressregs2':
-            case 'corefx_jitstressregs3':
-            case 'corefx_jitstressregs4':
-            case 'corefx_jitstressregs8':
-            case 'corefx_jitstressregs0x10':
-            case 'corefx_jitstressregs0x80':
-            case 'zapdisable':           
-                if (os != 'CentOS7.1' && !(os in bidailyCrossList)) {
-                    assert (os == 'Windows_NT') || (os in Constants.crossList)
-                    Utilities.addPeriodicTrigger(job, '@daily')
-                }
-                break            
-            case 'heapverify1':
-            case 'gcstress0x3':            
-                if (os != 'CentOS7.1' && !(os in bidailyCrossList)) {
-                    assert (os == 'Windows_NT') || (os in Constants.crossList)
-                    if (architecture == 'arm64') {
-                        assert (os == 'Windows_NT')
-                        Utilities.addPeriodicTrigger(job, '@daily')
+                // arm64 pri1r2r jobs should only run every 12 hours.
+                else if (architecture == 'arm64') {
+                    if (os == 'Windows_NT') {
+                        Utilities.addPeriodicTrigger(job, 'H H/12 * * *')
                         // TODO: Add once external email sending is available again
                         // addEmailPublisher(job, 'dotnetonarm64@microsoft.com')
                     }
-                    else {
-                        Utilities.addPeriodicTrigger(job, '@weekly')
-                    }
                 }
+            }
+            break
+        case 'r2r_jitstress1':
+        case 'r2r_jitstress2':
+        case 'r2r_jitstressregs1':
+        case 'r2r_jitstressregs2':
+        case 'r2r_jitstressregs3':
+        case 'r2r_jitstressregs4':
+        case 'r2r_jitstressregs8':
+        case 'r2r_jitstressregsx10':
+        case 'r2r_jitstressregsx80':
+        case 'r2r_jitminopts':
+        case 'r2r_jitforcerelocs':
+        case 'gcstress15_pri1r2r':
+            assert !(os in bidailyCrossList)
+
+            // GCStress=C is currently not supported on OS X
+            if (os == 'OSX' && isGCStressRelatedTesting(scenario)) {
                 break
-            case 'gcstress0xc':
-            case 'gcstress0xc_zapdisable':
-            case 'gcstress0xc_zapdisable_jitstress2':
-            case 'gcstress0xc_zapdisable_heapverify1':
-            case 'gcstress0xc_jitstress1':
-            case 'gcstress0xc_jitstress2':
-            case 'gcstress0xc_minopts_heapverify1':
-                // GCStress=C is currently not supported on OS X
-                if (os != 'CentOS7.1' && os != 'OSX' && !(os in bidailyCrossList)) {
-                    assert (os == 'Windows_NT') || (os in Constants.crossList)
-                    if (architecture == 'arm64') {
-                        assert (os == 'Windows_NT')
-                        // TODO: Enable a periodic trigger after tests are updated.
-                        // Utilities.addPeriodicTrigger(job, '@daily')
-                        // TODO: Add once external email sending is available again
-                        // addEmailPublisher(job, 'dotnetonarm64@microsoft.com')
+            }
+
+            //GC Stress 15 pri1 r2r gets a push trigger for checked/release
+            if (configuration == 'Checked' || configuration == 'Release') {
+                assert (os == 'Windows_NT') || (os in Constants.crossList)
+                if (architecture == 'x64') {
+                    //Flow jobs should be Windows, Ubuntu, OSX, or CentOS
+                    if (isFlowJob || os == 'Windows_NT') {
+                        // Add a weekly periodic trigger
+                        Utilities.addPeriodicTrigger(job, 'H H * * 3,6') // some time every Wednesday and Saturday
                     }
-                    else {
-                        Utilities.addPeriodicTrigger(job, '@weekly')
+                }
+                // For x86, only add per-commit jobs for Windows
+                else if (architecture == 'x86' || architecture == 'x86compatjit' || architecture == 'x86lb') {
+                    if (os == 'Windows_NT') {
+                        Utilities.addPeriodicTrigger(job, 'H H * * 3,6') // some time every Wednesday and Saturday
                     }
                 }
-                break
-            default:
-                println("Unknown scenario: ${scenario}");
-                assert false
-                break
+            }
+            break
+        case 'longgc':
+            assert (os == 'Ubuntu' || os == 'Windows_NT' || os == 'OSX')
+            assert configuration == 'Release'
+            assert architecture == 'x64'
+            Utilities.addPeriodicTrigger(job, '@daily')
+            // TODO: Add once external email sending is available again
+            // addEmailPublisher(job, 'dotnetgctests@microsoft.com')
+            break
+        case 'gcsimulator':
+            assert (os == 'Ubuntu' || os == 'Windows_NT' || os == 'OSX')
+            assert configuration == 'Release'
+            assert architecture == 'x64'
+            Utilities.addPeriodicTrigger(job, 'H H * * 3,6') // some time every Wednesday and Saturday
+            // TODO: Add once external email sending is available again
+            // addEmailPublisher(job, 'dotnetgctests@microsoft.com')
+            break
+        case 'standalone_gc':
+            assert (os == 'Windows_NT')
+            assert (configuration == 'Release' || configuration == 'Checked')
+            // TODO: Add once external email sending is available again
+            // addEmailPublisher(job, 'dotnetgctests@microsoft.com')
+            Utilities.addPeriodicTrigger(job, '@weekly')
+            break
+        case 'ilrt':
+            assert !(os in bidailyCrossList)
+            // ILASM/ILDASM roundtrip one gets a daily build, and only for release
+            if (architecture == 'x64' && configuration == 'Release') {
+                // We don't expect to see a job generated except in these scenarios
+                assert (os == 'Windows_NT') || (os in Constants.crossList)
+                if (isFlowJob || os == 'Windows_NT') {
+                    Utilities.addPeriodicTrigger(job, '@daily')
+                }
+            }
+            break
+        case 'jitdiff':
+            assert (os == 'Ubuntu' || os == 'Windows_NT' || os == 'OSX')
+            assert configuration == 'Checked'
+            assert (architecture == 'x64' || architecture == 'x86') 
+            Utilities.addGithubPushTrigger(job)
+            break
+        case 'coverage':
+            assert (os == 'Ubuntu' || os == 'Windows_NT')
+            assert configuration == 'Release'
+            assert architecture == 'x64'
+            Utilities.addPeriodicTrigger(job, '@weekly')
+            break
+        case 'formatting':
+            assert (os == 'Windows_NT' || os == "Ubuntu")
+            assert architecture == 'x64'
+            Utilities.addGithubPushTrigger(job)
+            break
+        case 'jitstressregs1':
+        case 'jitstressregs2':
+        case 'jitstressregs3':
+        case 'jitstressregs4':
+        case 'jitstressregs8':
+        case 'jitstressregs0x10':
+        case 'jitstressregs0x80':
+        case 'minopts':
+        case 'forcerelocs':
+        case 'jitstress1':
+        case 'jitstress2':   
+        case 'jitstress2_jitstressregs1':
+        case 'jitstress2_jitstressregs2':
+        case 'jitstress2_jitstressregs3':
+        case 'jitstress2_jitstressregs4':
+        case 'jitstress2_jitstressregs8':
+        case 'jitstress2_jitstressregs0x10':
+        case 'jitstress2_jitstressregs0x80':
+        case 'corefx_baseline': 
+        case 'corefx_minopts':
+        case 'corefx_jitstress1':               
+        case 'corefx_jitstress2':
+        case 'corefx_jitstressregs1':
+        case 'corefx_jitstressregs2':
+        case 'corefx_jitstressregs3':
+        case 'corefx_jitstressregs4':
+        case 'corefx_jitstressregs8':
+        case 'corefx_jitstressregs0x10':
+        case 'corefx_jitstressregs0x80':
+        case 'zapdisable':           
+            if (os != 'CentOS7.1' && !(os in bidailyCrossList)) {
+            assert (os == 'Windows_NT') || (os in Constants.crossList)
+            Utilities.addPeriodicTrigger(job, '@daily')
         }
+        break            
+        case 'heapverify1':
+        case 'gcstress0x3':            
+            if (os != 'CentOS7.1' && !(os in bidailyCrossList)) {
+                assert (os == 'Windows_NT') || (os in Constants.crossList)
+                if (architecture == 'arm64') {
+                    assert (os == 'Windows_NT')
+                    Utilities.addPeriodicTrigger(job, '@daily')
+                    // TODO: Add once external email sending is available again
+                    // addEmailPublisher(job, 'dotnetonarm64@microsoft.com')
+                }
+                else {
+                    Utilities.addPeriodicTrigger(job, '@weekly')
+                }
+            }
+            break
+        case 'gcstress0xc':
+        case 'gcstress0xc_zapdisable':
+        case 'gcstress0xc_zapdisable_jitstress2':
+        case 'gcstress0xc_zapdisable_heapverify1':
+        case 'gcstress0xc_jitstress1':
+        case 'gcstress0xc_jitstress2':
+        case 'gcstress0xc_minopts_heapverify1':
+            // GCStress=C is currently not supported on OS X
+            if (os != 'CentOS7.1' && os != 'OSX' && !(os in bidailyCrossList)) {
+                assert (os == 'Windows_NT') || (os in Constants.crossList)
+                if (architecture == 'arm64') {
+                    assert (os == 'Windows_NT')
+                    // TODO: Enable a periodic trigger after tests are updated.
+                    // Utilities.addPeriodicTrigger(job, '@daily')
+                    // TODO: Add once external email sending is available again
+                    // addEmailPublisher(job, 'dotnetonarm64@microsoft.com')
+                }
+                else {
+                    Utilities.addPeriodicTrigger(job, '@weekly')
+                }
+            }
+            break
+        default:
+            println("Unknown scenario: ${scenario}");
+            assert false
+            break
+    }
+    return
+}
+
+// **************************
+// Define the basic inner loop builds for PR and commit.  This is basically just the set
+// of coreclr builds over linux/osx/freebsd/windows and debug/release/checked.  In addition, the windows
+// builds will do a couple extra steps.
+// **************************
+
+// Adds a trigger for the PR build if one is needed.  If isFlowJob is true, then this is the
+// flow job that rolls up the build and test for non-windows OS's.  // If the job is a windows build only job,
+// it's just used for internal builds
+// If you add a job with a trigger phrase, please add that phrase to coreclr/Documentation/project-docs/ci-trigger-phrases.md
+def static addTriggers(def job, def branch, def isPR, def architecture, def os, def configuration, def scenario, def isFlowJob, def isWindowsBuildOnlyJob, def isLinuxEmulatorBuild) {
+    if (isWindowsBuildOnlyJob) {
+        return
+    }
+    
+    def bidailyCrossList = ['RHEL7.2', 'Debian8.4', 'OpenSUSE13.2']
+    // Non pull request builds.
+    if (!isPR) {
+        addNonPRTriggers(job, branch, isPR, architecture, os, configuration, scenario, isFlowJob, isWindowsBuildOnlyJob, isLinuxEmulatorBuild, bidailyCrossList)
         return
     }
     // Pull request builds.  Generally these fall into two categories: default triggers and on-demand triggers
@@ -1389,6 +1395,22 @@ def static addTriggers(def job, def branch, def isPR, def architecture, def os,
                     Utilities.addGithubPRTriggerForBranch(job, branch, "${os} ${architecture} ${configuration} Build and Test (Jit - ${displayStr})",
                        "(?i).*test\\W+${os}\\W+${architecture}\\W+${configuration}\\W+${scenario}.*")
                     break                                   
+                case 'corefx_baseline':
+                        case 'corefx_minopts':
+                        case 'corefx_jitstress1':
+                        case 'corefx_jitstress2':
+                        case 'corefx_jitstressregs1':
+                        case 'corefx_jitstressregs2':
+                        case 'corefx_jitstressregs3':
+                        case 'corefx_jitstressregs4':
+                        case 'corefx_jitstressregs8':
+                        case 'corefx_jitstressregs0x10':
+                        case 'corefx_jitstressregs0x80':
+                            def displayName = 'CoreFx ' + getStressModeDisplayName(scenario)
+                            assert (os == 'Windows_NT') || (os in Constants.crossList)
+                            Utilities.addGithubPRTriggerForBranch(job, branch, "${os} ${architecture} ${configuration} Build and Test (Jit - ${displayName})",
+                               "(?i).*test\\W+${os}\\W+${scenario}.*")
+                            break                       
                 default:
                     println("Unknown scenario: ${os} ${architecture} ${scenario}");
                     assert false
@@ -1732,6 +1754,392 @@ def static addTriggers(def job, def branch, def isPR, def architecture, def os,
     }
 }
 
+def static calculateBuildCommands(def newJob, def scenario, def branch, def isPR, def architecture, def configuration, def os, def enableCorefxTesting, def isBuildOnly, def isLinuxEmulatorBuild) {
+    def buildCommands = [];
+    def osGroup = getOSGroup(os)
+    def lowerConfiguration = configuration.toLowerCase()
+
+    // Calculate the build steps, archival, and xunit results
+    switch (os) {
+        case 'Windows_NT': // editor brace matching: {
+            switch (architecture) {
+                case 'x64':
+                case 'x86':
+                case 'x86compatjit':
+                case 'x86lb':
+                    def arch = architecture
+                    def buildOpts = ''
+                    if (architecture == 'x86compatjit') {
+                        arch = 'x86'
+                        buildOpts = 'compatjitcrossgen'
+                    }
+                    else if (architecture == 'x86lb') {
+                        arch = 'x86'
+                        buildOpts = 'legacyjitcrossgen'
+                    }
+                    
+                    if (Constants.jitStressModeScenarios.containsKey(scenario) ||
+                            scenario == 'default' ||
+                            scenario == 'r2r' ||
+                            scenario == 'jitdiff' ||
+                            Constants.r2rJitStressScenarios.indexOf(scenario) != -1) {
+                        buildOpts += enableCorefxTesting ? ' skiptests' : ''
+                        buildCommands += "set __TestIntermediateDir=int&&build.cmd ${lowerConfiguration} ${arch} ${buildOpts}"
+                    }
+
+                    // For Pri 1 tests, we must shorten the output test binary path names.
+                    // if __TestIntermediateDir is already set, build-test.cmd will
+                    // output test binaries to that directory. If it is not set, the 
+                    // binaries are sent to a default directory whose name is about
+                    // 35 characters long.
+
+                    else if (scenario == 'pri1' || scenario == 'pri1r2r' || scenario == 'gcstress15_pri1r2r'|| scenario == 'coverage') {
+                        buildCommands += "set __TestIntermediateDir=int&&build.cmd ${lowerConfiguration} ${arch} ${buildOpts} -priority=1"
+                    }
+                    else if (scenario == 'ilrt') {
+                        // First do the build with skiptests and then build the tests with ilasm roundtrip
+                        buildCommands += "build.cmd ${lowerConfiguration} ${arch} ${buildOpts} skiptests"
+                        buildCommands += "set __TestIntermediateDir=int&&build-test.cmd ${lowerConfiguration} ${arch} -ilasmroundtrip"
+                    }
+                    else if (isLongGc(scenario)) {
+                        buildCommands += "build.cmd ${lowerConfiguration} ${arch} ${buildOpts} skiptests"
+                        buildCommands += "set __TestIntermediateDir=int&&build-test.cmd ${lowerConfiguration} ${arch}"
+                    }
+                    else if (scenario == 'standalone_gc') {
+                        buildCommands += "build.cmd ${lowerConfiguration} ${arch} ${buildOpts} buildstandalonegc"
+                    }
+                    else if (scenario == 'formatting') {
+                        buildCommands += "python -u tests\\scripts\\format.py -c %WORKSPACE% -o Windows_NT -a ${arch}"
+                        Utilities.addArchival(newJob, "format.patch", "", true, false)
+                        break
+                    }
+                    else {
+                        println("Unknown scenario: ${scenario}")
+                        assert false
+                    }
+                    
+                    // If we are running a stress mode, we should write out the set of key
+                    // value env pairs to a file at this point and then we'll pass that to runtest.cmd
+
+                    if (!isBuildOnly) {
+                        //If this is a crossgen build, pass 'crossgen' to runtest.cmd
+                        def crossgenStr = ''
+                        def runcrossgentestsStr = ''
+                        def runjitstressStr = ''
+                        def runjitstressregsStr = ''
+                        def runjitmioptsStr = ''
+                        def runjitforcerelocsStr = ''
+                        def runjitdisasmStr = ''
+                        def gcstressStr = ''
+                        def runtestArguments = ''
+                        def gcTestArguments = ''
+
+                        if (scenario == 'r2r' ||
+                            scenario == 'pri1r2r' ||
+                            scenario == 'gcstress15_pri1r2r' ||
+                            Constants.r2rJitStressScenarios.indexOf(scenario) != -1) {
+                                crossgenStr = 'crossgen'
+                                runcrossgentestsStr = 'runcrossgentests'
+                            
+                                if (scenario == 'r2r_jitstress1'){
+                                    runjitstressStr = 'jitstress 1'
+                                }
+                                else if (scenario == 'r2r_jitstress2') {
+                                    runjitstressStr = 'jitstress 2'
+                                }
+                                else if (scenario == 'r2r_jitstressregs1'){
+                                    runjitstressregsStr = 'jitstressregs 1'
+                                }
+                                else if (scenario == 'r2r_jitstressregs2') {
+                                    runjitstressregsStr = 'jitstressregs 2'
+                                }
+                                else if (scenario == 'r2r_jitstressregs3') {
+                                    runjitstressregsStr = 'jitstressregs 3'
+                                }
+                                else if (scenario == 'r2r_jitstressregs4') {
+                                    runjitstressregsStr = 'jitstressregs 4'
+                                }
+                                else if (scenario == 'r2r_jitstressregs8') {
+                                    runjitstressregsStr = 'jitstressregs 8'
+                                }
+                                else if (scenario == 'r2r_jitstressregsx10') {
+                                    runjitstressregsStr = 'jitstressregs x10'
+                                }
+                                else if (scenario == 'r2r_jitstressregsx80') {
+                                    runjitstressregsStr = 'jitstressregs x80'
+                                }
+                                else if (scenario == 'r2r_jitminopts') {
+                                    runjitmioptsStr = 'jitminopts'
+                                }
+                                else if (scenario == 'r2r_jitforcerelocs') {
+                                    runjitforcerelocsStr = 'jitforcerelocs'
+                                }
+                        }
+                        if (scenario == 'gcstress15_pri1r2r')
+                        {
+                           gcstressStr = 'gcstresslevel 0xF'
+                        }
+
+                        if (scenario == 'jitdiff')
+                        {
+                            runjitdisasmStr = 'jitdisasm crossgen'
+                        }
+
+                        if (isLongGc(scenario)) {
+                            gcTestArguments = "${scenario} sequential"
+                        }
+
+                        runtestArguments = "${lowerConfiguration} ${arch} ${gcstressStr} ${crossgenStr} ${runcrossgentestsStr} ${runjitstressStr} ${runjitstressregsStr} ${runjitmioptsStr} ${runjitforcerelocsStr} ${runjitdisasmStr} ${gcTestArguments}"
+
+                        if (Constants.jitStressModeScenarios.containsKey(scenario)) {
+                            def stepScriptLocation = "%WORKSPACE%\\SetStressModes.bat"
+                            buildCommands += genStressModeScriptStep(os, scenario, Constants.jitStressModeScenarios[scenario], stepScriptLocation)
+
+                            if (enableCorefxTesting) {
+                                def fxRoot = "%WORKSPACE%\\_\\fx"
+                                buildCommands += "python %WORKSPACE%\\tests\\scripts\\run-corefx-tests.py -arch ${arch} -build_type ${configuration} -fx_root ${fxRoot} -fx_branch ${branch} -env_script ${stepScriptLocation}"
+
+                                // Archive only result xml files since corefx/bin/tests is very large around 10 GB.
+                                // For windows, pull full test results and test drops for x86/x64
+                                Utilities.addArchival(newJob, "${fxRoot}/bin/tests/**/testResults.xml")
+
+                                // Set timeout
+                                setTestJobTimeOut(newJob, scenario)
+
+                                if (architecture == 'x64' || !isPR) {
+                                    Utilities.addXUnitDotNETResults(newJob, "${fxRoot}/bin/tests/**/testResults.xml")
+                                }
+                            }
+                            else {
+                                buildCommands += "%WORKSPACE%\\tests\\runtest.cmd ${runtestArguments} TestEnv ${stepScriptLocation}"
+                            }
+                        }
+                        else if (architecture == 'x64' || architecture == 'x86') {
+                            buildCommands += "tests\\runtest.cmd ${runtestArguments}"
+                        }                                        
+                        else if (architecture == 'x86compatjit') {
+                            def testEnvLocation = "%WORKSPACE%\\tests\\x86\\compatjit_x86_testenv.cmd"
+                            buildCommands += "tests\\runtest.cmd ${runtestArguments} Exclude0 x86_legacy_backend_issues.targets TestEnv ${testEnvLocation}"
+                        }
+                        else if (architecture == 'x86lb') {
+                            def testEnvLocation = "%WORKSPACE%\\tests\\x86\\legacyjit_x86_testenv.cmd"
+                            buildCommands += "tests\\runtest.cmd ${runtestArguments} Exclude0 x86_legacy_backend_issues.targets TestEnv ${testEnvLocation}"
+                        }
+                    }
+
+                    if (!enableCorefxTesting) {
+                        // Run the rest of the build    
+                        // Build the mscorlib for the other OS's
+                        buildCommands += "build.cmd ${lowerConfiguration} ${arch} linuxmscorlib"
+                        buildCommands += "build.cmd ${lowerConfiguration} ${arch} freebsdmscorlib"
+                        buildCommands += "build.cmd ${lowerConfiguration} ${arch} osxmscorlib"
+
+                        // Zip up the tests directory so that we don't use so much space/time copying
+                        // 10s of thousands of files around.
+                        buildCommands += "powershell -Command \"Add-Type -Assembly 'System.IO.Compression.FileSystem'; [System.IO.Compression.ZipFile]::CreateFromDirectory('.\\bin\\tests\\${osGroup}.${arch}.${configuration}', '.\\bin\\tests\\tests.zip')\"";
+
+                        if (!Constants.jitStressModeScenarios.containsKey(scenario) && scenario != 'jitdiff') {
+                            // For windows, pull full test results and test drops for x86/x64.
+                            // No need to pull for stress mode scenarios (downstream builds use the default scenario)
+                            Utilities.addArchival(newJob, "bin/Product/**,bin/tests/tests.zip")
+                        }
+
+                        if (scenario == 'jitdiff') {
+                            // retrive jit-dasm output for base commit, and run jit-diff
+                            if (!isBuildOnly) {
+                                // if this is a build only job, we want to keep the default (build) artifacts for the flow job
+                                Utilities.addArchival(newJob, "bin/tests/${osGroup}.${arch}.${configuration}/dasm/**")
+                            }
+                        }
+                        
+                        if (!isBuildOnly) {
+                            if (architecture == 'x64' || !isPR) {
+                                Utilities.addXUnitDotNETResults(newJob, 'bin/**/TestRun*.xml')
+                            }
+                            setTestJobTimeOut(newJob, scenario)
+                        }
+                    }
+                    break
+                case 'arm':
+                    assert (scenario == 'default')
+                    
+                    // Set time out
+                    setTestJobTimeOut(newJob, scenario)
+
+                    if ( lowerConfiguration == "debug" ) {
+                        // For Debug builds, we will do a P1 test build
+                        buildCommands += "set __TestIntermediateDir=int&&build.cmd ${lowerConfiguration} ${architecture} -priority=1"
+                    }
+                    else {
+                        buildCommands += "set __TestIntermediateDir=int&&build.cmd ${lowerConfiguration} ${architecture}"
+                    }
+                    // Add archival.
+                    Utilities.addArchival(newJob, "bin/Product/**")
+                    break
+                case 'arm64':
+                    assert (scenario == 'default') || (scenario == 'pri1r2r') || (scenario == 'gcstress0x3') || (scenario == 'gcstress0xc')
+                    // Set time out
+                    setTestJobTimeOut(newJob, scenario)
+
+                    // Debug runs take too long to run. So build job only.
+                    if (lowerConfiguration == "debug") {
+                       buildCommands += "set __TestIntermediateDir=int&&build.cmd ${lowerConfiguration} ${architecture} toolset_dir C:\\ats2"
+                    }
+                    else {
+                       buildCommands += "set __TestIntermediateDir=int&&build.cmd skiptests ${lowerConfiguration} ${architecture} toolset_dir C:\\ats2"
+                       // Test build and run are launched together.
+                       buildCommands += "python tests\\scripts\\arm64_post_build.py -repo_root %WORKSPACE% -arch ${architecture} -build_type ${lowerConfiguration} -scenario ${scenario} -key_location C:\\tools\\key.txt"
+                       //Utilities.addXUnitDotNETResults(newJob, 'bin/tests/testResults.xml')
+                    }
+
+                    // Add archival.
+                    Utilities.addArchival(newJob, "bin/Product/**")
+                    break
+                default:
+                    println("Unknown architecture: ${architecture}");
+                    assert false
+                    break
+            }
+            break
+        // editor brace matching: }
+        case 'Ubuntu':
+        case 'Ubuntu16.04':
+        case 'Ubuntu16.10':
+        case 'Debian8.4':
+        case 'OSX':
+        case 'FreeBSD':
+        case 'CentOS7.1':
+        case 'RHEL7.2':
+        case 'OpenSUSE13.2':
+        case 'OpenSUSE42.1':
+        case 'Fedora23': // editor brace matching: {
+            switch (architecture) {
+                case 'x64':
+                case 'x86':
+                case 'x86compatjit':
+                case 'x86lb':
+                    def arch = architecture
+                    if (architecture == 'x86compatjit' || architecture == 'x86lb') {
+                        arch = 'x86'
+                    }
+
+                    if (scenario == 'formatting') {
+                        buildCommands += "python tests/scripts/format.py -c \${WORKSPACE} -o Linux -a ${arch}"
+                        Utilities.addArchival(newJob, "format.patch", "", true, false)
+                        break
+                    }
+                
+                    if (!enableCorefxTesting) {
+                        // We run pal tests on all OS but generate mscorlib (and thus, nuget packages)
+                        // only on supported OS platforms.
+                        if ((os == 'FreeBSD') || (os == 'OpenSUSE13.2'))
+                        {
+                            buildCommands += "./build.sh skipmscorlib verbose ${lowerConfiguration} ${arch}"
+                        }
+                        else
+                        {
+                            def bootstrapRid = Utilities.getBoostrapPublishRid(os)
+                            def bootstrapRidEnv = bootstrapRid != null ? "__PUBLISH_RID=${bootstrapRid} " : ''
+                            buildCommands += "${bootstrapRidEnv}./build.sh verbose ${lowerConfiguration} ${arch}"
+                        }
+                        buildCommands += "src/pal/tests/palsuite/runpaltests.sh \${WORKSPACE}/bin/obj/${osGroup}.${arch}.${configuration} \${WORKSPACE}/bin/paltestout"
+                    
+                        // Set time out
+                        setTestJobTimeOut(newJob, scenario)
+                        // Basic archiving of the build
+                        Utilities.addArchival(newJob, "bin/Product/**,bin/obj/*/tests/**/*.dylib,bin/obj/*/tests/**/*.so")
+                        // And pal tests
+                        Utilities.addXUnitDotNETResults(newJob, '**/pal_tests.xml')
+                    }
+                    else {
+                        // Corefx stress testing                                        
+                        assert os == 'Ubuntu'
+                        assert architecture == 'x64'
+                        assert lowerConfiguration == 'checked'
+                        assert Constants.jitStressModeScenarios.containsKey(scenario)
+                        
+                        // Build coreclr
+                        buildCommands += "./build.sh verbose ${lowerConfiguration} ${architecture}"
+                        
+                        def scriptFileName = "\$WORKSPACE/set_stress_test_env.sh"
+                        buildCommands += genStressModeScriptStep(os, scenario, Constants.jitStressModeScenarios[scenario], scriptFileName)
+
+                        // Build and text corefx
+                        def fxRoot = "\$WORKSPACE%/_/fx"
+                        buildCommands += "python \$WORKSPACE/tests/scripts/run-corefx-tests.py -arch ${arch} -build_type ${configuration} -fx_root ${fxRoot} -fx_branch ${branch} -env_script ${scriptFileName}"
+
+                        // Archive and process test result
+                        Utilities.addArchival(newJob, "${fxRoot}/bin/tests/**/testResults.xml")
+                        setTestJobTimeOut(newJob, scenario)
+                        Utilities.addXUnitDotNETResults(newJob, "${fxRoot}/bin/tests/**/testResults.xml")
+                    }
+                    break
+                case 'arm64':
+                    // We don't run the cross build except on Ubuntu
+                    assert os == 'Ubuntu'
+                    
+                    buildCommands += """echo \"Using rootfs in /opt/aarch64-linux-gnu-root\"
+                        ROOTFS_DIR=/opt/aarch64-linux-gnu-root ./build.sh skipmscorlib arm64 cross verbose ${lowerConfiguration}"""
+                    
+                    // Basic archiving of the build, no pal tests
+                    Utilities.addArchival(newJob, "bin/Product/**")
+                    break
+                case 'arm':
+                    // All builds for ARM architecture are run on Ubuntu currently
+                    assert os == 'Ubuntu'
+                    if (isLinuxEmulatorBuild == false) {
+                        buildCommands += """echo \"Using rootfs in /opt/arm-liux-genueabihf-root\"
+                            ROOTFS_DIR=/opt/arm-linux-genueabihf-root ./build.sh skipmscorlib arm cross verbose ${lowerConfiguration}"""
+                        
+                        // Basic archiving of the build, no pal tests
+                        Utilities.addArchival(newJob, "bin/Product/**")
+                        break
+                    }
+                    else {
+                        // Make sure the build configuration is either of debug or release
+                        assert ( lowerConfiguration == 'debug' ) || ( lowerConfiguration == 'release' )
+
+                        // Setup variables to hold emulator folder path and the rootfs mount path
+                        def armemul_path = '/opt/linux-arm-emulator'
+                        def armrootfs_mountpath = '/opt/linux-arm-emulator-root'
+
+                        // Unzip the Windows test binaries first. Exit with 0
+                        buildCommands += "unzip -q -o ./bin/tests/tests.zip -d ./bin/tests/Windows_NT.x64.${configuration} || exit 0"
+
+                        // Unpack the corefx binaries
+                        buildCommands += "tar -xf ./bin/build.tar.gz"
+
+                        // Call the ARM emulator build script to cross build and test using the ARM emulator rootfs
+                        buildCommands += """./tests/scripts/arm32_ci_script.sh \\
+                        --emulatorPath=${armemul_path} \\
+                        --mountPath=${armrootfs_mountpath} \\
+                        --buildConfig=${lowerConfiguration} \\
+                        --testRootDir=./bin/tests/Windows_NT.x64.${configuration} \\
+                        --coreFxNativeBinDir=./bin/Linux.arm-softfp.${configuration} \\
+                        --coreFxBinDir=\"./bin/Linux.AnyCPU.${configuration};./bin/Unix.AnyCPU.${configuration};./bin/AnyOS.AnyCPU.${configuration}\" \\
+                        --testDirFile=./tests/testsRunningInsideARM.txt"""
+
+
+                        // Basic archiving of the build
+                        Utilities.addArchival(newJob, "bin/Product/**")
+                        break
+                    }
+                default:
+                    println("Unknown architecture: ${architecture}");
+                    assert false
+                    break
+            }
+            break
+        // editor brace matching: }
+        default:
+            println("Unknown os: ${os}");
+            assert false
+            break
+    } // os
+
+    return buildCommands
+}
+
 // Additional scenario which can alter behavior
 
 def combinedScenarios = Constants.basicScenarios + Constants.jitStressModeScenarios.keySet()
@@ -2005,386 +2413,8 @@ combinedScenarios.each { scenario ->
                     Utilities.standardJobSetup(newJob, project, isPR, "*/${branch}")
                     addTriggers(newJob, branch, isPR, architecture, os, configuration, scenario, false, isBuildOnly, isLinuxEmulatorBuild)
                 
-                    def buildCommands = [];
+                    def buildCommands = calculateBuildCommands(newJob, scenario, branch, isPR, architecture, configuration, os, enableCorefxTesting, isBuildOnly, isLinuxEmulatorBuild)
                     def osGroup = getOSGroup(os)
-                
-                    // Calculate the build steps, archival, and xunit results
-                    switch (os) {
-                        case 'Windows_NT': // editor brace matching: {
-                            switch (architecture) {
-                                case 'x64':
-                                case 'x86':
-                                case 'x86compatjit':
-                                case 'x86lb':
-                                    def arch = architecture
-                                    def buildOpts = ''
-                                    if (architecture == 'x86compatjit') {
-                                        arch = 'x86'
-                                        buildOpts = 'compatjitcrossgen'
-                                    }
-                                    else if (architecture == 'x86lb') {
-                                        arch = 'x86'
-                                        buildOpts = 'legacyjitcrossgen'
-                                    }
-                                    
-                                    if (Constants.jitStressModeScenarios.containsKey(scenario) ||
-                                            scenario == 'default' ||
-                                            scenario == 'r2r' ||
-                                            scenario == 'jitdiff' ||
-                                            Constants.r2rJitStressScenarios.indexOf(scenario) != -1) {
-                                        buildOpts += enableCorefxTesting ? ' skiptests' : ''
-                                        buildCommands += "set __TestIntermediateDir=int&&build.cmd ${lowerConfiguration} ${arch} ${buildOpts}"
-                                    }
-
-                                    // For Pri 1 tests, we must shorten the output test binary path names.
-                                    // if __TestIntermediateDir is already set, build-test.cmd will
-                                    // output test binaries to that directory. If it is not set, the 
-                                    // binaries are sent to a default directory whose name is about
-                                    // 35 characters long.
-
-                                    else if (scenario == 'pri1' || scenario == 'pri1r2r' || scenario == 'gcstress15_pri1r2r'|| scenario == 'coverage') {
-                                        buildCommands += "set __TestIntermediateDir=int&&build.cmd ${lowerConfiguration} ${arch} ${buildOpts} -priority=1"
-                                    }
-                                    else if (scenario == 'ilrt') {
-                                        // First do the build with skiptests and then build the tests with ilasm roundtrip
-                                        buildCommands += "build.cmd ${lowerConfiguration} ${arch} ${buildOpts} skiptests"
-                                        buildCommands += "set __TestIntermediateDir=int&&build-test.cmd ${lowerConfiguration} ${arch} -ilasmroundtrip"
-                                    }
-                                    else if (isLongGc(scenario)) {
-                                        buildCommands += "build.cmd ${lowerConfiguration} ${arch} ${buildOpts} skiptests"
-                                        buildCommands += "set __TestIntermediateDir=int&&build-test.cmd ${lowerConfiguration} ${arch}"
-                                    }
-                                    else if (scenario == 'standalone_gc') {
-                                        buildCommands += "build.cmd ${lowerConfiguration} ${arch} ${buildOpts} buildstandalonegc"
-                                    }
-                                    else if (scenario == 'formatting') {
-                                        buildCommands += "python -u tests\\scripts\\format.py -c %WORKSPACE% -o Windows_NT -a ${arch}"
-                                        Utilities.addArchival(newJob, "format.patch", "", true, false)
-                                        break
-                                    }
-                                    else {
-                                        println("Unknown scenario: ${scenario}")
-                                        assert false
-                                    }
-                                    
-                                    // If we are running a stress mode, we should write out the set of key
-                                    // value env pairs to a file at this point and then we'll pass that to runtest.cmd
-
-                                    if (!isBuildOnly) {
-                                        //If this is a crossgen build, pass 'crossgen' to runtest.cmd
-                                        def crossgenStr = ''
-                                        def runcrossgentestsStr = ''
-                                        def runjitstressStr = ''
-                                        def runjitstressregsStr = ''
-                                        def runjitmioptsStr = ''
-                                        def runjitforcerelocsStr = ''
-                                        def runjitdisasmStr = ''
-                                        def gcstressStr = ''
-                                        def runtestArguments = ''
-                                        def gcTestArguments = ''
-
-                                        if (scenario == 'r2r' ||
-                                            scenario == 'pri1r2r' ||
-                                            scenario == 'gcstress15_pri1r2r' ||
-                                            Constants.r2rJitStressScenarios.indexOf(scenario) != -1) {
-                                                crossgenStr = 'crossgen'
-                                                runcrossgentestsStr = 'runcrossgentests'
-                                            
-                                                if (scenario == 'r2r_jitstress1'){
-                                                    runjitstressStr = 'jitstress 1'
-                                                }
-                                                else if (scenario == 'r2r_jitstress2') {
-                                                    runjitstressStr = 'jitstress 2'
-                                                }
-                                                else if (scenario == 'r2r_jitstressregs1'){
-                                                    runjitstressregsStr = 'jitstressregs 1'
-                                                }
-                                                else if (scenario == 'r2r_jitstressregs2') {
-                                                    runjitstressregsStr = 'jitstressregs 2'
-                                                }
-                                                else if (scenario == 'r2r_jitstressregs3') {
-                                                    runjitstressregsStr = 'jitstressregs 3'
-                                                }
-                                                else if (scenario == 'r2r_jitstressregs4') {
-                                                    runjitstressregsStr = 'jitstressregs 4'
-                                                }
-                                                else if (scenario == 'r2r_jitstressregs8') {
-                                                    runjitstressregsStr = 'jitstressregs 8'
-                                                }
-                                                else if (scenario == 'r2r_jitstressregsx10') {
-                                                    runjitstressregsStr = 'jitstressregs x10'
-                                                }
-                                                else if (scenario == 'r2r_jitstressregsx80') {
-                                                    runjitstressregsStr = 'jitstressregs x80'
-                                                }
-                                                else if (scenario == 'r2r_jitminopts') {
-                                                    runjitmioptsStr = 'jitminopts'
-                                                }
-                                                else if (scenario == 'r2r_jitforcerelocs') {
-                                                    runjitforcerelocsStr = 'jitforcerelocs'
-                                                }
-                                        }
-                                        if (scenario == 'gcstress15_pri1r2r')
-                                        {
-                                           gcstressStr = 'gcstresslevel 0xF'
-                                        }
-
-                                        if (scenario == 'jitdiff')
-                                        {
-                                            runjitdisasmStr = 'jitdisasm crossgen'
-                                        }
-
-                                        if (isLongGc(scenario)) {
-                                            gcTestArguments = "${scenario} sequential"
-                                        }
-
-                                        runtestArguments = "${lowerConfiguration} ${arch} ${gcstressStr} ${crossgenStr} ${runcrossgentestsStr} ${runjitstressStr} ${runjitstressregsStr} ${runjitmioptsStr} ${runjitforcerelocsStr} ${runjitdisasmStr} ${gcTestArguments}"
-
-                                        if (Constants.jitStressModeScenarios.containsKey(scenario)) {
-                                            def stepScriptLocation = "%WORKSPACE%\\SetStressModes.bat"
-                                            buildCommands += genStressModeScriptStep(os, scenario, Constants.jitStressModeScenarios[scenario], stepScriptLocation)
-
-                                            if (enableCorefxTesting) {
-                                                def fxRoot = "%WORKSPACE%\\_\\fx"
-                                                buildCommands += "python %WORKSPACE%\\tests\\scripts\\run-corefx-tests.cmd -arch ${arch} -build_type ${configuration} -fx_root ${fxRoot} -fx_branch ${branch} -env_script ${stepScriptLocation}"
-
-                                                // Archive only result xml files since corefx/bin/tests is very large around 10 GB.
-                                                // For windows, pull full test results and test drops for x86/x64
-                                                Utilities.addArchival(newJob, "${fxRoot}/bin/tests/**/testResults.xml")
-
-                                                // Set timeout
-                                                setTestJobTimeOut(newJob, scenario)
-
-                                                if (architecture == 'x64' || !isPR) {
-                                                    Utilities.addXUnitDotNETResults(newJob, "${fxRoot}/bin/tests/**/testResults.xml")
-                                                }
-                                            }
-                                            else {
-                                                buildCommands += "%WORKSPACE%\\tests\\runtest.cmd ${runtestArguments} TestEnv ${stepScriptLocation}"
-                                            }
-                                        }
-                                        else if (architecture == 'x64' || architecture == 'x86') {
-                                            buildCommands += "tests\\runtest.cmd ${runtestArguments}"
-                                        }                                        
-                                        else if (architecture == 'x86compatjit') {
-                                            def testEnvLocation = "%WORKSPACE%\\tests\\x86\\compatjit_x86_testenv.cmd"
-                                            buildCommands += "tests\\runtest.cmd ${runtestArguments} Exclude0 x86_legacy_backend_issues.targets TestEnv ${testEnvLocation}"
-                                        }
-                                        else if (architecture == 'x86lb') {
-                                            def testEnvLocation = "%WORKSPACE%\\tests\\x86\\legacyjit_x86_testenv.cmd"
-                                            buildCommands += "tests\\runtest.cmd ${runtestArguments} Exclude0 x86_legacy_backend_issues.targets TestEnv ${testEnvLocation}"
-                                        }
-                                    }
-
-                                    if (!enableCorefxTesting) {
-                                        // Run the rest of the build    
-                                        // Build the mscorlib for the other OS's
-                                        buildCommands += "build.cmd ${lowerConfiguration} ${arch} linuxmscorlib"
-                                        buildCommands += "build.cmd ${lowerConfiguration} ${arch} freebsdmscorlib"
-                                        buildCommands += "build.cmd ${lowerConfiguration} ${arch} osxmscorlib"
-
-                                        // Zip up the tests directory so that we don't use so much space/time copying
-                                        // 10s of thousands of files around.
-                                        buildCommands += "powershell -Command \"Add-Type -Assembly 'System.IO.Compression.FileSystem'; [System.IO.Compression.ZipFile]::CreateFromDirectory('.\\bin\\tests\\${osGroup}.${arch}.${configuration}', '.\\bin\\tests\\tests.zip')\"";
-
-                                        if (!Constants.jitStressModeScenarios.containsKey(scenario) && scenario != 'jitdiff') {
-                                            // For windows, pull full test results and test drops for x86/x64.
-                                            // No need to pull for stress mode scenarios (downstream builds use the default scenario)
-                                            Utilities.addArchival(newJob, "bin/Product/**,bin/tests/tests.zip")
-                                        }
-
-                                        if (scenario == 'jitdiff') {
-                                            // retrive jit-dasm output for base commit, and run jit-diff
-                                            if (!isBuildOnly) {
-                                                // if this is a build only job, we want to keep the default (build) artifacts for the flow job
-                                                Utilities.addArchival(newJob, "bin/tests/${osGroup}.${arch}.${configuration}/dasm/**")
-                                            }
-                                        }
-                                        
-                                        if (!isBuildOnly) {
-                                            if (architecture == 'x64' || !isPR) {
-                                                Utilities.addXUnitDotNETResults(newJob, 'bin/**/TestRun*.xml')
-                                            }
-                                            setTestJobTimeOut(newJob, scenario)
-                                        }
-                                    }
-                                    break
-                                case 'arm':
-                                    assert (scenario == 'default')
-                                    
-                                    // Set time out
-                                    setTestJobTimeOut(newJob, scenario)
-
-                                    if ( lowerConfiguration == "debug" ) {
-                                        // For Debug builds, we will do a P1 test build
-                                        buildCommands += "set __TestIntermediateDir=int&&build.cmd ${lowerConfiguration} ${architecture} -priority=1"
-                                    }
-                                    else {
-                                        buildCommands += "set __TestIntermediateDir=int&&build.cmd ${lowerConfiguration} ${architecture}"
-                                    }
-                                    // Add archival.
-                                    Utilities.addArchival(newJob, "bin/Product/**")
-                                    break
-                                case 'arm64':
-                                    assert (scenario == 'default') || (scenario == 'pri1r2r') || (scenario == 'gcstress0x3') || (scenario == 'gcstress0xc')
-                                    // Set time out
-                                    setTestJobTimeOut(newJob, scenario)
-
-                                    // Debug runs take too long to run. So build job only.
-                                    if (lowerConfiguration == "debug") {
-                                       buildCommands += "set __TestIntermediateDir=int&&build.cmd ${lowerConfiguration} ${architecture} toolset_dir C:\\ats2"
-                                    }
-                                    else {
-                                       buildCommands += "set __TestIntermediateDir=int&&build.cmd skiptests ${lowerConfiguration} ${architecture} toolset_dir C:\\ats2"
-                                       // Test build and run are launched together.
-                                       buildCommands += "python tests\\scripts\\arm64_post_build.py -repo_root %WORKSPACE% -arch ${architecture} -build_type ${lowerConfiguration} -scenario ${scenario} -key_location C:\\tools\\key.txt"
-                                       //Utilities.addXUnitDotNETResults(newJob, 'bin/tests/testResults.xml')
-                                    }
-
-                                    // Add archival.
-                                    Utilities.addArchival(newJob, "bin/Product/**")
-                                    break
-                                default:
-                                    println("Unknown architecture: ${architecture}");
-                                    assert false
-                                    break
-                            }
-                            break
-                        // editor brace matching: }
-                        case 'Ubuntu':
-                        case 'Ubuntu16.04':
-                        case 'Ubuntu16.10':
-                        case 'Debian8.4':
-                        case 'OSX':
-                        case 'FreeBSD':
-                        case 'CentOS7.1':
-                        case 'RHEL7.2':
-                        case 'OpenSUSE13.2':
-                        case 'OpenSUSE42.1':
-                        case 'Fedora23': // editor brace matching: {
-                            switch (architecture) {
-                                case 'x64':
-                                case 'x86':
-                                case 'x86compatjit':
-                                case 'x86lb':
-                                    def arch = architecture
-                                    if (architecture == 'x86compatjit' || architecture == 'x86lb') {
-                                        arch = 'x86'
-                                    }
-
-                                    if (scenario == 'formatting') {
-                                        buildCommands += "python tests/scripts/format.py -c \${WORKSPACE} -o Linux -a ${arch}"
-                                        Utilities.addArchival(newJob, "format.patch", "", true, false)
-                                        break
-                                    }
-                                
-                                    if (!enableCorefxTesting) {
-                                        // We run pal tests on all OS but generate mscorlib (and thus, nuget packages)
-                                        // only on supported OS platforms.
-                                        if ((os == 'FreeBSD') || (os == 'OpenSUSE13.2'))
-                                        {
-                                            buildCommands += "./build.sh skipmscorlib verbose ${lowerConfiguration} ${arch}"
-                                        }
-                                        else
-                                        {
-                                            def bootstrapRid = Utilities.getBoostrapPublishRid(os)
-                                            def bootstrapRidEnv = bootstrapRid != null ? "__PUBLISH_RID=${bootstrapRid} " : ''
-                                            buildCommands += "${bootstrapRidEnv}./build.sh verbose ${lowerConfiguration} ${arch}"
-                                        }
-                                        buildCommands += "src/pal/tests/palsuite/runpaltests.sh \${WORKSPACE}/bin/obj/${osGroup}.${arch}.${configuration} \${WORKSPACE}/bin/paltestout"
-                                    
-                                        // Set time out
-                                        setTestJobTimeOut(newJob, scenario)
-                                        // Basic archiving of the build
-                                        Utilities.addArchival(newJob, "bin/Product/**,bin/obj/*/tests/**/*.dylib,bin/obj/*/tests/**/*.so")
-                                        // And pal tests
-                                        Utilities.addXUnitDotNETResults(newJob, '**/pal_tests.xml')
-                                    }
-                                    else {
-                                        // Corefx stress testing                                        
-                                        assert os == 'Ubuntu'
-                                        assert architecture == 'x64'
-                                        assert lowerConfiguration == 'checked'
-                                        assert Constants.jitStressModeScenarios.containsKey(scenario)
-                                        
-                                        // Build coreclr
-                                        buildCommands += "./build.sh verbose ${lowerConfiguration} ${architecture}"
-                                        
-                                        def scriptFileName = "\$WORKSPACE/set_stress_test_env.sh"
-                                        buildCommands += genStressModeScriptStep(os, scenario, Constants.jitStressModeScenarios[scenario], scriptFileName)
-
-                                        // Build and text corefx
-                                        def fxRoot = "\$WORKSPACE%/_/fx"
-                                        buildCommands += "python \$WORKSPACE/tests/scripts/run-corefx-tests.cmd -arch ${arch} -build_type ${configuration} -fx_root ${fxRoot} -fx_branch ${branch} -env_script ${scriptFileName}"
-
-                                        // Archive and process test result
-                                        Utilities.addArchival(newJob, "${fxRoot}/bin/tests/**/testResults.xml")
-                                        setTestJobTimeOut(newJob, scenario)
-                                        Utilities.addXUnitDotNETResults(newJob, "${fxRoot}/bin/tests/**/testResults.xml")
-                                    }
-                                    break
-                                case 'arm64':
-                                    // We don't run the cross build except on Ubuntu
-                                    assert os == 'Ubuntu'
-                                    
-                                    buildCommands += """echo \"Using rootfs in /opt/aarch64-linux-gnu-root\"
-                                        ROOTFS_DIR=/opt/aarch64-linux-gnu-root ./build.sh skipmscorlib arm64 cross verbose ${lowerConfiguration}"""
-                                    
-                                    // Basic archiving of the build, no pal tests
-                                    Utilities.addArchival(newJob, "bin/Product/**")
-                                    break
-                                case 'arm':
-                                    // All builds for ARM architecture are run on Ubuntu currently
-                                    assert os == 'Ubuntu'
-                                    if (isLinuxEmulatorBuild == false) {
-                                        buildCommands += """echo \"Using rootfs in /opt/arm-liux-genueabihf-root\"
-                                            ROOTFS_DIR=/opt/arm-linux-genueabihf-root ./build.sh skipmscorlib arm cross verbose ${lowerConfiguration}"""
-                                        
-                                        // Basic archiving of the build, no pal tests
-                                        Utilities.addArchival(newJob, "bin/Product/**")
-                                        break
-                                    }
-                                    else {
-                                        // Make sure the build configuration is either of debug or release
-                                        assert ( lowerConfiguration == 'debug' ) || ( lowerConfiguration == 'release' )
-
-                                        // Setup variables to hold emulator folder path and the rootfs mount path
-                                        def armemul_path = '/opt/linux-arm-emulator'
-                                        def armrootfs_mountpath = '/opt/linux-arm-emulator-root'
-
-                                        // Unzip the Windows test binaries first. Exit with 0
-                                        buildCommands += "unzip -q -o ./bin/tests/tests.zip -d ./bin/tests/Windows_NT.x64.${configuration} || exit 0"
-
-                                        // Unpack the corefx binaries
-                                        buildCommands += "tar -xf ./bin/build.tar.gz"
-
-                                        // Call the ARM emulator build script to cross build and test using the ARM emulator rootfs
-                                        buildCommands += """./tests/scripts/arm32_ci_script.sh \\
-                                        --emulatorPath=${armemul_path} \\
-                                        --mountPath=${armrootfs_mountpath} \\
-                                        --buildConfig=${lowerConfiguration} \\
-                                        --testRootDir=./bin/tests/Windows_NT.x64.${configuration} \\
-                                        --coreFxNativeBinDir=./bin/Linux.arm-softfp.${configuration} \\
-                                        --coreFxBinDir=\"./bin/Linux.AnyCPU.${configuration};./bin/Unix.AnyCPU.${configuration};./bin/AnyOS.AnyCPU.${configuration}\" \\
-                                        --testDirFile=./tests/testsRunningInsideARM.txt"""
-
-
-                                        // Basic archiving of the build
-                                        Utilities.addArchival(newJob, "bin/Product/**")
-                                        break
-                                    }
-                                default:
-                                    println("Unknown architecture: ${architecture}");
-                                    assert false
-                                    break
-                            }
-                            break
-                        // editor brace matching: }
-                        default:
-                            println("Unknown os: ${os}");
-                            assert false
-                            break
-                    } // os
 
                     newJob.with {
                         steps {