diff --git a/orchestra/executor.py b/orchestra/executor.py
index 4e26f3a03f1a41ea72667ca89d2a8eea4737e5f4..afa015f5cd9705b7e5a9a63e7d7bc8a5ae7962e3 100644
--- a/orchestra/executor.py
+++ b/orchestra/executor.py
@@ -11,13 +11,14 @@ class Executor:
     def __init__(self, args, threads=1):
         self.args = args
         self.threads = 1
-        self._pending_actions = set()
+        self._pending_actions: List[Action] = []
         self._running_actions: Dict[futures.Future, Action] = {}
         self._failed_actions: List[Action] = []
         self._pool = futures.ThreadPoolExecutor(max_workers=threads, thread_name_prefix="Builder")
 
     def run(self, action, force=False):
         self._collect_actions(action, force=force)
+        self._pending_actions.sort(key=lambda a: a.qualified_name)
 
         if not self._pending_actions:
             logger.info("No actions to perform")
@@ -49,7 +50,7 @@ class Executor:
                     logger.error("An error occurred!")
                     if self._pending_actions:
                         logger.error(f"Waiting for other running actions to terminate: {self._pending_actions}")
-                    self._pending_actions = set()
+                    self._pending_actions = []
                     self._failed_actions.append(action)
                 else:
                     self._schedule_next()
@@ -71,7 +72,7 @@ class Executor:
             return
 
         if action not in self._pending_actions:
-            self._pending_actions.add(action)
+            self._pending_actions.append(action)
             for dep in action.dependencies:
                 self._collect_actions(dep)