前面做好了服务的管理,接下来是服务版本的管理,和服务类似,版本也有增删改查。先在服务的管理页面做一个入口,如下图:
需要在上一步的服务管理页面增加按钮、按钮方法,点击按钮跳转时要打开一个新的页面,所以还要增加对应的页面视图。
页面方法
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代码比较多,放到 这里