def record_failure_reasons(job: Job): has_failures = db.session.query( TestCase.query.filter( TestCase.job_id == job.id, TestCase.result == Result.failed).exists()).scalar() any_failures = False if has_failures: any_failures = True try: with db.session.begin_nested(): db.session.add( FailureReason( job_id=job.id, repository_id=job.repository_id, reason=FailureReason.Reason.failing_tests, )) except IntegrityError: pass if any_failures and job.result == Result.passed: job.result = Result.failed db.session.add(job) db.session.flush()
def put(self, job: Job): """ Update a job. """ result = self.schema_from_request(job_schema, partial=True) if result.errors: return self.respond(result.errors, 403) prev_status = job.status for key, value in result.data.items(): if getattr(job, key) != value: setattr(job, key, value) if db.session.is_modified(job): if job.status == Status.queued: job.date_started = None job.result = Result.unknown elif job.status == Status.in_progress and prev_status != Status.in_progress: # TODO(dcramer): this is effectively 'restart' on a job, and we need to # decide how Zeus should deal with it. We either could orphan/hide/remove the # current job, or alternatively we would want to truncate all of its children # which is fairly complex. if not result.data.get("date_started"): job.date_started = timezone.now() if "result" not in result.data: job.result = Result.unknown if ( job.status == Status.finished and prev_status != job.status and not result.data.get("date_finished") ): job.date_finished = timezone.now() if not job.date_started: job.date_started = job.date_created elif job.status != Status.finished: job.date_finished = None if job.status == Status.finished and has_unprocessed_artifacts(job.id): job.status = Status.collecting_results db.session.add(job) db.session.commit() aggregate_build_stats_for_job.delay(job_id=job.id) return self.respond_with_schema(job_schema, job)
def record_failure_reasons(job: Job): has_failures = db.session.query( TestCase.query.filter( TestCase.job_id == job.id, TestCase.result == Result.failed, ).exists()).scalar() any_failures = False if has_failures: any_failures = True db.session.add( FailureReason( job_id=job.id, repository_id=job.repository_id, reason=FailureReason.Code.failing_tests, )) if any_failures and job.result == Result.passed: job.result = Result.failed db.session.add(job) db.session.flush()