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

原文地址:https://www.cnblogs.com/wbjxxzx/p/12008195.html

时间: 2024-10-29 21:58:16

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

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

上一篇服务版本的新增,是通过触发 gitlab 任务来实现的,那么如何得到任务的最终状态呢? 好在 gitlab 为我们提供了webhook,也就是消息钩子,可以发送pipeline消息到我们指定的地址. 当我们收到消息后,就可以跟据任务的最终状态(成功or失败)来更新数据库里相应的版本: 失败时直接更新任务状态为失败 成功时除了更新状态,还要记录版本的路径 版本的存储路径 gitlab 的pipeline任务有一个递增的ID号,我们可以直接拿过来使用,以此ID为版本目录,打包好的服务就存放在该

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

发布实际上就是将服务的某个版本和一台主机关联,我用一张表(MicroServiceInstance)记录了主机id.服务id.版本id,目前一台主机只能部署一个版本,所以主机id和服务id要做联合索引. 当我们操作某个实例时(升级.回退),为了防止其他人也进行相关操作,要对实例当前的状态就行判断,这里用 locked 标记. 升级.回退操作类似,都是更新MicroServiceInstance表记录的版本id,可以放在一个视图里实现. 升级回退页面 点击页面的版本管理,则弹出对应服务的版本列表页

Django实现自动发布(4配置文件管理)

新部署一个服务时,除了服务本身,还有它启动依赖的配置文件也要一并发布到目标主机.配置文件从哪里来?如何发送到目标主机?修改后如何同步? 我们可以在页面提供上传或新增功能,为每个服务保存一份默认的配置文件包,新部署时将此包的内容写入etcd,由主机上的守护进程去同步,后续的修改也只是更新etcd里的内容,原理请见 配置文件那些事 实际上服务的配置文件不只有默认包,每次修改内容都会创建一个新的包,这个包里的所有版本号都应可应用到该服务的每个实例,因此需要记录服务有哪些配置文件版本号.实例当前关联的版

使用Jenkins自动发布Windows服务项目

不同于发布Web项目,自动发布Windows服务项目需要解决以下几个问题: 如何远程停止和开启服务?需要在发布前停止服务,在发布完成后开启服务. 如何上传编译文件到目标服务器? 问题1:如何远程停止和开启服务 在msbuild之前添加一个execute windows batch command,执行cmd命令,cmd命令如下: echo **********stop remote server windows service********** "C:\Program Files\IIS\Mi

使用VisualSVN Server自动发布站点

使用VisualSVN Server自动发布站点可以节省大量的发布时间. 适用于项目测试版本 通常一个项目在测试阶段会遇到以下问题 1.开发人员修改缺陷要实时反应到测试环境 2.项目经理想让客户及时看到缺陷修改的结果 3.不要求测试环境程序稳定,但要求更新及时 4.部署人员想偷懒 5.位于不同地点.但各自都可以发布版本的小团队 下面看看步骤 1.在SVN服务器上第一次checkout版本 "D:/Program Files/VisualSVN Server/bin/svn.exe" c

设置SVN hooks实现自动发布

# CentOS下安装SVN yum -y install subversion svnserve --version cd /home/ mkdir svn cd svn/ /usr/bin/svnserve -d -r /home/svn/ # 启动SVN服务 svnadmin create /home/svn/test/ # 创建版本仓库 vi /etc/rc.local # 新增以下内容 /usr/bin/svnserve -d -r /home/svn/ # 先设置 passwd ,并

Web Service (二) CXF自动发布Web Service(No Spring)

Web Service实现目前流行的框架主要有两种,cxf和axis这两个框架,下面是这两个框架的优缺点,我们这个项目中使用的是cxf这个框架,首先看一下没有集成spring的时候是怎么实现远程调用的. Axis与Cxf比较 在SOA领域,我们认为Web Service是SOA体系的构建单元(building block).这两个框架 都是从已有的开源项目发展起来的.这两个框架哪一个更好一些呢? 通过一个比较矩阵来比较Axis2和CXF变得有现实的意义.最主要的区别在以下几个方面: 1.CXF支

node js 修改js代码自动发布到服务器

重新修改js代码后,不需要手动重启服务.需要安装supervisor 工具替代手工. 在联网的前提下在cmd中输入npm install supervisor -g 命令行会自动安装supervisor 工具 然后启动服务时就不用node  XXX.js  使用supervisor XXX.js后 修改js后不再需要手动重启node服务,supervisor 会自动发布最新修改的代码.

Worktile不只发布了Apple Watch版本,还送Apple Watch!!!

Worktile一直为解放全人类的生产力而努力着,但是我们的力量实在单薄,只能帮助一部分人"先富裕起来":而对于更广大的人群,就需要各位蜗牛去解放了.所以,不如从随手"解救"身边的小伙伴开始--这就是WPP的初衷了,Worktile Partner Plan 意思就是我们不只发布了Apple Watch版本的Worktile,还送Apple Watch活动规则 只要邀请三个或三个以上的小伙伴注册Worktile并激活,就有机会抽取Apple Watch一支,我们每天