def post(self, project_id): project = self._get_project(project_id) if project is None: return '', 404 args = self.parser.parse_args() for name, value in args.iteritems(): if value is None: continue # If we're rolling back a snapshot, take note. if name == 'snapshot.current': current = Snapshot.get_current(project.id) if current: # If value is empty, we're deactivating a snapshot without replacing it, # and that's a downgrade too. replacement = value and Snapshot.query.get(value) if not replacement or replacement.date_created < current.date_created: _report_snapshot_downgrade(project) create_or_update(ProjectOption, where={ 'project': project, 'name': name, }, values={ 'value': value, }) return '', 200
def get(self, step_id): jobstep = JobStep.query.options(joinedload( 'project', innerjoin=True), ).get(step_id) if jobstep is None: return '', 404 jobplan = JobPlan.query.filter( JobPlan.job_id == jobstep.job_id, ).first() # determine if there's an expected snapshot outcome expected_image = SnapshotImage.query.filter( SnapshotImage.job_id == jobstep.job_id, ).first() current_image = None # we only send a current snapshot if we're not expecting to build # a new image if not expected_image: current_snapshot = Snapshot.get_current(jobstep.project_id) if current_snapshot and jobplan: current_image = self.get_snapshot_image( current_snapshot.id, jobplan.plan_id) elif current_app.config['DEFAULT_SNAPSHOT']: current_image = { 'id': current_app.config['DEFAULT_SNAPSHOT'], } context = self.serialize(jobstep) context['commands'] = self.serialize(list(jobstep.commands)) context['snapshot'] = self.serialize(current_image) context['expectedSnapshot'] = self.serialize(expected_image) context['project'] = self.serialize(jobstep.project) return self.respond(context, serialize=False)
def get(self, step_id): jobstep = JobStep.query.options( joinedload('project', innerjoin=True), ).get(step_id) if jobstep is None: return '', 404 jobplan = JobPlan.query.filter( JobPlan.job_id == jobstep.job_id, ).first() # determine if there's an expected snapshot outcome expected_image = SnapshotImage.query.filter( SnapshotImage.job_id == jobstep.job_id, ).first() current_image = None # we only send a current snapshot if we're not expecting to build # a new image if not expected_image: current_snapshot = Snapshot.get_current(jobstep.project_id) if current_snapshot and jobplan: current_image = self.get_snapshot_image(current_snapshot.id, jobplan.plan_id) elif current_app.config['DEFAULT_SNAPSHOT']: current_image = { 'id': current_app.config['DEFAULT_SNAPSHOT'], } context = self.serialize(jobstep) context['commands'] = self.serialize(list(jobstep.commands)) context['snapshot'] = self.serialize(current_image) context['expectedSnapshot'] = self.serialize(expected_image) context['project'] = self.serialize(jobstep.project) return self.respond(context, serialize=False)
def execute_build(build, snapshot_id, no_snapshot): if no_snapshot: assert snapshot_id is None, 'Cannot specify snapshot with no_snapshot option' # TODO(dcramer): most of this should be abstracted into sync_build as if it # were a "im on step 0, create step 1" project = build.project # We choose a snapshot before creating jobplans. This is so that different # jobplans won't end up using different snapshots in a build. if snapshot_id is None and not no_snapshot: snapshot = Snapshot.get_current(project.id) if snapshot: snapshot_id = snapshot.id jobs = [] for plan in get_build_plans(project): job = Job( build=build, build_id=build.id, project=project, project_id=project.id, source=build.source, source_id=build.source_id, status=build.status, label=plan.label, ) db.session.add(job) jobplan = JobPlan.build_jobplan(plan, job, snapshot_id=snapshot_id) db.session.add(jobplan) jobs.append(job) db.session.commit() for job in jobs: create_job.delay( job_id=job.id.hex, task_id=job.id.hex, parent_task_id=job.build_id.hex, ) db.session.commit() sync_build.delay( build_id=build.id.hex, task_id=build.id.hex, ) return build
def get(self, step_id): jobstep = JobStep.query.options(joinedload( 'project', innerjoin=True), ).get(step_id) if jobstep is None: return '', 404 current_snapshot = Snapshot.get_current(jobstep.project_id) context = self.serialize(jobstep) context['commands'] = self.serialize(list(jobstep.commands)) context['snapshot'] = self.serialize(current_snapshot) context['project'] = self.serialize(jobstep.project) return self.respond(context, serialize=False)
def post(self, project_id): project = self._get_project(project_id) if project is None: return "", 404 args = self.parser.parse_args() for name, value in args.iteritems(): if value is None: continue # If we're rolling back a snapshot, take note. if name == "snapshot.current": current = Snapshot.get_current(project.id) if current: replacement = Snapshot.query.get(value) if replacement.date_created < current.date_created: _report_snapshot_downgrade(project) create_or_update(ProjectOption, where={"project": project, "name": name}, values={"value": value}) return "", 200