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

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

页面方法

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代码比较多,放到 这里

Django实现自动发布(2视图-服务版本查找和新增)的更多相关文章

  1. Django实现自动发布(2视图-服务管理)

    通常页面要能对资源进行增删改查,对应http的 POST.DELETE.UPDATE.GET 页面显示使用了layui,而layui的表格有自己的数据获取方式,所以我们的视图要做一些调整,不使用后端渲 ...

  2. Django实现自动发布(2视图-任务接收)

    上一篇服务版本的新增,是通过触发 gitlab 任务来实现的,那么如何得到任务的最终状态呢? 好在 gitlab 为我们提供了webhook,也就是消息钩子,可以发送pipeline消息到我们指定的地 ...

  3. 解决GP服务产生的结果无法自动发布为地图服务的问题

    在ArcGIS for Javascript API或REST API调用GP服务时,常常会遇到这样一种情况:GP服务运行以后,执行成功,也能够生成结果,然而结果并没有直接产生动态的地图服务供API调 ...

  4. Django实现自动发布(1数据模型)

    公司成立之初,业务量较小,一个程序包揽了所有的业务逻辑,此时服务器数量少,上线简单,基本开发-测试-上线都是由开发人员完成. 随着业务量逐渐上升,功能增多,代码量增大,而单一功能上线需要重新编译整个程 ...

  5. Django实现自动发布(3发布-升级和回退)

    发布实际上就是将服务的某个版本和一台主机关联,我用一张表(MicroServiceInstance)记录了主机id.服务id.版本id,目前一台主机只能部署一个版本,所以主机id和服务id要做联合索引 ...

  6. Django实现自动发布(3发布-安装)

    相对于服务的升级.回退,新部署一个服务要复杂一些,要满足以下要求: 已经运行了服务实例的主机不能重复部署 进程启动需要的配置文件要先同步到主机上 之前的升级.回退都是指进程的操作,不涉及配置文件的变更 ...

  7. Nacos发布0.5.0版本,轻松玩转动态 DNS 服务

    阿里巴巴微服务开源项目Nacos于近期发布v0.5.0版本,该版本主要包括了DNS-basedService Discovery,对Java 11的支持,持续优化Nacos产品用户体验,更深度的与Sp ...

  8. GeoServer自动发布地图服务

    1 NetCDF气象文件自动发布案例 GeoServer是一个地理服务器,提供了管理页面进行服务发布,样式,切片,图层预览等一系列操作,但是手动进行页面配置有时并不满足业务需求,所以GeoServer ...

  9. 自动发布工具版本从python2升级成python3后遇到的种种问题(涉及paramiko,Crypto,zipfile等等)

    从在公司实习到正式入职,一直还在被同事使用的是我写的一个自动发布工具.该工具的主要功能是:开发人员给出需要更新的代码包(zip格式),测试人员将该代码包部署到测服,这些代码包和JIRA数据库里的项目信 ...

随机推荐

  1. CSS3 弹性盒布局

    一.伸缩布局 CSS3 在布局方面做了非常大的改进,使得我们对块级元素的布局排列变得十分灵活,适应性非常强,其强大的伸缩性,在响应式开中可以发挥极大的作用. 二.定义 Flexbox 语法格式: di ...

  2. Springboot生成二维码并下载图片png支持打包成zip

    pom.xml <!--二维码--> <dependency> <groupId>com.google.zxing</groupId> <arti ...

  3. Odoo Controller详解

    转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10826241.html 一:Controller 一般通过继承的形式来创建controller类,继承自od ...

  4. 【VNCserver】Centos7.4安装VNC连接华为云或亚马逊云

    1.1 文档背景 CentOS 7 / RHEL 7部署图形化界面 安装VNCserver实现linux系统云主机桌面化,通过普通用户实现桌面化操作 2.  Vncserver服务端部署 2.1 安装 ...

  5. Ansible--项目实战

    Ansible项目实战lnmp 项目规划 通过ansible roles配置lnmp环境,nginx通过源码编译安装,php通过源码编译安装,mysql通过yum安装(mysql源码编译超级慢)支持系 ...

  6. 洛谷 P1522 牛的旅行 Cow Tours

    题目链接:https://www.luogu.org/problem/P1522 思路:编号,然后跑floyd,这是很清楚的.然后记录每个点在这个联通块中的最远距离. 然后分连通块,枚举两个点(不属于 ...

  7. java内部类的本质

    连接与通信,作为桥接中间件存在. 内部类和主体类可以无障碍通信: 1.通过继承连接实现: 2.通过接口连接通信: 形式: 1.命名空间: 2.运行上下文: 其它: 信息隐藏是次要功能. 内部类 Jav ...

  8. linux MySQL5.7 rpm安装(转)

    删除旧包: # rpm -qa | grep -i mysql # rpm -ev mysql-libs-* --nodeps 安装rpm包: # rpm -ivh mysql-community-c ...

  9. js字符串转换为JSON

    1. json字符串 jsStr =  “{"a":'xxx', "b":'yyy'}” JSON.parse(jsStr); //可以将json字符串转换成j ...

  10. JS的ES6扩展

    1.字符串扩展 1. includes(str) : 判断是否包含指定的字符串 2. startsWith(str) : 判断是否以指定字符串开头 3. endsWith(str) : 判断是否以指定 ...