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)
然后在每次任务执行前,往该表插一条记录,任务完成后,再更新记录的完成时间和执行时长。
服务的全部实例
服务列表那里最好有个直观的显示该服务已经部署了哪些实例,方便我们查看,因此可以把每个服务的实例数列出来,再做一个链接,点击即可打开新的窗口显示服务的实例详情,如下图:
一个简单的发布系统就完成了。
相关的 代码