429 lines
9.7 KiB
HTML
429 lines
9.7 KiB
HTML
{#-
|
|
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License").
|
|
# You may not use this file except in compliance with the License.
|
|
# A copy of the License is located at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# or in the "license" file accompanying this file. This file is
|
|
# distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
|
|
# ANY KIND, either express or implied. See the License for the specific
|
|
# language governing permissions and limitations under the License.
|
|
-#}
|
|
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="utf-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>
|
|
{{ run["project"] }} Proof Results—{{ run["run_id"] }}
|
|
</title>
|
|
<style>
|
|
.footer {
|
|
margin-top: 4em;
|
|
margin-bottom: 1em;
|
|
display: flex;
|
|
flex-direction: row;
|
|
justify-content: space-between;
|
|
}
|
|
#title{
|
|
background-color: #ec407a;
|
|
color: white;
|
|
padding: 2em;
|
|
}
|
|
h1 {
|
|
margin-bottom: 0em;
|
|
}
|
|
#subtitle {
|
|
font-variant: small-caps;
|
|
text-transform: lowercase;
|
|
letter-spacing: 0.2em;
|
|
}
|
|
.run-info ul {
|
|
list-style: none;
|
|
}
|
|
.run-info ul li {
|
|
display: inline;
|
|
margin-right: 6em;
|
|
margin-left: -3em;
|
|
text-transform: uppercase;
|
|
font-size: small;
|
|
color: #ec407a;
|
|
}
|
|
#content {
|
|
max-width: 800px;
|
|
margin-left: auto;
|
|
margin-right: auto;
|
|
padding-top: 2em;
|
|
padding-bottom: 2em;
|
|
color: #263238;
|
|
font-family: Helvetica, sans-serif;
|
|
}
|
|
p {
|
|
margin: 0;
|
|
}
|
|
#pipeline-table {
|
|
display: flex;
|
|
flex-direction: column;
|
|
}
|
|
.pipeline-row {
|
|
display: flex;
|
|
align-content: stretch;
|
|
background-color: #eceff1;
|
|
margin-bottom: 0.5em;
|
|
padding-top: 0.2em;
|
|
padding-bottom: 0.2em;
|
|
padding-left: 0.2em;
|
|
padding-right: 0.2em;
|
|
border-radius: 5px;
|
|
}
|
|
.first-row {
|
|
padding-bottom: 0.5em;
|
|
padding-top: 0.5em;
|
|
border-radius: 10px;
|
|
background-color: #cfd8dc;
|
|
margin-top: 2em;
|
|
}
|
|
.downloads-header {
|
|
color: #263238;
|
|
}
|
|
.downloads {
|
|
background-color: #eceff1;
|
|
margin-bottom: 0.5em;
|
|
padding-top: 0.2em;
|
|
padding-bottom: 0.2em;
|
|
padding-left: 0.2em;
|
|
padding-right: 0.2em;
|
|
border-radius: 5px;
|
|
line-height: 1.5;
|
|
}
|
|
.downloads a {
|
|
color: #3f51b5;
|
|
}
|
|
.downloads a:hover {
|
|
color: #ec407a;
|
|
}
|
|
.pipeline-progress {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
margin-left: 1%;
|
|
width: 20em;
|
|
flex-grow: 0;
|
|
flex-shrink: 0;
|
|
}
|
|
.pipeline-stage {
|
|
display: flex;
|
|
flex-direction: column;
|
|
flex-grow: 1;
|
|
margin-left: 0.2em;
|
|
margin-right: 0.2em;
|
|
}
|
|
|
|
.stage-bar .progress {
|
|
height: 1em;
|
|
border-radius: 5px;
|
|
}
|
|
|
|
.stage-bar {
|
|
height: 1em;
|
|
border-radius: 5px;
|
|
border: 1px solid #cfd8dc;
|
|
}
|
|
|
|
.fail_ignored .stage-bar .progress:hover{ background-color: #e65100; }
|
|
.fail_ignored .stage-bar .progress {
|
|
background-color: #ff9800;
|
|
}
|
|
|
|
.fail .stage-bar .progress:hover{ background-color: #b61c1c; }
|
|
.fail .stage-bar .progress {
|
|
background-color: #f44336;
|
|
}
|
|
|
|
.success .stage-bar .progress:hover{ background-color: #1a237e; }
|
|
.success .stage-bar .progress {
|
|
background-color: #3f51b5;
|
|
}
|
|
|
|
.status-icon-cross {
|
|
fill: #f44336;
|
|
width: 16px;
|
|
height: 16px;
|
|
padding-left: 0.5em;
|
|
}
|
|
.status-icon-tick {
|
|
fill: #3f51b5;
|
|
stroke: #ffffff77;
|
|
stroke-width: 1px;
|
|
width: 16px;
|
|
height: 16px;
|
|
padding-left: 0.5em;
|
|
}
|
|
|
|
.status-icon-in-progress {
|
|
fill: #333;
|
|
width: 16px;
|
|
height: 16px;
|
|
padding-left: 0.5em;
|
|
}
|
|
|
|
.status-icon-in-progress circle {
|
|
stroke: #333;
|
|
stroke-width: 2px;
|
|
fill: none
|
|
}
|
|
|
|
.pipeline-icon {
|
|
fill: #29b6f6;
|
|
}
|
|
.pipeline-icon:hover {
|
|
fill: #ec407a;
|
|
}
|
|
|
|
.pipeline-name p{
|
|
overflow: hidden;
|
|
text-overflow: ellipsis;
|
|
white-space: nowrap;
|
|
}
|
|
.pipeline-name {
|
|
align-self: center;
|
|
text-align: end;
|
|
flex-grow: 1;
|
|
flex-shrink: 1;
|
|
overflow: hidden;
|
|
}
|
|
.pipeline-link {
|
|
justify-self: center;
|
|
align-self: center;
|
|
color: #29b6f6;
|
|
padding-left: 0.2em;
|
|
}
|
|
.pipeline-header {
|
|
justify-content: space-around;
|
|
font-weight: bold;
|
|
font-variant: small-caps;
|
|
text-transform: lowercase;
|
|
font-style: italic;
|
|
font-size: larger;
|
|
color: #26323899;
|
|
width: 18em;
|
|
}
|
|
|
|
.graphs {
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
align-items: flex-start;
|
|
}
|
|
.graph {
|
|
margin-bottom: 6em;
|
|
}
|
|
@media (max-width: 640px){
|
|
.pipeline-progress {
|
|
width: 10em;
|
|
}
|
|
#build-title:after { content: 'B'; visibility: visible; margin-left: -1.5em}
|
|
#test-title:after { content: 'T'; visibility: visible; margin-left: -2.5em}
|
|
#report-title:after { content: 'R'; visibility: visible; margin-left: -3.5em}
|
|
#build-title { visibility: hidden; }
|
|
#test-title { visibility: hidden; }
|
|
#report-title { visibility: hidden; }
|
|
}
|
|
@media (prefers-color-scheme: dark){
|
|
.status-icon-in-progress { fill: #ddd; }
|
|
.status-icon-in-progress circle { stroke: #ddd; }
|
|
|
|
.pipeline-header {
|
|
color: #eceff1;
|
|
}
|
|
.downloads-header {
|
|
color: #eceff1;
|
|
}
|
|
.downloads {
|
|
color: #eceff1;
|
|
background-color: #37474f;
|
|
}
|
|
.downloads a {
|
|
color: #29b6f6;
|
|
}
|
|
.pipeline-row {
|
|
color: #eceff1;
|
|
background-color: #37474f;
|
|
}
|
|
body {
|
|
color: #babdbe;
|
|
background-color: #263238;
|
|
}
|
|
p {
|
|
color: #babdbe;
|
|
}
|
|
#subtitle {
|
|
color: #fff;
|
|
}
|
|
/* SVG graphs */
|
|
path {
|
|
stroke: #eceff1;
|
|
}
|
|
g {
|
|
stroke: #fff0;
|
|
}
|
|
g text {
|
|
fill: #eceff1;
|
|
stroke: #fff0;
|
|
}
|
|
circle {
|
|
stroke: #eceff1;
|
|
}
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div id="content">
|
|
|
|
<div id="title">
|
|
<h1>
|
|
{{ run["project"] }} Proof Results
|
|
</h1>
|
|
<p id="subtitle">
|
|
Litani CI Dashboard
|
|
</p>
|
|
</div><!-- id="title" -->
|
|
|
|
<div class=run-info>
|
|
<ul>
|
|
<li>{{ run["status"] }}</li>
|
|
<li>{{ run["start_time"] }}</li>
|
|
<li>{{ run["run_id"] }}</li>
|
|
</ul>
|
|
</div><!-- class=run-info -->
|
|
|
|
<div id="pipeline-table">
|
|
|
|
<div class="pipeline-row first-row">
|
|
<div class="pipeline-link" style="padding-left: 0em">
|
|
</div><!-- class="pipeline-link" -->
|
|
|
|
<div class="pipeline-name">
|
|
</div><!-- class="pipeline-name" -->
|
|
|
|
<div class="pipeline-progress pipeline-header">
|
|
<p id="build-title">Build</p>
|
|
<p id="test-title">Test</p>
|
|
<p id="report-title">Report</p>
|
|
</div><!-- class="pipeline-progress" -->
|
|
</div><!-- class="pipeline-row" -->
|
|
|
|
{% for pipe in run["pipelines"] %}
|
|
<div class="pipeline-row">
|
|
|
|
<div class="pipeline-link">
|
|
<svg height="16px" width="32px" class="pipeline-icon">
|
|
<a href="{{ pipe['url'] }}/index.html">
|
|
<polygon points="0,0 0,16 16,32 32,0"
|
|
style="fill:#ffffff01"></polygon>
|
|
<polygon points="
|
|
0,6 0,14 2,14 2,13 30,13 30,14 32,14 32,6 30,6 30,7 19,7
|
|
19,6 17,6 17,4 19,4 19,3 20,3 20,2 13,2 13,3 14,3 14,4
|
|
16,4 16,6 14,6 14,7 2,7 2,6 0,6">
|
|
</polygon>
|
|
</a>
|
|
</svg>
|
|
</div><!-- class="pipeline-link" -->
|
|
|
|
<div class="pipeline-name">
|
|
<p>{{ pipe["name"] }}</p>
|
|
</div><!-- class="pipeline-name" -->
|
|
|
|
<div class="pipeline-progress">
|
|
{% for stage in pipe["ci_stages"] %}
|
|
<div class="pipeline-stage">
|
|
|
|
<a class="stage-artifacts-link {{ stage['status'] }}"
|
|
href="{{ stage['url'] }}/index.html">
|
|
<div class="stage-bar">
|
|
<div class="progress" style="width: {{ stage['progress'] }}%">
|
|
</div><!-- class="progress" -->
|
|
</div><!-- class="stage-bar" -->
|
|
</a>
|
|
|
|
</div><!-- class="pipeline-stage" -->
|
|
{% endfor %}{# stage in pipe["stages"] #}
|
|
|
|
</div><!-- class="pipeline-progress" -->
|
|
|
|
<div class="pipeline-status-icon">
|
|
{% if pipe["status"] == "fail" %}
|
|
<svg height="16px" width="16px" class="status-icon-cross">
|
|
<polygon points="
|
|
1,3 7,8 1,13 3,15 8,9 13,15 15,13 9,8 15,3 13,1 8,7 3,1">
|
|
</polygon>
|
|
</svg>
|
|
|
|
{% elif pipe["status"] == "success" %}
|
|
<svg height="16px" class="status-icon-tick">
|
|
<polygon points="1,11 6,15 15,3 13,1 6,12 3,8"></polygon>
|
|
</svg>
|
|
|
|
{% elif pipe["status"] == "in_progress" %}
|
|
<svg height="16px" width="16px" class="status-icon-in-progress">
|
|
<polygon points="7,8 8,9 9,8 8,1"> </polygon>
|
|
<polygon points="8,8 8,9 11,11 9,8"> </polygon>
|
|
<circle cx="8" cy="8" r="7"></circle>
|
|
</svg>
|
|
{% endif %}{# pipe["status"] == "in_progress" #}
|
|
|
|
</div><!-- class="pipeline-status-icon" -->
|
|
|
|
</div><!-- class="pipeline-row" -->
|
|
{% endfor %}{# pipe in run["pipelines"] #}
|
|
|
|
</div><!-- id="pipeline-table" -->
|
|
|
|
<div class="graphs">
|
|
{% for svg in svgs %}
|
|
<div class="graph">
|
|
{% for line in svg -%}
|
|
{{ line }}
|
|
{% endfor %}{# line in svg #}
|
|
</div><!-- class="graph" -->
|
|
{% endfor -%}{# svg in svgs #}
|
|
</div><!-- class="graphs" -->
|
|
|
|
<h2 class="downloads-header">Downloads</h2>
|
|
<div class="downloads">
|
|
<ul>
|
|
<li>
|
|
<p>
|
|
Raw data for this run: <code><a
|
|
href="run.json">run.json</a></code>
|
|
</p>
|
|
</li>
|
|
{% if litani_report_archive_path is not none %}
|
|
<li>
|
|
<p>HTML report: <code><a
|
|
href="{{ litani_report_archive_path }}" download>
|
|
{{ litani_report_archive_path }}</a></code>
|
|
</p>
|
|
</li>
|
|
{% endif %}{# litani_report_archive_path is not none #}
|
|
</ul>
|
|
</div>
|
|
|
|
<div class="footer">
|
|
<div class="footer-cell">
|
|
<p>
|
|
Report generated with
|
|
<a href="https://github.com/awslabs/aws-build-accumulator">Litani</a>
|
|
{{ litani_version }}
|
|
{% if litani_hash is not none %}
|
|
(<code>{{ litani_hash }}</code>)
|
|
{% endif %}{# litani_hash is not none #}
|
|
</p>
|
|
</div><!-- class="footer-cell" -->
|
|
</div><!-- class="footer" -->
|
|
|
|
</div><!-- id="content" -->
|
|
</body>
|
|
</html>
|