]> git.ipfire.org Git - pbs.git/commitdiff
builds: Add callbacks for build groups
authorMichael Tremer <michael.tremer@ipfire.org>
Fri, 12 May 2023 18:44:16 +0000 (18:44 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Fri, 12 May 2023 18:44:16 +0000 (18:44 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
src/buildservice/builds.py

index cb5c508958900ba8b4ae8db603fd52e12a6d5eef..c08a9c0283c56f2b5224152b0a18386a453ba4f8 100644 (file)
@@ -632,6 +632,8 @@ class Build(base.DataObject):
                """
                        Called when this build has successfully finished
                """
+               builds = None
+
                # Log this
                if success:
                        log.info("Build %s has finished" % self)
@@ -654,7 +656,13 @@ class Build(base.DataObject):
 
                # Create any test builds
                if success:
-                       return await self.create_test_builds()
+                       builds = await self.create_test_builds()
+
+               # Notify the group that build has finished
+               if self.group:
+                       await self.group._build_finished(self)
+
+               return builds
 
        def has_finished(self):
                """
@@ -1081,6 +1089,12 @@ class Group(base.DataObject):
        def created_at(self):
                return self.data.created_at
 
+       # Finished At
+
+       @property
+       def finished_at(self):
+               return self.data.finished_at
+
        # Builds
 
        @lazy_property
@@ -1148,22 +1162,77 @@ class Group(base.DataObject):
 
        def has_failed(self):
                """
-                       Returns True if at least one job has failed
+                       Returns True if at least one build has failed
                """
-               return any((b.has_failed() for b in self.builds))
+               return self.failed is True
 
        def is_successful(self):
                """
                        Returns True if all jobs have been successful
                """
-               return all((b.is_successful() for b in self.builds))
+               return self.has_finished() and self.failed is False
 
        def has_finished(self):
+               """
+                       Returns True if all builds have finished
+               """
+               if self.data.finished_at:
+                       return True
+
+               return False
+
+       def all_finished(self):
                """
                        Returns True if all builds have finished
                """
                return all((b.has_finished() for b in self.builds))
 
+       def is_test(self):
+               """
+                       Returns True if this is a test group (i.e. all builds are test builds)
+               """
+               return all((b.is_test() for b in self.builds))
+
+       async def _build_finished(self, build):
+               """
+                       Called when a build has finished
+               """
+               # Fail this group if one build has failed
+               if build.has_failed():
+                       await self.failed()
+
+               # Finished when all builds have finished
+               if self.all_finished():
+                       await self.finished()
+
+       async def finished(self):
+               """
+                       Called when all builds in this group have finished
+               """
+               # Only call once
+               if self.has_finished():
+                       return
+
+               log.info("Build group %s has finished" % self)
+
+               # Mark as finished
+               self._set_attribute_now("finished_at")
+
+               # XXX call the build that that has created this group for test builds
+
+       async def failed(self):
+               """
+                       Called when this group is considered failed
+               """
+               # Do nothing if already failed
+               if self.has_failed():
+                       return
+
+               log.error("Build group %s has failed" % self)
+
+               # Mark as failed
+               self._set_attribute("failed", True)
+
 
 class Comments(base.Object):
        def _get_comments(self, query, *args):