def run(dry_run): jenkins_instances = queries.get_jenkins_instances() settings = queries.get_app_interface_settings() for instance in jenkins_instances: if instance.get('deleteMethod') != 'manual': continue managed_projects = instance.get('managedProjects') if not managed_projects: continue instance_name = instance['name'] token = instance['token'] jenkins = JenkinsApi(token, ssl_verify=False, settings=settings) all_job_names = jenkins.get_job_names() managed_job_names = \ get_managed_job_names(all_job_names, managed_projects) desired_job_names = get_desired_job_names(instance_name) delete_job_names = [ j for j in managed_job_names if j not in desired_job_names ] for job_name in delete_job_names: logging.info(['delete_job', instance_name, job_name]) if not dry_run: jenkins.delete_job(job_name)
def post(self,request,pid,sid,id): if request.is_ajax(): group_list = request.POST.getlist('group_list','') operation = request.POST.get('operation','') environment = request.POST.get('environment','') ret = { 'status':False, 'msg':'' } group_list = [ i[0] for i in Group.objects.filter(id__in=group_list).values_list('name') ] environment = Environment.objects.filter(pk=environment).first().environment_name if group_list and operation and environment: j_obj = JenkinsJob.objects.filter(pk=id).first() if j_obj: parameters = {'group_list':','.join(group_list),'operation':operation,'environment':environment} jkh = JenkinsApi(j_obj.jenkins_server) build_number,building = jkh.build_job(j_obj.job_name,parameters) ret['status'] = True ret['build_number'] = build_number ret['building'] = building else: ret['msg'] = 'no job find' else: ret['msg'] = '参数不全' return JsonResponse(ret)
def get(self,request,jid): if request.is_ajax(): ret = { 'status':False, 'msg':'' } job_obj = JenkinsJob.objects.filter(id=jid).first() bid = request.GET.get('bid','') if job_obj and bid: jk_handler = JenkinsApi(jsever_obj=job_obj.jenkins_server) ret = jk_handler.get_build_console_output(job_obj.job_name,bid) else: ret['msg'] = 'get job failed !' return JsonResponse(ret)
def get(self,request,id): j_obj = JenkinsJob.objects.filter(pk=id).first() id = j_obj.pk pid = j_obj.project.pk sid = j_obj.jenkins_server.pk if request.is_ajax(): jk_handler = JenkinsApi(j_obj.jenkins_server) job_info_dict = jk_handler.server.get_job_info(j_obj.job_name) buid_info_list = job_info_dict['builds'] p = CustomPaginator(buid_info_list, request, page_size=4) page_content = p.gen_page_html() ret = { 'table_config': self.table_config, 'data_list': p.get_current_page_object_list(), 'page_content': page_content, } return JsonResponse(ret) return render(request,'jkmgr/build_list.html',locals())
def code_release(pk, deploy): """ 后台执行上线任务(后台jenkins构建任务) :param deploy: Deploy实例(申请上线会往数据库里插一条记录,传过来的就是这条记录) :return: """ # jenkins = JenkinsApi() # number = jenkins.get_next_build_number(deploy['name']) # # Tag是自己在jenkins命名的tag变量名 # jenkins.build_job(deploy['name'], parameters={'Tag': deploy['version']}) # sleep(20) # console_output = jenkins.get_build_console_output(deploy['name'], number) # deploy["console_output"] = console_output # # deploy.save() jenkins = JenkinsApi() number = jenkins.get_next_build_number(deploy['name']) # Tag是自己在jenkins命名的tag变量名 jenkins.build_job(deploy['name'], parameters={'Tag': deploy['version']}) time.sleep(15) console_output = jenkins.get_build_console_output(deploy['name'], number) deploy['console_output'] = console_output Deploy.objects.filter(pk=pk).update(**deploy) # return deploy return '[{}] Project release completed.......'.format(deploy['name'])
def save_job_before(sender, instance, raw, update_fields, **kwargs): old = JenkinsJob.objects.filter(pk=instance.pk).first() if old: js_obj = JenkinsApi(instance.jenkins_server) if old and old.job_name != instance.job_name: js_obj.rename_job(old.job_name, instance.job_name) if old.svn_url != instance.svn_url: old_svn_url = js_obj.get_job_svn_url(instance.job_name) if old_svn_url != instance.svn_url: js_obj.set_svn_url(instance)
def duplicate_jenkins_job(modeladmin, request, queryset): try: object_list = [] for object in queryset: object.id=None jenkins_server = object.jenkins_server old_name = object.job_name new_name ="%s_copy" % object.job_name js_obj = JenkinsApi(jenkins_server) js_obj.copy_job(old_name,new_name) object.job_name=new_name object_list.append(object) models.JenkinsJob.objects.bulk_create(object_list) modeladmin.message_user(request, "copy successfull !", level=messages.INFO) except Exception as e: msg = traceback.format_exc() print(msg) modeladmin.message_user(request,"job exist!",level=messages.ERROR)
def get_jenkins_map(): gqlapi = gql.get_api() jenkins_instances = gqlapi.query(INSTANCES_QUERY)['instances'] jenkins_map = {} for instance in jenkins_instances: instance_name = instance['name'] if instance_name in jenkins_map: continue instance_plugins = instance['plugins'] if not instance_plugins: continue token = instance['token'] jenkins = JenkinsApi(token, False) jenkins_map[instance_name] = jenkins return jenkins_map
def get_jenkins_map(plugins_only=False): gqlapi = gql.get_api() jenkins_instances = gqlapi.query(INSTANCES_QUERY)['instances'] settings = queries.get_app_interface_settings() jenkins_map = {} for instance in jenkins_instances: instance_name = instance['name'] if instance_name in jenkins_map: continue if plugins_only and not instance['plugins']: continue token = instance['token'] jenkins = JenkinsApi(token, ssl_verify=False, settings=settings) jenkins_map[instance_name] = jenkins return jenkins_map
def get_jenkins_map(): gqlapi = gql.get_api() permissions = gqlapi.query(PERMISSIONS_QUERY)['permissions'] jenkins_permissions = \ [p for p in permissions if p['service'] == 'jenkins-role'] jenkins_map = {} for jp in jenkins_permissions: instance = jp['instance'] instance_name = instance['name'] if instance_name in jenkins_map: continue token = instance['token'] jenkins = JenkinsApi(token, False) jenkins_map[instance_name] = jenkins return jenkins_map
def code_release(deploy): """ 后台执行上线任务(后台jenkins构建任务) :param deploy: Deploy实例(申请上线会往数据库里插一条记录,传过来的就是这条记录) :return: """ jenkins = JenkinsApi() number = jenkins.get_next_build_number(deploy.name) jenkins.build_job(deploy.name, parameters={'tag': deploy.version}) sleep(30) console_output = jenkins.get_build_console_output(deploy.name, number) deploy.console_output = console_output deploy.save() return '[{}] Project release completed.......'.format(deploy.name)
def get_jenkins_map(): gqlapi = gql.get_api() permissions = gqlapi.query(PERMISSIONS_QUERY)['permissions'] settings = queries.get_app_interface_settings() jenkins_permissions = \ [p for p in permissions if p['service'] == 'jenkins-role'] jenkins_map = {} for jp in jenkins_permissions: instance = jp['instance'] instance_name = instance['name'] if instance_name in jenkins_map: continue token = instance['token'] jenkins = JenkinsApi(token, ssl_verify=False, settings=settings) jenkins_map[instance_name] = jenkins return jenkins_map
def update(self, request, *args, **kwargs): pk = int(kwargs.get("pk")) data = (request.data).dict() print(data) print(data['name']) print(data['version']) jenkins = JenkinsApi() number = jenkins.get_next_build_number(data['name']) jenkins.build_job(data['name'], parameters={'tag': data['version']}) sleep(10) console_output = jenkins.get_build_console_output(data['name'], number) data['console_output'] = console_output print(data) Deploy.objects.filter(pk=pk).update(**data) return Response(status=status.HTTP_204_NO_CONTENT)
def save_job_after(sender, instance, created, raw, update_fields, **kwargs): if created: jk_server = instance.jenkins_server jk_handler = JenkinsApi(jk_server) jk_handler.create_job(instance)
def release_code(pk, project_name, number): jenkins = JenkinsApi() start_time = time() data = {} sleep(10) while True: if (jenkins.get_build_info(project_name, number)) == "SUCCESS": data["release_status"] = 1 # print(data) # Deploy.objects.filter(pk=pk).update(**data) break elif (jenkins.get_build_info(project_name, number)) == "ABORTED": data["release_status"] = 2 # print(data) # Deploy.objects.filter(pk=pk).update(**data) break elif (jenkins.get_build_info( project_name, number)) == "FAILURE" or (time() - start_time) > 600: jenkins.stop_build(project_name, number) data["release_status"] = 3 # print(data) # Deploy.objects.filter(pk=pk).update(**data) break else: console_output = jenkins.get_build_console_output( project_name, number) data['console_output'] = console_output Deploy.objects.filter(pk=pk).update(**data) console_output = jenkins.get_build_console_output(project_name, number) data['console_output'] = console_output # data['status'] = 4 Deploy.objects.filter(pk=pk).update(**data) return project_name # return '[{}] Project release completed.......'.format(project_name) # return Response(serializer.data) # @app.task(name='release') # def release_code(pk,deploy): # jenkins = JenkinsApi() # start_time = time() # number = jenkins.get_next_build_number(deploy["project_name"]) # data = {} # sleep(15) # while True: # if (jenkins.get_build_info(deploy["project_name"], number)) == "SUCCESS": # release_status = 1 # deploy['release_status'] = release_status # print(data) # Deploy.objects.filter(pk=pk).update(**deploy) # # break # elif (jenkins.get_build_info(deploy["project_name"], number)) == "ABORTED": # release_status = 3 # deploy['release_status'] = release_status # print(data) # Deploy.objects.filter(pk=pk).update(**deploy) # # deploy.save() # break # # elif (jenkins.get_build_info(project_name, number)) == "FAILURE" or (time() - start_time) > 300: # elif (jenkins.get_build_info(deploy["project_name"], number)) == "FAILURE": # release_status = 2 # deploy['release_status'] = release_status # print(data) # Deploy.objects.filter(pk=pk).update(**deploy) # # deploy.save() # break # return '[{}] Project release completed.......'.format(project_name) # return '[{}] Project release completed.......'.format(deploy.name)
def partial_update(self, request, *args, pk=None, **kwargs): pk = int(pk) # print(pk) # serializer = self.get_serializer(data=request.data,) data = request.data # print(data) if data['status'] == 2: project_user = Project.objects.filter( project_name=data["project_name"]).values("audit_user") project_name = [r['audit_user'] for r in project_user] # print(project_user) # print(project_name) applicant = self.request.user # print(applicant.id) role = applicant.groups.all().values('name') # print(role) role_name = [r['name'] for r in role] data.pop("project_name") # print(data) # print(data['status']) if (applicant.id in project_name and "PMO" in role_name) or "SA" in role_name: Deploy.objects.filter(pk=pk).update(**data) return Response(status=status.HTTP_204_NO_CONTENT) else: return Response(status=status.HTTP_500_INTERNAL_SERVER_ERROR) elif data['status'] == 3: project_user = Project.objects.filter( project_name=data["project_name"]).values("release_user") project_name = [r['release_user'] for r in project_user] # print(project_user) # print(project_name) applicant = self.request.user # print(applicant.id) role = applicant.groups.all().values('name') # print(role) role_name = [r['name'] for r in role] #手动更新发布时间 deploy_time = datetime.datetime.now() # print(deploy_time) data['deploy_time'] = deploy_time #增加权控制,必须是 项目列表中的人员并且 在对应组中。SA 有所有权限 if (applicant.id in project_name and "QA" in role_name) or "SA" in role_name: jenkins = JenkinsApi() #当前的构建号 number = jenkins.get_next_build_number(data['project_name']) project_name = data['project_name'] # print(type(number)) #print(number) # jenkins.build_job(data['project_name'], parameters={'tag': data['version']}) #进行发布操作 jenkins.build_job(data['project_name']) #查询发布返回值 # sleep(30) # start_time = time() # while True: # if (jenkins.get_build_info(project_name, number)) == "SUCCESS": # data["release_status"] = 1 # break # elif (jenkins.get_build_info(project_name, number)) == "ABORTED": # data["release_status"] = 3 # break # elif (jenkins.get_build_info(project_name, number)) == "FAILURE" or (time() - start_time) > 60: # data["release_status"] = 2 # break release_code.delay(pk, project_name, number) # add.delay(1,4) # release_code.delay(pk,data) # 弹出项目名,因为不需要修改 data.pop("project_name") # print(data) # print(type(data)) # print(data) # sleep(30) # console_output = jenkins.get_build_console_output(data['name'], number) # data['console_output'] = console_output # print('2222') Deploy.objects.filter(pk=pk).update(**data) # sleep(20) # while (jenkins.get_build_info(project_name, number)) != "SUCCESS": # print(1) return Response(status=status.HTTP_204_NO_CONTENT) # else: # pass # return Response(status=status.HTTP_500_INTERNAL_SERVER_ERROR) else: pass
def clean(self): self.ping_jk_server() jenkins_server = self.cleaned_data['jenkins_server'] jk_handler = JenkinsApi(jenkins_server) if jk_handler.server.job_exists(self.cleaned_data['job_name']): self.add_error("job_name", forms.ValidationError(_('job exist in jenkins server !')))
def ping_jk_server(self): jk_handler = JenkinsApi(self.cleaned_data['jenkins_server']) if not jk_handler.jk_ping(): raise forms.ValidationError("Can't connect jenkins server !")
def delete_job_after(sender, instance, **kwargs): js_obj = JenkinsApi(instance.jenkins_server) if js_obj.jk_ping(): js_obj.delete_job(instance.job_name)