feat: добавлена пометка типа операции (Build/Push) в истории сборок Dockerfile

- Добавлена колонка 'Тип' во все таблицы истории сборок
- Для push операций отображается registry вместо платформ
- Сохранение пользователя при создании push лога
- Исправлена ошибка с logger в push_docker_image endpoint
- Улучшено отображение истории сборок с визуальными индикаторами
This commit is contained in:
Сергей Антропов
2026-02-15 22:59:02 +03:00
parent 23e1a6037b
commit 1fbf9185a2
232 changed files with 38075 additions and 5 deletions

View File

@@ -0,0 +1,186 @@
{% extends "base.html" %}
{% block title %}Dockerfile: {{ dockerfile.name }} - DevOpsLab{% endblock %}
{% block page_title %}Dockerfile: {{ dockerfile.name }}{% endblock %}
{% block header_actions %}
<div class="d-flex flex-wrap gap-2">
<a href="/dockerfiles/{{ dockerfile.id }}/edit" class="btn btn-primary btn-sm">
<i class="fas fa-edit me-2"></i>
Редактировать
</a>
<a href="/dockerfiles" class="btn btn-secondary btn-sm">
<i class="fas fa-arrow-left me-2"></i>
Назад
</a>
</div>
{% endblock %}
{% block content %}
<div class="row">
<div class="col-12">
<div class="card mb-3">
<div class="card-header">
<h5 class="mb-0">Информация</h5>
</div>
<div class="card-body">
{% if dockerfile.description %}
<p class="mb-3">{{ dockerfile.description }}</p>
{% endif %}
{% if dockerfile.base_image %}
<div class="mb-2">
<strong>Базовый образ:</strong> {{ dockerfile.base_image }}
</div>
{% endif %}
{% if dockerfile.tags %}
<div class="mb-2">
<strong>Теги:</strong>
{% for tag in dockerfile.tags %}
<span class="badge bg-info me-1">{{ tag }}</span>
{% endfor %}
</div>
{% endif %}
<div class="mb-2">
<strong>Статус:</strong>
<span class="badge {% if dockerfile.status == 'active' %}bg-success{% else %}bg-secondary{% endif %}">
{{ dockerfile.status }}
</span>
</div>
<div class="mb-2">
<strong>Создан:</strong> {{ dockerfile.created_at.strftime('%d.%m.%Y %H:%M') if dockerfile.created_at else 'N/A' }}
</div>
{% if dockerfile.updated_at %}
<div class="mb-2">
<strong>Обновлен:</strong> {{ dockerfile.updated_at.strftime('%d.%m.%Y %H:%M') }}
</div>
{% endif %}
</div>
</div>
<div class="card mb-3">
<div class="card-header">
<h5 class="mb-0">Dockerfile</h5>
</div>
<div class="card-body p-0">
<div class="dockerfile-code-wrapper">
<pre class="bg-light p-3 rounded mb-0"><code>{{ dockerfile.content }}</code></pre>
</div>
</div>
</div>
<div class="card">
<div class="card-header d-flex justify-content-between align-items-center">
<h5 class="mb-0">История сборок</h5>
<a href="/dockerfiles/{{ dockerfile.id }}/build-logs" class="btn btn-sm btn-outline-primary">
<i class="fas fa-list me-1"></i>
Все логи
</a>
</div>
<div class="card-body p-0">
{% if build_logs %}
<div class="table-responsive">
<table class="table table-hover mb-0">
<thead class="table-light">
<tr>
<th>Образ</th>
<th>Тип</th>
<th>Платформы</th>
<th>Статус</th>
<th>Начало</th>
<th>Длительность</th>
<th>Пользователь</th>
<th style="min-width: 100px;">Действия</th>
</tr>
</thead>
<tbody>
{% for log in build_logs %}
<tr>
<td class="align-middle">
<code>{{ log.image_name }}{% if log.tag %}:{{ log.tag }}{% endif %}</code>
</td>
<td class="align-middle">
{% if log.extra_data and log.extra_data.get('type') == 'push' %}
<span class="badge bg-info">
<i class="fas fa-upload me-1"></i>Push
</span>
{% else %}
<span class="badge bg-secondary">
<i class="fas fa-hammer me-1"></i>Build
</span>
{% endif %}
</td>
<td class="align-middle">
{% if log.extra_data and log.extra_data.get('type') == 'push' %}
{# Для push показываем registry вместо платформ #}
{% if log.extra_data.get('registry') %}
<span class="badge bg-primary">
<i class="fas fa-server me-1"></i>{{ log.extra_data.get('registry') }}
</span>
{% else %}
<span class="text-muted"></span>
{% endif %}
{% elif log.platforms %}
{% for platform in log.platforms %}
<span class="badge bg-secondary me-1">{{ platform }}</span>
{% endfor %}
{% else %}
<span class="text-muted"></span>
{% endif %}
</td>
<td class="align-middle">
{% if log.status == "success" %}
<span class="badge bg-success">Успешно</span>
{% elif log.status == "failed" %}
<span class="badge bg-danger">Ошибка</span>
{% else %}
<span class="badge bg-warning">Выполняется</span>
{% endif %}
</td>
<td class="align-middle">
{% if log.started_at %}
{{ log.started_at.strftime('%d.%m.%Y %H:%M') }}
{% else %}
<span class="text-muted"></span>
{% endif %}
</td>
<td class="align-middle">
{% if log.duration %}
{{ log.duration }} сек
{% else %}
<span class="text-muted"></span>
{% endif %}
</td>
<td class="align-middle">
{% if log.user %}
{{ log.user }}
{% else %}
<span class="text-muted"></span>
{% endif %}
</td>
<td class="align-middle">
<div class="btn-group btn-group-sm">
<a href="/dockerfiles/{{ dockerfile.id }}/build-logs?log_id={{ log.id }}" class="btn btn-outline-primary" title="Просмотр логов">
<i class="fas fa-eye"></i>
</a>
</div>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% else %}
<div class="alert alert-info mb-0 m-3">
<i class="fas fa-info-circle me-2"></i>
История сборок пуста
</div>
{% endif %}
</div>
</div>
</div>
</div>
{% endblock %}