]> git.ipfire.org Git - pbs.git/commitdiff
builds: Show any created test builds
authorMichael Tremer <michael.tremer@ipfire.org>
Wed, 3 May 2023 18:14:17 +0000 (18:14 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Wed, 3 May 2023 18:14:17 +0000 (18:14 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
Makefile.am
src/buildservice/builds.py
src/templates/builds/groups/modules/list.html [new file with mode: 0644]
src/templates/builds/show.html
src/web/__init__.py
src/web/builds.py

index 23593c5c42774d9a7e1e816be3489e01f8e59365..0e90e1a42002bde8a6222d9572682a54fe976421 100644 (file)
@@ -184,6 +184,13 @@ dist_templates_builds_DATA = \
 
 templates_buildsdir = $(templatesdir)/builds
 
+templates_builds_groupsdir = $(templates_buildsdir)/groups
+
+dist_templates_builds_groups_modules_DATA = \
+       src/templates/builds/groups/modules/list.html
+
+templates_builds_groups_modulesdir = $(templates_builds_groupsdir)/modules
+
 dist_templates_builds_messages_DATA = \
        src/templates/builds/messages/comment.txt \
        src/templates/builds/messages/failed.txt \
index e0b5cd0735cbfd420828ad9af635a78b14262f4d..3f687901078bd9971c46eff45c088a1a461b8ff1 100644 (file)
@@ -679,6 +679,18 @@ class Build(base.DataObject):
 
                return False
 
+       def has_failed(self):
+               """
+                       Returns True if this build has failed
+               """
+               return self.has_finished() and self.data.failed
+
+       def is_successful(self):
+               """
+                       Returns True if this build was successful
+               """
+               return self.has_finished() and not self.data.failed
+
        def _send_email(self, *args, exclude=None, **kwargs):
                """
                        Convenience function which sends an email to everybody who would care
@@ -1032,6 +1044,9 @@ class Group(base.DataObject):
        def __iter__(self):
                return iter(self.builds)
 
+       def __len__(self):
+               return len(self.builds)
+
        # UUID
 
        @property
@@ -1062,6 +1077,20 @@ class Group(base.DataObject):
 
                return list(builds)
 
+       @property
+       def successful_builds(self):
+               """
+                       Returns all successful builds in this group
+               """
+               return [b for b in self.builds if b.is_successful()]
+
+       @property
+       def failed_builds(self):
+               """
+                       Returns all failed builds in this group
+               """
+               return [b for b in self.builds if b.has_failed()]
+
        # Delete
 
        async def delete(self, user=None):
@@ -1079,6 +1108,26 @@ class Group(base.DataObject):
        def deleted_at(self):
                return self.data.deleted_at
 
+       # Functions to find out whether this was all successful/failed
+
+       def has_failed(self):
+               """
+                       Returns True if at least one job has failed
+               """
+               return any((b.has_failed() for b in self.builds))
+
+       def is_successful(self):
+               """
+                       Returns True if all jobs have been successful
+               """
+               return all((b.is_successful() for b in self.builds))
+
+       def has_finished(self):
+               """
+                       Returns True if all builds have finished
+               """
+               return all((b.has_finished() for b in self.builds))
+
 
 class Comments(base.Object):
        def _get_comments(self, query, *args):
diff --git a/src/templates/builds/groups/modules/list.html b/src/templates/builds/groups/modules/list.html
new file mode 100644 (file)
index 0000000..9f14c7f
--- /dev/null
@@ -0,0 +1,61 @@
+<nav class="panel
+               {% if group.has_failed() %}
+                       is-danger
+               {% elif group.is_successful() %}
+                       is-success
+               {% end %}">
+       <p class="panel-heading">
+               XXX?
+
+               <span class="tags is-pulled-right">
+                       {% if group.failed_builds %}
+                               <span class="tag is-danger">
+                                       {{ _("%(num)s Failed", "%(num)s Failed", len(group.failed_builds)) \
+                                               % { "num" : len(group.failed_builds) } }}
+                               </span>
+                       {% end %}
+
+                       {% if group.successful_builds %}
+                               <span class="tag is-success">
+                                       {{ _("%(num)s Successful", "%(num)s Successful", len(group.successful_builds)) \
+                                               % { "num" : len(group.successful_builds) } }}
+                               </span>
+                       {% end %}
+               </span>
+       </p>
+
+       {% for build in group %}
+               <a class="panel-block" href="/builds/{{ build.uuid }}">
+                       {% if build.has_failed() %}
+                               <span class="panel-icon has-text-danger">
+                                       <i class="fas fa-xmark" aria-hidden="true"></i>
+                               </span>
+                       {% elif build.is_successful() %}
+                               <span class="panel-icon has-text-success">
+                                       <i class="fas fa-check" aria-hidden="true"></i>
+                               </span>
+                       {% end %}
+
+                       {{ build }}
+
+                       {# Show which builds have failed (if any) #}
+                       {% if build.has_failed() %}
+                               {% for job in build.jobs %}
+                                       {% if job.is_aborted() %}
+                                               <span class="tag is-dark">{{ job.arch }}</span>
+                                       {% elif job.has_failed() %}
+                                               <span class="tag is-danger">{{ job.arch }}</span>
+                                       {% end %}
+                               {% end %}
+                       {% end %}
+               </a>
+       {% end %}
+
+       {# Show a button to see all builds in this group #}
+       {% if limit and limit < len(group) %}
+               {# XXX needs styling #}
+               <a class="panel-block" href="/builds/groups/{{ group.uuid }}">
+                       {{ _("Show all") }}
+               </a>
+       {% end %}
+</nav>
index 8e68561069052dcdac8a66d0c541ac36cd0cf23b..2cacd7115eb01973c3f90ac451740bb137f5092b 100644 (file)
                </section>
        {% end %}
 
+       {% if build.test_builds %}
+               <section class="section">
+                       <h5 class="title is-5">{{ _("Test Builds")}}</h5>
+
+                       {% module BuildGroupList(build.test_builds, limit=8) %}
+               </section>
+       {% end %}
+
        {# Log #}
        <section class="section">
                <h5 class="title is-5">{{ _("Log") }}</h5>
index ada334332ee783b90009ad3cfb0ea1d37280c164..5424103422ab83cd30f7a646099c7fab4638b714 100644 (file)
@@ -46,6 +46,9 @@ class Application(tornado.web.Application):
                                # Builds
                                "BuildsList"         : builds.ListModule,
 
+                               # BuildGroups
+                               "BuildGroupList"     : builds.GroupListModule,
+
                                # Builders
                                "BuilderStats"       : builders.StatsModule,
 
index ff1694d8434ff0f0b4def9add1c765d36aa5a499..a9e81ded21822e849451b35d58011ac23312d908 100644 (file)
@@ -161,3 +161,9 @@ class CommentHandler(base.BaseHandler):
 class ListModule(ui_modules.UIModule):
        def render(self, builds):
                return self.render_string("builds/modules/list.html", builds=builds)
+
+
+class GroupListModule(ui_modules.UIModule):
+       def render(self, group, limit=None):
+               return self.render_string("builds/groups/modules/list.html",
+                       group=group, limit=limit)