src/templates/index.html \
src/templates/jobs-abort.html \
src/templates/jobs-buildroot.html \
- src/templates/job-schedule-rebuild.html \
- src/templates/job-schedule-test.html \
src/templates/keys-delete.html \
src/templates/keys-import.html \
src/templates/keys-list.html \
return jobs
- def restart_failed(self):
- jobs = self._get_jobs("SELECT jobs.* FROM jobs \
- JOIN builds ON builds.id = jobs.build_id \
- WHERE \
- jobs.type = 'build' AND \
- jobs.state = 'failed' AND \
- NOT builds.state = 'broken' AND \
- jobs.time_finished < NOW() - '72 hours'::interval \
- ORDER BY \
- CASE \
- WHEN jobs.type = 'build' THEN 0 \
- WHEN jobs.type = 'test' THEN 1 \
- END, \
- builds.priority DESC, jobs.time_created ASC")
-
- # Restart the job
- for job in jobs:
- job.restart()
-
class Job(base.DataObject):
table = "jobs"
# Notify users
self.send_failed_message()
- def restart(self, test=None, start_not_before=None):
- # Copy the job and let it build again
- job = self.backend.jobs.create(self.build, self.arch,
- test=test or self.test, superseeds=self)
-
- if start_not_before:
- job.start_not_before = start_not_before
-
- return job
-
def is_active(self):
"""
Returns True if this job is active
# Remaster Repositories
"remaster-repositories" : self.backend.repos.remaster,
- # Restart failed jobs
- "restart-failed-jobs" : self.backend.jobs.restart_failed,
-
# Send bug updates to Bugzilla
"send-bug-updates" : self.backend.bugzilla.send_all,
+++ /dev/null
-{% extends "base.html" %}
-
-{% block title %}{{ _("Schedule rebuild for %s") % job.name }}{% end block %}
-
-{% block body %}
- <ul class="breadcrumb">
- <li>
- <a href="/">{{ _("Home") }}</a>
- <span class="divider">/</span>
- </li>
- <li>
- <a href="/packages">{{ _("Packages") }}</a>
- <span class="divider">/</span>
- </li>
- <li>
- <a href="/package/{{ build.pkg.name }}">{{ build.pkg.name }}</a>
- <span class="divider">/</span>
- </li>
- <li>
- <a href="/build/{{ build.uuid }}">{{ build.pkg.friendly_version }}</a>
- <span class="divider">/</span>
- </li>
- <li class="active">
- <a href="/build/{{ build.uuid }}/schedule?type=rebuild">{{ _("Schedule rebuild") }}</a>
- </li>
- </ul>
-
- <div class="page-header">
- <h1>{{ _("Schedule rebuild for %s") % job.name }}</h1>
- </div>
-
- <div class="row">
- <div class="span6 offset3">
- <p>
- {{ _("At this place, you can submit failed build jobs to be built again.") }}
- </p>
- <p>
- {{ _("The build job will be started when a build slot is available but not before the given time.") }}
- </p>
-
- {% module BuildOffset() %}
- </div>
- </div>
-{% end block %}
+++ /dev/null
-{% extends "base.html" %}
-
-{% block title %}{{ _("Schedule test build for %s") % job.name }}{% end block %}
-
-{% block body %}
- <ul class="breadcrumb">
- <li>
- <a href="/">{{ _("Home") }}</a>
- <span class="divider">/</span>
- </li>
- <li>
- <a href="/packages">{{ _("Packages") }}</a>
- <span class="divider">/</span>
- </li>
- <li>
- <a href="/package/{{ build.pkg.name }}">{{ build.pkg.name }}</a>
- <span class="divider">/</span>
- </li>
- <li>
- <a href="/build/{{ build.uuid }}">{{ build.pkg.friendly_version }}</a>
- <span class="divider">/</span>
- </li>
- <li class="active">
- <a href="/build/{{ build.uuid }}/schedule?type=test">{{ _("Schedule test build") }}</a>
- </li>
- </ul>
-
- <div class="page-header">
- <h1>{{ _("Schedule test build for %s") % build.name }}</h1>
- </div>
-
- <div class="row">
- <div class="span6 offset3">
- <p>
- {{ _("A test build is used to check if a package builds with the current package set.") }}
- {{ _("In this way, developers are able to find quality issues fast and without actively searching for them.") }}
- </p>
- <p>
- {{ _("As this build platform only has a limited amount of performance, test builds only have a very less priority.") }}
- {{ _("However, you can manually request to run a test.") }}
- </p>
- <p>
- {{ _("The build job will be started when a build slot is available but not before the given time.") }}
- {{ _("Please note, that all other kinds of build are preferred over the test builds.") }}
- </p>
-
- {% module BuildOffset() %}
- </div>
- </div>
-{% end block %}
# Jobs
(r"/job/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/abort", jobs.JobAbortHandler),
(r"/job/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/buildroot", jobs.JobBuildrootHandler),
- (r"/job/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/schedule", jobs.JobScheduleHandler),
# Builders
(r"/builders", builders.BuilderListHandler),
buildroot_size=buildroot_size)
-class JobScheduleHandler(base.BaseHandler):
- allowed_types = ("test", "rebuild",)
-
- @tornado.web.authenticated
- def get(self, uuid):
- type = self.get_argument("type")
- assert type in self.allowed_types
-
- job = self.backend.jobs.get_by_uuid(uuid)
- if not job:
- raise tornado.web.HTTPError(404, "Job not found: %s" % uuid)
-
- self.render("job-schedule-%s.html" % type, type=type, job=job, build=job.build)
-
- @tornado.web.authenticated
- def post(self, uuid):
- type = self.get_argument("type")
- assert type in self.allowed_types
-
- job = self.backend.jobs.get_by_uuid(uuid)
- if not job:
- raise tornado.web.HTTPError(404, "Job not found: %s" % uuid)
-
- # Get the start offset.
- offset = self.get_argument("offset", 0)
- try:
- offset = int(offset)
- except TypeError:
- offset = 0
-
- # Is this supposed to be a test job?
- test = (type == "test")
-
- with self.db.transaction():
- new_job = job.restart(test=test)
-
- self.redirect("/job/%s" % new_job.uuid)
-
-
class JobAbortHandler(base.BaseHandler):
def get_job(self, uuid):
job = self.backend.jobs.get_by_uuid(uuid)