Django实现自动发布(2视图-服务版本查找和新增)

前面做好了服务的管理,接下来是服务版本的管理,和服务类似,版本也有增删改查。先在服务的管理页面做一个入口,如下图:

需要在上一步的服务管理页面增加按钮、按钮方法,点击按钮跳转时要打开一个新的页面,所以还要增加对应的页面视图。

页面方法

templates/microservice/service.html 的标签<script type="text/html" id="barDemo">后面 增加内容

  <a class="layui-btn layui-btn-xs " lay-event="version">版本管理</a>

相应的点击方法也加到工具条事件:

if (layEvent === 'version') {
  handleShowVersion(obj);
}

function handleShowVersion(obj){
  var url = '{% url "page_service_versions" 0 %}';
  url = url.replace('0', obj.data.id);
  layer.open({
    type: 2, // 0(信息框,默认)1(页面层)2(iframe层)3(加载层)4(tips层)
    content: url,    // 设置跳转的url,跳转到对应的页面
    area: ["80%", "100%"],
    shadeClose: true, // 点击弹出层的shade可关闭弹出层
  })
}

页面视图

增加一个文件 templates/microservice/version.html

class ServiceVersionPageView(generic.DetailView):
    template_name = 'microservice/version.html'
    model = MicroService
    pk_url_kwarg = 'service_id'

以及页面视图对应的url:

  url(r'^service/(?P<service_id>[0-9]+)/versions/$', views.ServiceVersionPageView.as_view(), name='page_service_versions'),

点击页面按钮即可弹出一个新的窗口,不过目前的页面没有内容,现在就把版本管理添加到页面。

版本管理

查询

版本的查询和服务类似,就直接贴代码了:

class ServiceVersionApi(generic.View):
    def get(self, request, service_id):
        query = request.GET
        page = query.get('page', 1)
        limit = query.get('limit', 20)

        try:
            service = MicroService.objects.get(pk=service_id)
        except MicroService.DoesNotExist:
            return JsonResponse({'msg': '资源不存在', status=404)

        versions = MicroServiceVersion.objects.filter(microservice=service)
        paginator = Paginator(versions, limit)
        pdata = paginator.page(page)
        data = [{
            'id': item.id,
            'name': item.microservice.name,
            'language': item.microservice.language,
            'description': item.description,
            'version': item.version,
            'status': item.get_status_display(),
            'created_by': item.created_by.username,
            'created': item.created,
        } for item in pdata]

        return JsonResponse({
          'data': data,
          'count': versions.count(),
          'code': 0,
        })

相应的url:

url(r'^microservice/(?P<service_id>[0-9]+)/versions/$', views.ServiceVersionApi.as_view(),
        name='api_microservice_versions'),

创建

由于我们是通过git来创建版本,所以版本的创建是在后台完成,我们也可以在页面触发构建任务来创建版本
页面触发时,我们唯一要填的参数就是分支,不填则默认master

这里有个小技巧: 先创建一个版本号为当前时间戳的版本,传递给任务作为参数,在收到回调后更新任务状态和版本号

    def post(self, request, service_id):
        ref = request.POST.get('branch', 'master').strip()
        desc = request.POST.get('description', '').strip()
        try:
            service = MicroService.objects.get(pk=service_id)
        except MicroService.DoesNotExist:
            return JsonResponse({'msg': '资源不存在'}, status=404)

        version = MicroServiceVersion.objects.create(
            microservice=service,
            version='building-' + str(time.time()), # 当前时间戳
            created_by=request.user,
            description=desc,
            ref=ref
        )

        build_params = {
            'variables[SERVICE_ID]': service.id,
            'variables[VERSION_ID]': version.id,
            'variables[SERVICE_NAME]': service.name,
            'variables[USERNAME]': request.user.username,
        }
        try:
            r = requests.post(service.build_url, data=build_params, timeout=10)
        except requests.exceptions.Timeout:
            return JsonResponse({'msg': '调用git 超时'}, status=417)

        if r.status_code >= 200 and r.status_code < 300:
            rdata = r.json()
            return JsonResponse(rdata, status=200)
        return JsonResponse({'msg': '创建任务失败{}'.format(r.content)})

相关的页面和js代码比较多,放到 这里

posted @ 2019-12-08 22:04  葡萄不吐皮  阅读(258)  评论(0编辑  收藏  举报