[snowpatch] [PATCH v2] main: Run multiple branch tests in parallel

Andrew Donnellan ajd at linux.ibm.com
Thu Jun 6 17:17:50 AEST 2019


Spawn multiple Jenkins tests for different branches in parallel for the
same patch.

This is very very simplistic but should significantly enhance Jenkins
utilisation.

Signed-off-by: Andrew Donnellan <ajd at linux.ibm.com>

---
v1->v2:
- cargo fmt
---
 src/main.rs | 46 +++++++++++++++++++++++++++++-----------------
 1 file changed, 29 insertions(+), 17 deletions(-)

diff --git a/src/main.rs b/src/main.rs
index 5ec0c37b2d7f..02c5e5574e0d 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -208,6 +208,9 @@ fn test_patch(
     push_opts.remote_callbacks(push_callbacks);
 
     let mut successfully_applied = false;
+
+    let mut test_threads = vec![];
+
     for branch_name in project.branches.clone() {
         let tag = format!("{}_{}", tag, branch_name);
         info!("Configuring local branch for {}.", tag);
@@ -285,30 +288,39 @@ fn test_patch(
         let base = commit.id().to_string();
 
         // We've set up a remote branch, time to kick off tests
-        let test = thread::Builder::new()
-            .name(tag.to_string())
-            .spawn(move || {
-                run_tests(
-                    &settings,
-                    client,
-                    &project,
-                    &tag,
-                    &branch_name,
-                    &base,
-                    hefty_tests,
-                )
-            })
-            .unwrap();
-        results.append(&mut test.join().unwrap());
+        let test = thread::Builder::new().name(tag.to_string()).spawn(move || {
+            run_tests(
+                &settings,
+                client,
+                &project,
+                &tag,
+                &branch_name,
+                &base,
+                hefty_tests,
+            )
+        });
 
-        // Delete the remote branch now it's not needed any more
-        git::push_to_remote(&mut remote, &branch, true, &mut push_opts).unwrap();
+        match test {
+            Ok(thread) => test_threads.push((thread, branch)),
+            Err(e) => {
+                error!("Error spawning thread: {}", e);
+                git::push_to_remote(&mut remote, &branch, true, &mut push_opts).unwrap();
+            }
+        }
 
         if !test_all_branches {
             break;
         }
     }
 
+    // Wait for results
+    for (thread, branch) in test_threads {
+        results.append(&mut thread.join().unwrap());
+
+        // Delete the remote branch now it's not needed any more
+        git::push_to_remote(&mut remote, &branch, true, &mut push_opts).unwrap();
+    }
+
     if !successfully_applied {
         results.push(TestResult {
             state: TestState::Fail,
-- 
2.20.1



More information about the snowpatch mailing list