zoukankan      html  css  js  c++  java
  • Django实现自动发布(5完善功能)

    之前的安装一个服务只是记录了服务的可执行文件,实际上初次安装还需要将相关的配置文件下发到目标主机。

    页面实现一个选择配置修订号的入口,默认选中服务的默认配置,如下图:

    基于 layui 可以这样实现:

    function renderSelectConf(){
       // 渲染配置版本下拉框
       var list = [];
       var options = '<option value="">选择1条记录</option>';
       {% for rev in microserviceversion.microservice.confrevision_set.all %}
         {% if rev.is_default  %}
           list.push('<option value="{{ rev.id }}" selected>{{ rev.revision }}: {{ rev.description }}</option>');
         {% else %}
           list.push('<option value="{{ rev.id }}">{{ rev.revision }}: {{ rev.description }}</option>');
         {% endif %}
       {% endfor %}
       options += list.join('');
       $('#service-install-form-conf').empty().append(options);
     }
    

    表单提交后,后端也要进行相关校验:

    • 若修订号id存在,则使用些修订号
    • 若修订号不存在,则使用默认配置
    • 若默认配置不存在,则报错,提示用户创建配置文件

    相应的校验代码:

    # class VersionInstallApi(generic.View):
        # def post(self, request, service_id, pk):
            revision_id = request.POST.get('revision', '').strip()
            # ...
    
            if revision_id:
                try:
                    revision = ConfRevision.objects.get(pk=revision_id)
                except ConfRevision.DoesNotExist:
                    revision_id = None
    
            # revision_id 为空时  查找默认配置
            if not revision_id:
                try:
                    revision = ConfRevision.objects.get(service=service, is_default=True)
                except ConfRevision.DoesNotExist:
                    return JsonResponse({'msg': '请先创建配置文件'}, status=417)
            
            # ...
    

    这样安装一个服务算是完成了。

    发布操作记录

    假如某个白天升级了多个服务,晚上的时候线上业务出现问题,这时候为了方便快速回退,就要知道当天变更了哪些服务,因此需要记录每次发布的操作类型、对应的服务、相关的操作人、创建时间、执行记录等等,做到对发布操作有迹可循。相关的模型如下:

    class DeployRecord(models.Model):
    
        DEPLOY_TYPE = (
            ('install', 'install'),
            ('upgrade', 'upgrade'),
            ('revert', 'revert'),
            ('delete', 'delete'),
        )
    
        deploy_type = models.CharField(max_length=16, verbose_name="发布类型", choices=DEPLOY_TYPE, default='install')
        duration = models.PositiveSmallIntegerField(blank=True, null=True)
        description = models.CharField(max_length=128, null=True, blank=True, verbose_name='描述')
        created_at = models.DateTimeField(auto_now_add=True)
        finished_at = models.DateTimeField(blank=True, null=True)
        user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.DO_NOTHING)
        raw_log = models.TextField(null=True, blank=True, help_text ="任务执行日志")
        task_id = models.CharField(max_length=64, help_text='任务id')
        service = models.ForeignKey(MicroService, on_delete=models.DO_NOTHING)
    

    然后在每次任务执行前,往该表插一条记录,任务完成后,再更新记录的完成时间和执行时长。

    服务的全部实例

    服务列表那里最好有个直观的显示该服务已经部署了哪些实例,方便我们查看,因此可以把每个服务的实例数列出来,再做一个链接,点击即可打开新的窗口显示服务的实例详情,如下图:

    一个简单的发布系统就完成了。

    相关的 代码

  • 相关阅读:
    PythonのTkinter基本原理
    使用 Word (VBA) 分割长图到多页
    如何使用 Shebang Line (Python 虚拟环境)
    将常用的 VBScript 脚本放到任务栏 (Pin VBScript to Taskbar)
    关于 VBScript 中的 CreateObject
    Windows Scripting Host (WSH) 是什么?
    Component Object Model (COM) 是什么?
    IOS 打开中文 html 文件,显示乱码的问题
    科技发展时间线(Technology Timeline)
    列置换密码
  • 原文地址:https://www.cnblogs.com/wbjxxzx/p/12149357.html
Copyright © 2011-2022 走看看