Some checks failed
🚀 Build & Deploy Image / Determine Build Necessity (push) Failing after 10m14s
🚀 Build & Deploy Image / Build Runtime Base Image (push) Has been skipped
🚀 Build & Deploy Image / Build Docker Image (push) Has been skipped
🚀 Build & Deploy Image / Run Tests & Quality Checks (push) Has been skipped
🚀 Build & Deploy Image / Auto-deploy to Staging (push) Has been skipped
🚀 Build & Deploy Image / Auto-deploy to Production (push) Has been skipped
Security Vulnerability Scan / Check for Dependency Changes (push) Failing after 11m25s
Security Vulnerability Scan / Composer Security Audit (push) Has been cancelled
- Remove middleware reference from Gitea Traefik labels (caused routing issues) - Optimize Gitea connection pool settings (MAX_IDLE_CONNS=30, authentication_timeout=180s) - Add explicit service reference in Traefik labels - Fix intermittent 504 timeouts by improving PostgreSQL connection handling Fixes Gitea unreachability via git.michaelschiemer.de
215 lines
9.0 KiB
PHP
215 lines
9.0 KiB
PHP
<layout name="admin" />
|
|
|
|
<!-- Breadcrumbs -->
|
|
<x-breadcrumbs items='[{"url": "/admin", "text": "Dashboard"}, {"url": "/admin/deployment/dashboard", "text": "Deployments"}]' />
|
|
|
|
<!-- Dashboard Header -->
|
|
<div class="admin-content__header admin-content__header--with-actions">
|
|
<div class="admin-content__title-group">
|
|
<h1 class="admin-content__title">{{ $pageTitle }}</h1>
|
|
<p class="admin-content__description">{{ $pageDescription }}</p>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Overall Statistics Grid -->
|
|
<div class="admin-grid admin-grid--4-col">
|
|
<div class="admin-card">
|
|
<div class="admin-card__header">
|
|
<h3 class="admin-card__title">Total Deployments</h3>
|
|
</div>
|
|
<div class="admin-card__content">
|
|
<div class="admin-stat-big">
|
|
<span class="admin-stat-big__value">{{$totalDeployments}}</span>
|
|
<span class="admin-stat-big__label">All Time</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="admin-card">
|
|
<div class="admin-card__header">
|
|
<h3 class="admin-card__title">Success Rate</h3>
|
|
</div>
|
|
<div class="admin-card__content">
|
|
<div class="admin-stat-big">
|
|
<span class="admin-stat-big__value">{{$successRate}}%</span>
|
|
<span class="admin-stat-big__label">Success</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="admin-card">
|
|
<div class="admin-card__header">
|
|
<h3 class="admin-card__title">Failed Deployments</h3>
|
|
</div>
|
|
<div class="admin-card__content">
|
|
<div class="admin-stat-big">
|
|
<span class="admin-stat-big__value">{{$failedDeployments}}</span>
|
|
<span class="admin-stat-big__label">Failures</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="admin-card">
|
|
<div class="admin-card__header">
|
|
<h3 class="admin-card__title">Average Duration</h3>
|
|
</div>
|
|
<div class="admin-card__content">
|
|
<div class="admin-stat-big">
|
|
<span class="admin-stat-big__value">{{$averageDurationFormatted}}</span>
|
|
<span class="admin-stat-big__label">Avg Time</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Environment-Specific Statistics -->
|
|
<div class="admin-grid admin-grid--2-col" style="margin-top: var(--admin-spacing-xl);">
|
|
<div class="admin-card">
|
|
<div class="admin-card__header">
|
|
<h3 class="admin-card__title">Production Environment</h3>
|
|
</div>
|
|
<div class="admin-card__content">
|
|
<div class="admin-stat-list">
|
|
<div class="admin-stat-list__item">
|
|
<span class="admin-stat-list__label">Total Deployments</span>
|
|
<span class="admin-stat-list__value">{{$productionStats['total_deployments']}}</span>
|
|
</div>
|
|
<div class="admin-stat-list__item">
|
|
<span class="admin-stat-list__label">Success Rate</span>
|
|
<span class="admin-stat-list__value">{{$productionStats['success_rate']}}%</span>
|
|
</div>
|
|
<div class="admin-stat-list__item">
|
|
<span class="admin-stat-list__label">Failed</span>
|
|
<span class="admin-stat-list__value">{{$productionStats['failed']}}</span>
|
|
</div>
|
|
<div class="admin-stat-list__item">
|
|
<span class="admin-stat-list__label">Rolled Back</span>
|
|
<span class="admin-stat-list__value">{{$productionStats['rolled_back']}}</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="admin-card">
|
|
<div class="admin-card__header">
|
|
<h3 class="admin-card__title">Staging Environment</h3>
|
|
</div>
|
|
<div class="admin-card__content">
|
|
<div class="admin-stat-list">
|
|
<div class="admin-stat-list__item">
|
|
<span class="admin-stat-list__label">Total Deployments</span>
|
|
<span class="admin-stat-list__value">{{$stagingStats['total_deployments']}}</span>
|
|
</div>
|
|
<div class="admin-stat-list__item">
|
|
<span class="admin-stat-list__label">Success Rate</span>
|
|
<span class="admin-stat-list__value">{{$stagingStats['success_rate']}}%</span>
|
|
</div>
|
|
<div class="admin-stat-list__item">
|
|
<span class="admin-stat-list__label">Failed</span>
|
|
<span class="admin-stat-list__value">{{$stagingStats['failed']}}</span>
|
|
</div>
|
|
<div class="admin-stat-list__item">
|
|
<span class="admin-stat-list__label">Rolled Back</span>
|
|
<span class="admin-stat-list__value">{{$stagingStats['rolled_back']}}</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Recent Deployments Table -->
|
|
<div class="admin-card" style="margin-top: var(--admin-spacing-xl);">
|
|
<div class="admin-card__header">
|
|
<h3 class="admin-card__title">Recent Deployments</h3>
|
|
</div>
|
|
<div class="admin-card__content">
|
|
<div if="{{count($recentDeployments) > 0}}">
|
|
<table class="admin-table">
|
|
<thead>
|
|
<tr>
|
|
<th>Pipeline ID</th>
|
|
<th>Environment</th>
|
|
<th>Status</th>
|
|
<th>Duration</th>
|
|
<th>Stages</th>
|
|
<th>Success Rate</th>
|
|
<th>Started At</th>
|
|
<th>Completed At</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr foreach="$recentDeployments as $deployment">
|
|
<td><code>{{$deployment['pipelineId']}}</code></td>
|
|
<td>
|
|
<span class="admin-badge admin-badge--neutral">
|
|
{{$deployment['environment']}}
|
|
</span>
|
|
</td>
|
|
<td>
|
|
<span class="admin-badge {{$deployment['statusBadgeClass']}}">
|
|
{{$deployment['status']}}
|
|
</span>
|
|
<span if="{{$deployment['wasRolledBack']}}" class="admin-badge admin-badge--warning">Rolled Back</span>
|
|
</td>
|
|
<td>{{$deployment['durationFormatted']}}</td>
|
|
<td>{{$deployment['stageCount']}}</td>
|
|
<td>{{$deployment['successRate']}}%</td>
|
|
<td>{{$deployment['startedAt']}}</td>
|
|
<td>{{$deployment['completedAt']}}</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
<div if="{{count($recentDeployments) === 0}}">
|
|
<div class="admin-empty-state">
|
|
<p class="admin-empty-state__text">No deployments found</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Failed Deployments Section -->
|
|
<div class="admin-card" style="margin-top: var(--admin-spacing-xl);" if="{{count($failedDeployments) > 0}}">
|
|
<div class="admin-card__header">
|
|
<h3 class="admin-card__title">Recent Failed Deployments</h3>
|
|
</div>
|
|
<div class="admin-card__content">
|
|
<table class="admin-table">
|
|
<thead>
|
|
<tr>
|
|
<th>Pipeline ID</th>
|
|
<th>Environment</th>
|
|
<th>Failed Stage</th>
|
|
<th>Error</th>
|
|
<th>Duration</th>
|
|
<th>Started At</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr foreach="$failedDeployments as $deployment">
|
|
<td><code>{{$deployment['pipelineId']}}</code></td>
|
|
<td>
|
|
<span class="admin-badge admin-badge--neutral">
|
|
{{$deployment['environment']}}
|
|
</span>
|
|
</td>
|
|
<td>
|
|
<span if="{{$deployment['failedStage'] !== null}}" class="admin-badge admin-badge--danger">
|
|
{{$deployment['failedStage']}}
|
|
</span>
|
|
<span if="{{$deployment['failedStage'] === null}}" class="admin-badge admin-badge--neutral">N/A</span>
|
|
</td>
|
|
<td>
|
|
<span if="{{$deployment['error'] !== null}}" class="admin-text-truncate" title="{{$deployment['error']}}">
|
|
{{$deployment['error']}}
|
|
</span>
|
|
<span if="{{$deployment['error'] === null}}" class="admin-text-muted">No error message</span>
|
|
</td>
|
|
<td>{{$deployment['durationFormatted']}}</td>
|
|
<td>{{$deployment['startedAt']}}</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|