mirror of
https://github.com/arcan1s/ahriman.git
synced 2025-05-05 20:53:50 +00:00
Compare commits
No commits in common. "05562d2ee58adf566f193446f04c6dc53d074266" and "6577ca9db1a1293d35e505a037359ae0440f560a" have entirely different histories.
05562d2ee5
...
6577ca9db1
@ -28,8 +28,8 @@ How to report by email
|
|||||||
sender = me@example.com
|
sender = me@example.com
|
||||||
user = me@example.com
|
user = me@example.com
|
||||||
|
|
||||||
How to generate index page
|
How to generate index page for S3
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
#.
|
#.
|
||||||
Install dependencies:
|
Install dependencies:
|
||||||
@ -50,27 +50,7 @@ How to generate index page
|
|||||||
path = ${repository:root}/repository/aur-clone/x86_64/index.html
|
path = ${repository:root}/repository/aur-clone/x86_64/index.html
|
||||||
link_path = http://example.com/aur-clone/x86_64
|
link_path = http://example.com/aur-clone/x86_64
|
||||||
|
|
||||||
Having this configuration, the generated ``index.html`` will be also automatically synced to remote services (e.g. S3).
|
After these steps ``index.html`` file will be automatically synced to S3.
|
||||||
|
|
||||||
How to generate RSS feed for index page
|
|
||||||
"""""""""""""""""""""""""""""""""""""""
|
|
||||||
|
|
||||||
In addition to previous steps, the following configuration is required:
|
|
||||||
|
|
||||||
.. code-block:: ini
|
|
||||||
|
|
||||||
[report]
|
|
||||||
target = html rss
|
|
||||||
|
|
||||||
[html]
|
|
||||||
rss_url = ${html:link_path}/rss.xml
|
|
||||||
|
|
||||||
[rss]
|
|
||||||
link_path = ${html:link_path}
|
|
||||||
path = ${repository:root}/repository/ahriman-demo/x86_64/rss.xml
|
|
||||||
rss_url = ${html:link_path}/rss.xml
|
|
||||||
|
|
||||||
With the appended configuration, the service fill also generate ``rss.xml``, link it to generated ``index.html`` and put it together.
|
|
||||||
|
|
||||||
How to post build report to telegram
|
How to post build report to telegram
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
@ -1,12 +1,8 @@
|
|||||||
<script>
|
<script>
|
||||||
const alertPlaceholder = $("#alert-placeholder");
|
const alertPlaceholder = $("#alert-placeholder");
|
||||||
|
|
||||||
function createAlert(title, message, clz, action, id) {
|
function createAlert(title, message, clz, action) {
|
||||||
if (!id) id = $.md5(title + message); // MD5 id from the content
|
|
||||||
if (alertPlaceholder.find(`#${id}`).length > 0) return; // check if there are duplicates
|
|
||||||
|
|
||||||
const wrapper = document.createElement("div");
|
const wrapper = document.createElement("div");
|
||||||
wrapper.id = id;
|
|
||||||
wrapper.classList.add("toast", clz);
|
wrapper.classList.add("toast", clz);
|
||||||
wrapper.role = "alert";
|
wrapper.role = "alert";
|
||||||
wrapper.ariaLive = "assertive";
|
wrapper.ariaLive = "assertive";
|
||||||
|
@ -45,9 +45,8 @@
|
|||||||
|
|
||||||
<nav>
|
<nav>
|
||||||
<div class="nav nav-tabs" role="tablist">
|
<div class="nav nav-tabs" role="tablist">
|
||||||
<button id="package-info-logs-button" class="nav-link active" data-bs-toggle="tab" data-bs-target="#package-info-logs" type="button" role="tab" aria-controls="package-info-logs" aria-selected="true">Build logs</button>
|
<button id="package-info-logs-button" class="nav-link active" data-bs-toggle="tab" data-bs-target="#package-info-logs" type="button" role="tab" aria-controls="package-info-logs" aria-selected="true"><h3>Build logs</h3></button>
|
||||||
<button id="package-info-changes-button" class="nav-link" data-bs-toggle="tab" data-bs-target="#package-info-changes" type="button" role="tab" aria-controls="package-info-changes" aria-selected="false">Changes</button>
|
<button id="package-info-changes-button" class="nav-link" data-bs-toggle="tab" data-bs-target="#package-info-changes" type="button" role="tab" aria-controls="package-info-changes" aria-selected="false"><h3>Changes</h3></button>
|
||||||
<button id="package-info-events-button" class="nav-link" data-bs-toggle="tab" data-bs-target="#package-info-events" type="button" role="tab" aria-controls="package-info-events" aria-selected="false">Events</button>
|
|
||||||
</div>
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
<div class="tab-content" id="nav-tabContent">
|
<div class="tab-content" id="nav-tabContent">
|
||||||
@ -57,23 +56,6 @@
|
|||||||
<div id="package-info-changes" class="tab-pane fade" role="tabpanel" aria-labelledby="package-info-changes-button" tabindex="0">
|
<div id="package-info-changes" class="tab-pane fade" role="tabpanel" aria-labelledby="package-info-changes-button" tabindex="0">
|
||||||
<pre class="language-diff"><code id="package-info-changes-input" class="pre-scrollable language-diff"></code><button id="package-info-changes-copy-button" type="button" class="btn language-diff" onclick="copyChanges()"><i class="bi bi-clipboard"></i> copy</button></pre>
|
<pre class="language-diff"><code id="package-info-changes-input" class="pre-scrollable language-diff"></code><button id="package-info-changes-copy-button" type="button" class="btn language-diff" onclick="copyChanges()"><i class="bi bi-clipboard"></i> copy</button></pre>
|
||||||
</div>
|
</div>
|
||||||
<div id="package-info-events" class="tab-pane fade" role="tabpanel" aria-labelledby="package-info-events-button" tabindex="0">
|
|
||||||
<canvas id="package-info-events-update-chart"></canvas>
|
|
||||||
<table id="package-info-events-table"
|
|
||||||
data-classes="table table-hover"
|
|
||||||
data-sortable="true"
|
|
||||||
data-sort-name="timestamp"
|
|
||||||
data-sort-order="desc"
|
|
||||||
data-toggle="table">
|
|
||||||
<thead class="table-primary">
|
|
||||||
<tr>
|
|
||||||
<th data-align="right" data-field="timestamp">date</th>
|
|
||||||
<th data-field="event">event</th>
|
|
||||||
<th data-field="message">description</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-footer">
|
<div class="modal-footer">
|
||||||
@ -97,10 +79,6 @@
|
|||||||
const packageInfoChangesInput = $("#package-info-changes-input");
|
const packageInfoChangesInput = $("#package-info-changes-input");
|
||||||
const packageInfoChangesCopyButton = $("#package-info-changes-copy-button");
|
const packageInfoChangesCopyButton = $("#package-info-changes-copy-button");
|
||||||
|
|
||||||
const packageInfoEventsTable = $("#package-info-events-table");
|
|
||||||
const packageInfoEventsUpdateChartCanvas = document.getElementById("package-info-events-update-chart");
|
|
||||||
let packageInfoEventsUpdateChart = null;
|
|
||||||
|
|
||||||
const packageInfoAurUrl = $("#package-info-aur-url");
|
const packageInfoAurUrl = $("#package-info-aur-url");
|
||||||
const packageInfoDepends = $("#package-info-depends");
|
const packageInfoDepends = $("#package-info-depends");
|
||||||
const packageInfoGroups = $("#package-info-groups");
|
const packageInfoGroups = $("#package-info-groups");
|
||||||
@ -113,13 +91,6 @@
|
|||||||
const packageInfoVariablesBlock = $("#package-info-variables-block");
|
const packageInfoVariablesBlock = $("#package-info-variables-block");
|
||||||
const packageInfoVariablesDiv = $("#package-info-variables-div");
|
const packageInfoVariablesDiv = $("#package-info-variables-div");
|
||||||
|
|
||||||
function clearChart() {
|
|
||||||
if (packageInfoEventsUpdateChart) {
|
|
||||||
packageInfoEventsUpdateChart.data = {};
|
|
||||||
packageInfoEventsUpdateChart.update();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async function copyChanges() {
|
async function copyChanges() {
|
||||||
const changes = packageInfoChangesInput.text();
|
const changes = packageInfoChangesInput.text();
|
||||||
await copyToClipboard(changes, packageInfoChangesCopyButton);
|
await copyToClipboard(changes, packageInfoChangesCopyButton);
|
||||||
@ -135,11 +106,6 @@
|
|||||||
packageInfoUpdateButton.attr("hidden", hidden);
|
packageInfoUpdateButton.attr("hidden", hidden);
|
||||||
}
|
}
|
||||||
|
|
||||||
function highlight(element) {
|
|
||||||
delete element.dataset.highlighted;
|
|
||||||
hljs.highlightElement(element);
|
|
||||||
}
|
|
||||||
|
|
||||||
function insertVariable(packageBase, variable) {
|
function insertVariable(packageBase, variable) {
|
||||||
const variableInput = document.createElement("div");
|
const variableInput = document.createElement("div");
|
||||||
variableInput.classList.add("input-group");
|
variableInput.classList.add("input-group");
|
||||||
@ -193,51 +159,7 @@
|
|||||||
success: response => {
|
success: response => {
|
||||||
const changes = response.changes;
|
const changes = response.changes;
|
||||||
packageInfoChangesInput.text(changes || "");
|
packageInfoChangesInput.text(changes || "");
|
||||||
packageInfoChangesInput.map((_, el) => highlight(el));
|
packageInfoChangesInput.map((_, el) => hljs.highlightElement(el));
|
||||||
},
|
|
||||||
error: onFailure,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function loadEvents(packageBase, onFailure) {
|
|
||||||
packageInfoEventsTable.bootstrapTable("showLoading");
|
|
||||||
clearChart();
|
|
||||||
|
|
||||||
$.ajax({
|
|
||||||
url: `/api/v1/events`,
|
|
||||||
data: {
|
|
||||||
architecture: repository.architecture,
|
|
||||||
repository: repository.repository,
|
|
||||||
object_id: packageBase,
|
|
||||||
limit: 30,
|
|
||||||
},
|
|
||||||
type: "GET",
|
|
||||||
dataType: "json",
|
|
||||||
success: response => {
|
|
||||||
const events = response.map(event => {
|
|
||||||
return {
|
|
||||||
timestamp: new Date(1000 * event.created).toISOStringShort(),
|
|
||||||
event: event.event,
|
|
||||||
message: event.message || "",
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
if (packageInfoEventsUpdateChart) {
|
|
||||||
const chart = response.filter(event => event.event === "package-updated");
|
|
||||||
packageInfoEventsUpdateChart.config.data = {
|
|
||||||
labels: chart.map(event => new Date(1000 * event.created).toISOStringShort()),
|
|
||||||
datasets: [{
|
|
||||||
label: "update duration, s",
|
|
||||||
data: chart.map(event => event.data.took),
|
|
||||||
cubicInterpolationMode: "monotone",
|
|
||||||
tension: 0.4,
|
|
||||||
}],
|
|
||||||
};
|
|
||||||
packageInfoEventsUpdateChart.update();
|
|
||||||
}
|
|
||||||
|
|
||||||
packageInfoEventsTable.bootstrapTable("load", events);
|
|
||||||
packageInfoEventsTable.bootstrapTable("hideLoading");
|
|
||||||
},
|
},
|
||||||
error: onFailure,
|
error: onFailure,
|
||||||
});
|
});
|
||||||
@ -257,7 +179,7 @@
|
|||||||
return `[${new Date(1000 * log_record.created).toISOString()}] ${log_record.message}`;
|
return `[${new Date(1000 * log_record.created).toISOString()}] ${log_record.message}`;
|
||||||
});
|
});
|
||||||
packageInfoLogsInput.text(logs.join("\n"));
|
packageInfoLogsInput.text(logs.join("\n"));
|
||||||
packageInfoLogsInput.map((_, el) => highlight(el));
|
packageInfoLogsInput.map((_, el) => hljs.highlightElement(el));
|
||||||
},
|
},
|
||||||
error: onFailure,
|
error: onFailure,
|
||||||
});
|
});
|
||||||
@ -363,21 +285,12 @@
|
|||||||
loadPackage(packageBase, onFailure);
|
loadPackage(packageBase, onFailure);
|
||||||
loadPatches(packageBase, onFailure);
|
loadPatches(packageBase, onFailure);
|
||||||
loadLogs(packageBase, onFailure);
|
loadLogs(packageBase, onFailure);
|
||||||
loadChanges(packageBase, onFailure);
|
loadChanges(packageBase, onFailure)
|
||||||
loadEvents(packageBase, onFailure);
|
|
||||||
|
|
||||||
if (isPackageBaseSet) packageInfoModal.modal("show");
|
if (isPackageBaseSet) packageInfoModal.modal("show");
|
||||||
}
|
}
|
||||||
|
|
||||||
$(_ => {
|
$(_ => {
|
||||||
packageInfoEventsUpdateChart = new Chart(packageInfoEventsUpdateChartCanvas, {
|
|
||||||
type: "line",
|
|
||||||
data: {},
|
|
||||||
options: {
|
|
||||||
responsive: true,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
packageInfoModal.on("hidden.bs.modal", _ => {
|
packageInfoModal.on("hidden.bs.modal", _ => {
|
||||||
packageInfoAurUrl.empty();
|
packageInfoAurUrl.empty();
|
||||||
packageInfoDepends.empty();
|
packageInfoDepends.empty();
|
||||||
@ -393,8 +306,6 @@
|
|||||||
|
|
||||||
packageInfoLogsInput.empty();
|
packageInfoLogsInput.empty();
|
||||||
packageInfoChangesInput.empty();
|
packageInfoChangesInput.empty();
|
||||||
packageInfoEventsTable.bootstrapTable("load", []);
|
|
||||||
clearChart();
|
|
||||||
|
|
||||||
packageInfoModal.trigger("reset");
|
packageInfoModal.trigger("reset");
|
||||||
|
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
<script src="https://cdn.jsdelivr.net/npm/jquery@3.7.1/dist/jquery.min.js" crossorigin="anonymous" type="application/javascript"></script>
|
<script src="https://cdn.jsdelivr.net/npm/jquery@3.7.1/dist/jquery.min.js" crossorigin="anonymous" type="application/javascript"></script>
|
||||||
<script src="https://cdn.jsdelivr.net/npm/jquery.md5@1.0.2/index.min.js" crossorigin="anonymous" type="application/javascript"></script>
|
|
||||||
|
|
||||||
<script src="https://cdn.jsdelivr.net/npm/moment@2.29.4/moment.min.js" crossorigin="anonymous" type="application/javascript"></script>
|
<script src="https://cdn.jsdelivr.net/npm/moment@2.29.4/moment.min.js" crossorigin="anonymous" type="application/javascript"></script>
|
||||||
<script src="https://cdn.jsdelivr.net/npm/daterangepicker@3.1.0/daterangepicker.min.js" crossorigin="anonymous" type="application/javascript"></script>
|
<script src="https://cdn.jsdelivr.net/npm/daterangepicker@3.1.0/daterangepicker.min.js" crossorigin="anonymous" type="application/javascript"></script>
|
||||||
@ -18,8 +17,6 @@
|
|||||||
|
|
||||||
<script src="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11.9.0/build/highlight.min.js" crossorigin="anonymous" type="application/javascript"></script>
|
<script src="https://cdn.jsdelivr.net/gh/highlightjs/cdn-release@11.9.0/build/highlight.min.js" crossorigin="anonymous" type="application/javascript"></script>
|
||||||
|
|
||||||
<script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.4/dist/chart.umd.min.js" crossorigin="anonymous" type="application/javascript"></script>
|
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
async function copyToClipboard(text, button) {
|
async function copyToClipboard(text, button) {
|
||||||
if (navigator.clipboard === undefined) {
|
if (navigator.clipboard === undefined) {
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
# Index
|
# Index
|
||||||
|
|
||||||
1. Setup repository named `ahriman-demo` with architecture `x86_64`.
|
1. Setup repository named `ahriman-demo` with architecture `x86_64`.
|
||||||
2. Generate index page and RSS feed.
|
2. Generate index page.
|
||||||
3. Repository is available at `http://localhost:8080/repo`.
|
3. Repository is available at `http://localhost:8080/repo`.
|
||||||
4. Index page is available at `http://localhost:8080/repo/ahriman-demo/x86_64/index.html`
|
4. Index page is available at `http://localhost:8080/repo/ahriman-demo/x86_64/index.html`
|
||||||
5. Index page is available at `http://localhost:8080/repo/ahriman-demo/x86_64/rss.xml`
|
|
||||||
|
@ -1,12 +1,6 @@
|
|||||||
[report]
|
[report]
|
||||||
target = html rss
|
target = html
|
||||||
|
|
||||||
[html]
|
[html]
|
||||||
path = ${repository:root}/repository/ahriman-demo/x86_64/index.html
|
path = ${repository:root}/repository/ahriman-demo/x86_64/index.html
|
||||||
link_path = http://localhost:8080/repo/ahriman-demo/x86_64
|
link_path = http://localhost:8080/repo/ahriman-demo/x86_64
|
||||||
rss_url = ${html:link_path}/rss.xml
|
|
||||||
|
|
||||||
[rss]
|
|
||||||
link_path = ${html:link_path}
|
|
||||||
path = ${repository:root}/repository/ahriman-demo/x86_64/rss.xml
|
|
||||||
rss_url = ${html:link_path}/rss.xml
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user