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

上一篇服务版本的新增,是通过触发 gitlab 任务来实现的,那么如何得到任务的最终状态呢?
好在 gitlab 为我们提供了webhook,也就是消息钩子,可以发送pipeline消息到我们指定的地址。
当我们收到消息后,就可以跟据任务的最终状态(成功or失败)来更新数据库里相应的版本:

  • 失败时直接更新任务状态为失败
  • 成功时除了更新状态,还要记录版本的路径

版本的存储路径

gitlab 的pipeline任务有一个递增的ID号,我们可以直接拿过来使用,以此ID为版本目录,打包好的服务就存放在该目录下,具体的存储结构如下图:

然后是接收任务的视图

接收任务

这里放上 pipeline消息的关键内容:

'object_attributes': {
   'before_sha': '0000000000000000000000000000000000000000',
   'created_at': '2019-12-09 08:53:34 UTC',
   'detailed_status': 'passed', # pending running passed failed
   'duration': 69,
   'finished_at': '2019-12-09 08:54:56 UTC',
   'id': 123,
   'ref': 'master',
   'sha': 'ad02bfded9fed8a1ae478bc088378827c485cf94',
   'stages': ['prepare', 'build', 'deploy'],
   'status': 'success', # pending running success failed
   'tag': False,
   'variables': [
                 {'key': 'VERSION_ID', 'value': '3'},
                 {'key': 'SERVICE_ID', 'value': '2'},
                 {'key': 'SERVICE_NAME', 'value': 'A'},
                 {'key': 'USERNAME', 'value': 'zhangsan'}
               ],
    },

object_attributes 这个字典里的信息就是我们需要的:

  • status 任务的最终状态,有 success、pending、running、canceled 等
  • variables 触发任务时发送的变量

那么接收任务的视图:

import json
from microservice.models import MicroServiceVersion, BuildStatus
from django.http import HttpResponse
from django.views import generic

class GitWebhookReceiver(generic.View):
    def post(self, request):
        data = json.loads(request.body)
        object_attributes = data.get('object_attributes', {})
        task_id = object_attributes.get('id')
        return self._git_build_result(task_id, object_attributes)

    def _git_build_result(self, task_id, object_attributes):
        status = object_attributes.get('status', '')
        if status in ('pending', 'running', 'canceled'):
            return HttpResponse('')

        elif status in ('failed', 'success'):
            version_id = ''
            service_name = ''
            for item in object_attributes.get('variables', []):
                if item.get('key') == 'VERSION_ID':
                    version_id = item.get('value')
                if item.get('key') == 'SERVICE_NAME':
                    service_name = item.get('value')

            if status in ('failed', ):
                if version_id:
                    MicroServiceVersion.objects.filter(pk=version_id).update(status=BuildStatus.failed.value)
            else: # status == 'success' and detailed_status == 'passed':
                if version_id:
                    MicroServiceVersion.objects.filter(pk=version_id).update(
                        status=BuildStatus.success.value,
                        file_path='{}/{}'.format(service_name, task_id)
                    )
        return HttpResponse('')

这里做一下重构,将接收任务和服务管理的视图分开,在microservice下新建包 views,重命名之前的 views.py -> srv_manage.py 并移动到 views 下,新增的任务接收代码存放到 webhook_receive.py ,最后microservice 的目录结构:

├── admin.py
├── apps.py
├── __init__.py
├── models.py
├── tests.py
├── urls.py
└── views
    ├── __init__.py
    ├── srv_manage.py
    └── webhook_receive.py

当然,这里只是一个实现思路,我们在用的环境是pipeline完成后上传到软件仓库,django结合celery发起异步任务去获取版本号,之后的发布操作也是经由celery。 而且在实际使用中,经常会碰到gitlab的webhook发送超时的情况,我们又在发起任务后通过轮询的方式获取任务状态,这些都是后话。

这样就有了服务相关的版本,之后就是部署、升级、回退,相关的代码在 这里

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

时间: 2024-10-10 21:01:13

Django实现自动发布(2视图-任务接收)的相关文章

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

前面做好了服务的管理,接下来是服务版本的管理,和服务类似,版本也有增删改查.先在服务的管理页面做一个入口,如下图: 需要在上一步的服务管理页面增加按钮.按钮方法,点击按钮跳转时要打开一个新的页面,所以还要增加对应的页面视图. 页面方法 templates/microservice/service.html 的标签<script type="text/html" id="barDemo">后面 增加内容 <a class="layui-bt

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

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

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

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

第三百零五节,Django框架,Views(视图函数),也就是逻辑处理函数里的各种方法与属性

Django框架,Views(视图函数),也就是逻辑处理函数里的各种方法与属性 Views(视图函数)逻辑处理,最终是围绕着两个对象实现的 http请求中产生两个核心对象: http请求:HttpRequest对象 http响应:HttpResponse对象 所在位置:django.http 之前我们用到的参数request就是HttpRequest     HttpRequest对象 逻辑处理函数的第一个形式参数,接收到的就是HttpRequest对象,这个对象里封装着用户的各种请求信息,通过

django url 反响解析,视图

1. 内容回顾 1. 模板语言(字符串替换) 1. 母版和继承 1. 什么时候用母版? html页面有重复的代码,把它们提取出来放到一个单独的html文件. (比如:导航条和左侧菜单) 2. 子页面如何使用母版? {% extends 'base.html' %} --> 必须要放在子页面的第一行 母版里面定义block(块),子页面使用block(块)去替换母版中同名的块 2. 组件 1. 什么时候用组件? 重复的代码,包装成一个独立的小html文件. 2. 如何使用? {% include

Azure 基础:用 PowerShell 自动发布 CloudServices

在软件的开发过程中,自动化的编译和部署能够带来很多的优势.下面我们聊聊如何自动发布云应用程序到 azure 上的 cloud services. 打包要发布的内容 首先使用 msbuild 编译 *.ccproj 文件,我们需要使用生成产物中的:app.publish\xxx.cspkgapp.publish\yyy.cscfg 下载 publishsettings 文件 使用你的 Azure 账号登录下面的地址,就可以下载 publishsettings 文件(国际版):https://man

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

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

raspberry pi 自动发布天气信息到QQ空间/微博

raspberry pi 自动发布天气信息到QQ空间/微博 参考链接: https://aoaoao.me/951.html/comment-page-1 http://www.ipip5.com/today/api.php?type=json 说明: 天气信息来自于百度地图API,历史上的今天来自于网络API(见上). 准备工作: 安装python(没有的,自行下载安装) 安装requests: git clone git://github.com/kennethreitz/requests.

使用VisualSVN Server自动发布站点

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