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)
Beispiel #2
0
    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)
Beispiel #3
0
    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)
Beispiel #4
0
    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())
Beispiel #5
0
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'])
Beispiel #6
0
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)
Beispiel #7
0
    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
Beispiel #10
0
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
Beispiel #11
0
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)
Beispiel #12
0
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
Beispiel #13
0
 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)
Beispiel #14
0
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)
Beispiel #15
0
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)
Beispiel #16
0
    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
Beispiel #17
0
 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 !')))
Beispiel #18
0
 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 !")
Beispiel #19
0
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)