上一篇服务版本的新增,是通过触发 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发送超时的情况,我们又在发起任务后通过轮询的方式获取任务状态,这些都是后话。

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

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

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

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

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

    前面做好了服务的管理,接下来是服务版本的管理,和服务类似,版本也有增删改查.先在服务的管理页面做一个入口,如下图: 需要在上一步的服务管理页面增加按钮.按钮方法,点击按钮跳转时要打开一个新的页面,所以 ...

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

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

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

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

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

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

  6. nginx+uWSGI+django+virtualenv+supervisor发布web服务器

    nginx+uWSGI+django+virtualenv+supervisor发布web服务器   导论 WSGI是Web服务器网关接口.它是一个规范,描述了Web服务器如何与Web应用程序通信,以 ...

  7. Django基础(路由、视图、模板)

    目录导航 Django 路由控制 Django 视图层 Django 模版层 Django 路由控制 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用 ...

  8. Django - 将URL映射到视图

    URLconf 就像是 Django 所支撑网站的目录.它的本质是 URL 模式以及要为该 URL 模式调用的视图函数之间的映射表.你就是以这种方式告诉 Django,对于这个 URL 调用这段代码, ...

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

    Django框架,Views(视图函数),也就是逻辑处理函数里的各种方法与属性 Views(视图函数)逻辑处理,最终是围绕着两个对象实现的 http请求中产生两个核心对象: http请求:HttpRe ...

随机推荐

  1. 来自GitHub的优秀开源项目系列

    开发必看: 如何设计大型系统? 架构师技术图谱. 互联网Java工程师进阶扫盲 Java学习指南 Java工程师成神之路 有趣开源项目: 中华古诗词数据库 表情包博物馆

  2. HTML5实现无刷新修改URL

    前言 今天在做一个vue的搜索功能,需要从搜索结果页面跳转到细节页面,然后点击返回还能返回到刚刚的结果页面,如果只用window.history.go(-1)当然会重新刷新搜索页面,当然是不行的. 我 ...

  3. 44、css实现水波纹效果

    <div class="container"> <div class="wave"><span>50%</span&g ...

  4. Cheat Engine 特征码

    打开游戏 引用自动注入 搜索特征码 特征码,是游戏运行中,唯一的汇编代码 验证,特征码是游戏中唯一代码 添加特征码 添加特征码,以及金钱只增不减代码 进行激活测试 特征码,只有在游戏过程中才会执行到 ...

  5. 摘jmeter安装之后如何汉化

    下载完成后打开bin文件,选择jmeter.properties打开,搜索language,修改成zh_CN,汉化jmeter,记得去掉前面的#号,然后保存,修改完配置文件后需要重启jmeter 用的 ...

  6. 浏览器渲染html的过程

    关于浏览器如何渲染html界面一直不太清晰,所以现在理一理.由于本身对前深入的东西不太清晰,这篇博客更多的是在记录. 参考:https://www.cnblogs.com/dojo-lzz/p/398 ...

  7. prometheus学习系列十一: Prometheus 安全

    prometheus安全 我们这里说的安全主要是基本认证和https2种, 目前这2种安全在prometheus中都没有的, 需要借助第三方软件实现, 这里以nginx为例. 基本认证 配置基本认证 ...

  8. python遍历列表删除多个元素的坑

    如下代码,遍历列表,删除列表中的偶数时,结果与预期不符. a = [11, 20, 4, 5, 16, 28] for i in a: if i % 2 == 0: a.remove(i) print ...

  9. JVM垃圾收集算法之标记算法

    前言 总所周知,jvm的垃圾收集算法一般包括标记.清除.整理三个阶段,最近在看了有关于垃圾收集的标记算法,记录一下自己的理解. 垃圾收集中标记算法有两种:一种是引用计数法,一种是根搜索算法. 引用记数 ...

  10. pip换源-换成国内的源

    PyPI使用国内源   通过几次 pip 的使用,对于默认的 pip 源的速度实在无法忍受,于是便搜集了一些国内的pip源,如下: 阿里云 http://mirrors.aliyun.com/pypi ...