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)

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

服务的全部实例

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

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

相关的 代码

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