[Git][qa/jenkins.debian.net][master] rdn: add static html for loong64

Holger Levsen (@holger) gitlab at salsa.debian.org
Thu May 28 15:44:35 BST 2026



Holger Levsen pushed to branch master at Debian QA / jenkins.debian.net


Commits:
f6fc2739 by Holger Levsen at 2026-05-28T16:44:11+02:00
rdn: add static html for loong64

Signed-off-by: Holger Levsen <holger at layer-acht.org>

- - - - -


11 changed files:

- hosts/osuosl5-amd64/var/www/html/excuses.html
- hosts/osuosl5-amd64/var/www/html/experimental.html
- hosts/osuosl5-amd64/var/www/html/forky.html
- + hosts/osuosl5-amd64/var/www/html/loong64/experimental.html
- + hosts/osuosl5-amd64/var/www/html/loong64/forky.html
- + hosts/osuosl5-amd64/var/www/html/loong64/index.html
- + hosts/osuosl5-amd64/var/www/html/loong64/unstable.html
- hosts/osuosl5-amd64/var/www/html/rebuilderd-setup.html
- hosts/osuosl5-amd64/var/www/html/trixie-backports.html
- hosts/osuosl5-amd64/var/www/html/trixie.html
- hosts/osuosl5-amd64/var/www/html/unstable.html


Changes:

=====================================
hosts/osuosl5-amd64/var/www/html/excuses.html
=====================================
@@ -120,7 +120,7 @@
                 let div = document.getElementById('search-results');
                 // clear children
                 div.innerHTML = '';
-                const archs = ["all", "amd64", "arm64", "armhf", "i386", "ppc64el", "riscv64"];
+                const archs = ["all", "amd64", "arm64", "armhf", "i386", "loong64", "ppc64el", "riscv64"];
                 const urlParams = new URL(window.location.toLocaleString()).searchParams;
                 const source_name = urlParams.get('source_name');
                 archs.forEach(arch => searchPkgs(div, source_name, arch));


=====================================
hosts/osuosl5-amd64/var/www/html/experimental.html
=====================================
@@ -28,11 +28,11 @@
             display: inline;
         }
 
-        #stats-all, #stats-amd64, #stats-arm64, #stats-armhf, #stats-i386, #stats-riscv64, #stats-ppc64el{
+        #stats-all, #stats-amd64, #stats-arm64, #stats-armhf, #stats-i386, #stats-loong64, #stats-riscv64, #stats-ppc64el{
             text-align: left;
 	}
 
-        #worker, #progress-all, #progress-amd64, #progress-arm64, #progress-armhf, #progress-i386, #progress-riscv64, #progress-ppc64el{
+        #worker, #progress-all, #progress-amd64, #progress-arm64, #progress-armhf, #progress-i386, #progress-loong64, #progress-riscv64, #progress-ppc64el{
             font-size: 10pt;
 	}
 
@@ -94,6 +94,7 @@
                 fetchArchStats("arm64", "experimental");
                 fetchArchStats("armhf", "experimental");
                 fetchArchStats("i386", "experimental");
+                fetchArchStats("loong64", "experimental");
                 fetchArchStats("riscv64", "experimental");
                 fetchArchStats("ppc64el", "experimental");
             }
@@ -239,6 +240,22 @@
 	        <span id="worker">
 			infomaniak0(7|8)-amd64
 	        </span>
+	</td></tr><tr><td>
+		<a href="https://reproduce.debian.net/loong64/experimental.html">
+			loong64
+		</a>
+	</td><td>
+		<div id="stats-loong64">Loading stats...</div>
+	</td><td>
+		<a href="https://reproduce.debian.net/loong64/experimental.html">
+			<img src="https://reproduce.debian.net/loong64/stats/experimental/rb.png">
+		</a>
+		<a href="https://reproduce.debian.net/loong64/stats/experimental/rb.png">📈</a>
+	</td><td>
+		<div id="progress-loong64">Loading progress...</div>
+	        <span id="worker">
+			loong64-(01|02)
+	        </span>
 	</td></tr><tr><td>
 		<a href="https://reproduce.debian.net/ppc64el/experimental.html">
 			ppc64el


=====================================
hosts/osuosl5-amd64/var/www/html/forky.html
=====================================
@@ -28,11 +28,11 @@
             display: inline;
         }
 
-        #stats-all, #stats-amd64, #stats-arm64, #stats-armhf, #stats-i386, #stats-riscv64, #stats-ppc64el{
+        #stats-all, #stats-amd64, #stats-arm64, #stats-armhf, #stats-i386, #stats-loong64, #stats-riscv64, #stats-ppc64el{
             text-align: left;
 	}
 
-        #worker, #progress-all, #progress-amd64, #progress-arm64, #progress-armhf, #progress-i386, #progress-riscv64, #progress-ppc64el{
+        #worker, #progress-all, #progress-amd64, #progress-arm64, #progress-armhf, #progress-i386, #progress-loong64, #progress-riscv64, #progress-ppc64el{
             font-size: 10pt;
 	}
 
@@ -94,8 +94,9 @@
                 fetchArchStats("arm64", "forky");
                 fetchArchStats("armhf", "forky");
                 fetchArchStats("i386", "forky");
-                fetchArchStats("riscv64", "forky");
+                fetchArchStats("loong64", "forky");
                 fetchArchStats("ppc64el", "forky");
+                fetchArchStats("riscv64", "forky");
             }
 
             function fetchArchStats(arch, release) {
@@ -239,6 +240,22 @@
 	        <span id="worker">
 			infomaniak0(7|8)-amd64
 	        </span>
+	</td></tr><tr><td>
+		<a href="https://reproduce.debian.net/loong64/forky.html">
+			loong64
+		</a>
+	</td><td>
+		<div id="stats-loong64">Loading stats...</div>
+	</td><td>
+		<a href="https://reproduce.debian.net/loong64/forky.html">
+			<img src="https://reproduce.debian.net/loong64/stats/forky/rb.png">
+		</a>
+		<a href="https://reproduce.debian.net/loong64/stats/forky/rb.png">📈</a>
+	</td><td>
+		<div id="progress-loong64">Loading progress...</div>
+	        <span id="worker">
+			loong64-(01|02)
+	        </span>
 	</td></tr><tr><td>
 		<a href="https://reproduce.debian.net/ppc64el/forky.html">
 			ppc64el


=====================================
hosts/osuosl5-amd64/var/www/html/loong64/experimental.html
=====================================
@@ -0,0 +1,235 @@
+<!DOCTYPE html>
+<html lang="en">
+    <head>
+        <meta charset="utf-8">
+        <title>
+		reproduce.debian.net/loong64 - experimental (arch:loong64)
+        </title>
+        <style>
+        body {
+            font-family: sans-serif;
+            font-size: 18pt;
+        }
+        h1 {
+            font-size: 24pt;
+        }
+        h3 {
+            font-size: 18pt;
+        }
+
+        #search-results {
+            margin: 18pt 0;
+        }
+
+        pre {
+            margin: 0;
+        }
+
+        img {
+            vertical-align: middle;
+            max-width: 1920;
+            width: 50%;
+        }
+
+        #search-results pre {
+            margin: 12pt 0;
+        }
+
+        .status {
+            font-weight: bold;
+        }
+
+        .good {
+            color: green;
+        }
+
+        .fail {
+            color: yellow;
+        }
+
+        .bad {
+            color: red;
+        }
+
+        .unknown {
+            color: #957fff;
+        }
+
+        footer {
+            font-size: 12pt;
+        }
+        </style>
+        <script>
+        document.addEventListener('DOMContentLoaded', function() {
+            // package search
+            function spanWith(text) {
+                let s = document.createElement('span');
+                s.textContent = text;
+                return s;
+            }
+
+            function linkTo(href, text) {
+                let a = document.createElement('a');
+                a.href = href;
+                a.textContent = text;
+                return a;
+            }
+
+            function searchPkgs(query) {
+                let div = document.getElementById('search-results');
+                let url = '/loong64/api/v1/packages/binary?' + new URLSearchParams({
+                    name: query,
+                    distro: 'debian',
+		    release: 'experimental',
+                    seen_only: 'true',
+                });
+                fetch(url)
+                    .then(response => response.json())
+                    .then(data => {
+                        // clear children
+                        div.innerHTML = '';
+                        let result = data['records'];
+
+                        result.map(pkg => {
+                            let build_id = pkg.build_id;
+                            let artifact_id = pkg.artifact_id;
+                            let r = document.createElement('pre');
+
+                            r.appendChild(spanWith('['));
+                            let status = pkg['status'];
+                            let statusSpan = spanWith(status);
+                            statusSpan.className += ' status';
+                            if (status == 'GOOD') {
+                                statusSpan.className += ' good';
+                            } else if (status == 'FAIL') {
+                                statusSpan.className += ' fail';
+                            } else if (status == 'BAD') {
+                                statusSpan.className += ' bad';
+                            } else {
+                                statusSpan.className += ' unknown';
+                            }
+                            r.appendChild(statusSpan);
+                            r.appendChild(spanWith(`] ${pkg['name']} ${pkg['version']}\t\t`));
+
+                            if (build_id) {
+                                r.appendChild(spanWith(' ['));
+                                r.appendChild(linkTo(`/loong64/api/v1/builds/${build_id}/log`, 'log'));
+                                r.appendChild(spanWith(']'));
+                            }
+
+                            if (pkg.attestation_log_id) {
+                                r.appendChild(spanWith(' ['));
+                                r.appendChild(linkTo(`/loong64/api/v1/builds/${build_id}/artifacts/${artifact_id}/attestation`, 'attestation'));
+                                r.appendChild(spanWith(']'));
+                            }
+
+                            if (pkg.diffoscope_log_id) {
+                                r.appendChild(spanWith(' ['));
+                                r.appendChild(linkTo(`/loong64/api/v1/builds/${build_id}/artifacts/${artifact_id}/diffoscope`, 'diffoscope'));
+                                r.appendChild(spanWith(']'));
+                            }
+
+                            div.appendChild(r);
+                        });
+                    });
+            }
+
+            if (location.hash) {
+                searchPkgs(location.hash.substr(1));
+            }
+
+            document.getElementById('search').addEventListener('submit', function(e) {
+                e.preventDefault();
+                let query = document.getElementById('search-query').value;
+                location.href = `#${query}`;
+                searchPkgs(query);
+            });
+
+            // display stats
+            function updateStats(data) {
+                let div = document.getElementById('stats');
+                // clear children
+                div.innerHTML = '';
+                // add rows
+                data.map(row => {
+                    let r = document.createElement('pre');
+                    let key = row[0] + ': ';
+                    r.textContent = key.padEnd(25) + row[1];
+                    div.appendChild(r);
+                });
+            }
+
+            function fetchStats() {
+                fetch('/loong64/api/v1/dashboard?release=experimental')
+                    .then(response => response.json())
+                    .then(data => {
+                        let div = document.getElementById('stats');
+
+                        let good = data['rebuilds']['good'];
+                        let bad = data['rebuilds']['bad'];
+                        let fail = data['rebuilds']['fail'];
+                        let unknown = data['rebuilds']['unknown'];
+
+                        let running = data['jobs']['running'];
+                        let available = data['jobs']['available'];
+
+                        updateStats([
+                            ['reproduced', (100 / (good + bad + fail) * good).toFixed(2) + '%'],
+                            ['good', good],
+                            ['bad', bad],
+                            ['fail', fail],
+                            ['unknown', unknown],
+                            ['build progress', (100 / (good + bad + fail + unknown) * (good + bad + fail)).toFixed(2) + '%'],
+                            ['jobs running', running],
+                            ['jobs available', available],
+                        ]);
+                    });
+            }
+
+            setInterval(fetchStats, 60 * 1000);
+            fetchStats();
+        });
+        </script>
+    </head>
+    <body>
+        <h1>
+		<a href="https://reproduce.debian.net">reproduce</a>.debian.net/<a href="https://loong64.reproduce.debian.net">loong64</a>
+	</h1>
+        <a href="stats/experimental/rb.png"><img src="stats/experimental/rb.png" align="right"></a>
+        <h3>
+	experimental,
+	<a href="https://loong64.reproduce.debian.net/unstable.html">unstable</a>,
+	<a href="https://loong64.reproduce.debian.net/forky.html">forky</a>
+        </h3>
+        <code>
+		experimental (arch:loong64) main+non-free-firmware
+        </code>
+
+        <div id="stats">Loading stats...</div>
+
+        <div>
+            <h3>Binary package search</h3>
+            <form id="search">
+                <input type="text" id="search-query" placeholder="2ping">
+                <input type="submit" value="Search">
+            </form>
+        </div>
+        <div id="search-results">
+        </div>
+
+	<footer>
+	    <br>
+	    <a href="stats/experimental">Statistics about BAD packages</a> on loong64/experimental.
+	    <br>
+	<hr>
+            pew pew, <a href="https://github.com/kpcyrd/rebuilderd">rebuilderd</a> using <a href="https://tracker.debian.org/pkg/devscripts">debrebuild</a> to reproduce what Debian distributes via <code><a href="https://ftp.debian.org/debian/dists/">ftp.debian.org</a></code>. ♥️
+	<br>
+	    <small>
+		This setup is work in progress, URLs might not be stable here.
+		<br>In case you are wondering why we are doing this, then hopefully the <a href="https://reproducible-builds.org">Reproducible Builds website</a> will explain why this is useful.
+		<br>
+		contact: IRC preferred: #debian-reproducible on OFTC or mail to holger at d.o
+	    </small>
+        </footer>
+    </body>
+</html>


=====================================
hosts/osuosl5-amd64/var/www/html/loong64/forky.html
=====================================
@@ -0,0 +1,235 @@
+<!DOCTYPE html>
+<html lang="en">
+    <head>
+        <meta charset="utf-8">
+        <title>
+		reproduce.debian.net/loong64 - forky (arch:loong64)
+        </title>
+        <style>
+        body {
+            font-family: sans-serif;
+            font-size: 18pt;
+        }
+        h1 {
+            font-size: 24pt;
+        }
+        h3 {
+            font-size: 18pt;
+        }
+
+        #search-results {
+            margin: 18pt 0;
+        }
+
+        pre {
+            margin: 0;
+        }
+
+        img {
+            vertical-align: middle;
+            max-width: 1920;
+            width: 50%;
+        }
+
+        #search-results pre {
+            margin: 12pt 0;
+        }
+
+        .status {
+            font-weight: bold;
+        }
+
+        .good {
+            color: green;
+        }
+
+        .fail {
+            color: yellow;
+        }
+
+        .bad {
+            color: red;
+        }
+
+        .unknown {
+            color: #957fff;
+        }
+
+        footer {
+            font-size: 12pt;
+        }
+        </style>
+        <script>
+        document.addEventListener('DOMContentLoaded', function() {
+            // package search
+            function spanWith(text) {
+                let s = document.createElement('span');
+                s.textContent = text;
+                return s;
+            }
+
+            function linkTo(href, text) {
+                let a = document.createElement('a');
+                a.href = href;
+                a.textContent = text;
+                return a;
+            }
+
+            function searchPkgs(query) {
+                let div = document.getElementById('search-results');
+                let url = '/loong64/api/v1/packages/binary?' + new URLSearchParams({
+                    name: query,
+                    distro: 'debian',
+                    release: 'forky',
+                    seen_only: 'true',
+                });
+                fetch(url)
+                    .then(response => response.json())
+                    .then(data => {
+                        // clear children
+                        div.innerHTML = '';
+                        let result = data['records'];
+
+                        result.map(pkg => {
+                            let build_id = pkg.build_id;
+                            let artifact_id = pkg.artifact_id;
+                            let r = document.createElement('pre');
+
+                            r.appendChild(spanWith('['));
+                            let status = pkg['status'];
+                            let statusSpan = spanWith(status);
+                            statusSpan.className += ' status';
+                            if (status == 'GOOD') {
+                                statusSpan.className += ' good';
+                            } else if (status == 'FAIL') {
+                                statusSpan.className += ' fail';
+                            } else if (status == 'BAD') {
+                                statusSpan.className += ' bad';
+                            } else {
+                                statusSpan.className += ' unknown';
+                            }
+                            r.appendChild(statusSpan);
+                            r.appendChild(spanWith(`] ${pkg['name']} ${pkg['version']}\t\t`));
+
+                            if (build_id) {
+                                r.appendChild(spanWith(' ['));
+                                r.appendChild(linkTo(`/loong64/api/v1/builds/${build_id}/log`, 'log'));
+                                r.appendChild(spanWith(']'));
+                            }
+
+                            if (pkg.attestation_log_id) {
+                                r.appendChild(spanWith(' ['));
+                                r.appendChild(linkTo(`/loong64/api/v1/builds/${build_id}/artifacts/${artifact_id}/attestation`, 'attestation'));
+                                r.appendChild(spanWith(']'));
+                            }
+
+                            if (pkg.diffoscope_log_id) {
+                                r.appendChild(spanWith(' ['));
+                                r.appendChild(linkTo(`/loong64/api/v1/builds/${build_id}/artifacts/${artifact_id}/diffoscope`, 'diffoscope'));
+                                r.appendChild(spanWith(']'));
+                            }
+
+                            div.appendChild(r);
+                        });
+                    });
+            }
+
+            if (location.hash) {
+                searchPkgs(location.hash.substr(1));
+            }
+
+            document.getElementById('search').addEventListener('submit', function(e) {
+                e.preventDefault();
+                let query = document.getElementById('search-query').value;
+                location.href = `#${query}`;
+                searchPkgs(query);
+            });
+
+            // display stats
+            function updateStats(data) {
+                let div = document.getElementById('stats');
+                // clear children
+                div.innerHTML = '';
+                // add rows
+                data.map(row => {
+                    let r = document.createElement('pre');
+                    let key = row[0] + ': ';
+                    r.textContent = key.padEnd(25) + row[1];
+                    div.appendChild(r);
+                });
+            }
+
+            function fetchStats() {
+                fetch('/loong64/api/v1/dashboard?release=forky')
+                    .then(response => response.json())
+                    .then(data => {
+                        let div = document.getElementById('stats');
+
+                        let good = data['rebuilds']['good'];
+                        let bad = data['rebuilds']['bad'];
+                        let fail = data['rebuilds']['fail'];
+                        let unknown = data['rebuilds']['unknown'];
+
+                        let running = data['jobs']['running'];
+                        let available = data['jobs']['available'];
+
+                        updateStats([
+                            ['reproduced', (100 / (good + bad + fail) * good).toFixed(2) + '%'],
+                            ['good', good],
+                            ['bad', bad],
+                            ['fail', fail],
+                            ['unknown', unknown],
+                            ['build progress', (100 / (good + bad + fail + unknown) * (good + bad + fail)).toFixed(2) + '%'],
+                            ['jobs running', running],
+                            ['jobs available', available],
+                        ]);
+                    });
+            }
+
+            setInterval(fetchStats, 60 * 1000);
+            fetchStats();
+        });
+        </script>
+    </head>
+    <body>
+        <h1>
+		<a href="https://reproduce.debian.net">reproduce</a>.debian.net/<a href="https://loong64.reproduce.debian.net">loong64</a>
+	</h1>
+        <a href="stats/forky/rb.png"><img src="stats/forky/rb.png" align="right"></a>
+        <h3>
+	<a href="https://loong64.reproduce.debian.net/experimental.html">experimental</a>,
+	<a href="https://loong64.reproduce.debian.net/unstable.html">unstable</a>,
+	forky
+        </h3>
+        <code>
+		forky (arch:loong64) main+non-free-firmware
+        </code>
+
+        <div id="stats">Loading stats...</div>
+
+        <div>
+            <h3>Binary package search</h3>
+            <form id="search">
+                <input type="text" id="search-query" placeholder="2ping">
+                <input type="submit" value="Search">
+            </form>
+        </div>
+        <div id="search-results">
+        </div>
+
+	<footer>
+	    <br>
+	    <a href="stats/forky">Statistics about BAD packages</a> on loong64/forky.
+	    <br>
+	<hr>
+            pew pew, <a href="https://github.com/kpcyrd/rebuilderd">rebuilderd</a> using <a href="https://tracker.debian.org/pkg/devscripts">debrebuild</a> to reproduce what Debian distributes via <code><a href="https://ftp.debian.org/debian/dists/">ftp.debian.org</a></code>. ♥️
+	<br>
+	    <small>
+		This setup is work in progress, URLs might not be stable here.
+		<br>In case you are wondering why we are doing this, then hopefully the <a href="https://reproducible-builds.org">Reproducible Builds website</a> will explain why this is useful.
+		<br>
+		contact: IRC preferred: #debian-reproducible on OFTC or mail to holger at d.o
+	    </small>
+        </footer>
+    </body>
+</html>


=====================================
hosts/osuosl5-amd64/var/www/html/loong64/index.html
=====================================
@@ -0,0 +1 @@
+forky.html
\ No newline at end of file


=====================================
hosts/osuosl5-amd64/var/www/html/loong64/unstable.html
=====================================
@@ -0,0 +1,235 @@
+<!DOCTYPE html>
+<html lang="en">
+    <head>
+        <meta charset="utf-8">
+        <title>
+		reproduce.debian.net/loong64 - unstable (arch:loong64)
+        </title>
+        <style>
+        body {
+            font-family: sans-serif;
+            font-size: 18pt;
+        }
+        h1 {
+            font-size: 24pt;
+        }
+        h3 {
+            font-size: 18pt;
+        }
+
+        #search-results {
+            margin: 18pt 0;
+        }
+
+        pre {
+            margin: 0;
+        }
+
+        img {
+            vertical-align: middle;
+            max-width: 1920;
+            width: 50%;
+        }
+
+        #search-results pre {
+            margin: 12pt 0;
+        }
+
+        .status {
+            font-weight: bold;
+        }
+
+        .good {
+            color: green;
+        }
+
+        .fail {
+            color: yellow;
+        }
+
+        .bad {
+            color: red;
+        }
+
+        .unknown {
+            color: #957fff;
+        }
+
+        footer {
+            font-size: 12pt;
+        }
+        </style>
+        <script>
+        document.addEventListener('DOMContentLoaded', function() {
+            // package search
+            function spanWith(text) {
+                let s = document.createElement('span');
+                s.textContent = text;
+                return s;
+            }
+
+            function linkTo(href, text) {
+                let a = document.createElement('a');
+                a.href = href;
+                a.textContent = text;
+                return a;
+            }
+
+            function searchPkgs(query) {
+                let div = document.getElementById('search-results');
+                let url = '/loong64/api/v1/packages/binary?' + new URLSearchParams({
+                    name: query,
+                    distro: 'debian',
+		    release: 'unstable',
+                    seen_only: 'true',
+                });
+                fetch(url)
+                    .then(response => response.json())
+                    .then(data => {
+                        // clear children
+                        div.innerHTML = '';
+                        let result = data['records'];
+
+                        result.map(pkg => {
+                            let build_id = pkg.build_id;
+                            let artifact_id = pkg.artifact_id;
+                            let r = document.createElement('pre');
+
+                            r.appendChild(spanWith('['));
+                            let status = pkg['status'];
+                            let statusSpan = spanWith(status);
+                            statusSpan.className += ' status';
+                            if (status == 'GOOD') {
+                                statusSpan.className += ' good';
+                            } else if (status == 'FAIL') {
+                                statusSpan.className += ' fail';
+                            } else if (status == 'BAD') {
+                                statusSpan.className += ' bad';
+                            } else {
+                                statusSpan.className += ' unknown';
+                            }
+                            r.appendChild(statusSpan);
+                            r.appendChild(spanWith(`] ${pkg['name']} ${pkg['version']}\t\t`));
+
+                            if (build_id) {
+                                r.appendChild(spanWith(' ['));
+                                r.appendChild(linkTo(`/loong64/api/v1/builds/${build_id}/log`, 'log'));
+                                r.appendChild(spanWith(']'));
+                            }
+
+                            if (pkg.attestation_log_id) {
+                                r.appendChild(spanWith(' ['));
+                                r.appendChild(linkTo(`/loong64/api/v1/builds/${build_id}/artifacts/${artifact_id}/attestation`, 'attestation'));
+                                r.appendChild(spanWith(']'));
+                            }
+
+                            if (pkg.diffoscope_log_id) {
+                                r.appendChild(spanWith(' ['));
+                                r.appendChild(linkTo(`/loong64/api/v1/builds/${build_id}/artifacts/${artifact_id}/diffoscope`, 'diffoscope'));
+                                r.appendChild(spanWith(']'));
+                            }
+
+                            div.appendChild(r);
+                        });
+                    });
+            }
+
+            if (location.hash) {
+                searchPkgs(location.hash.substr(1));
+            }
+
+            document.getElementById('search').addEventListener('submit', function(e) {
+                e.preventDefault();
+                let query = document.getElementById('search-query').value;
+                location.href = `#${query}`;
+                searchPkgs(query);
+            });
+
+            // display stats
+            function updateStats(data) {
+                let div = document.getElementById('stats');
+                // clear children
+                div.innerHTML = '';
+                // add rows
+                data.map(row => {
+                    let r = document.createElement('pre');
+                    let key = row[0] + ': ';
+                    r.textContent = key.padEnd(25) + row[1];
+                    div.appendChild(r);
+                });
+            }
+
+            function fetchStats() {
+                fetch('/loong64/api/v1/dashboard?release=unstable')
+                    .then(response => response.json())
+                    .then(data => {
+                        let div = document.getElementById('stats');
+
+                        let good = data['rebuilds']['good'];
+                        let bad = data['rebuilds']['bad'];
+                        let fail = data['rebuilds']['fail'];
+                        let unknown = data['rebuilds']['unknown'];
+
+                        let running = data['jobs']['running'];
+                        let available = data['jobs']['available'];
+
+                        updateStats([
+                            ['reproduced', (100 / (good + bad + fail) * good).toFixed(2) + '%'],
+                            ['good', good],
+                            ['bad', bad],
+                            ['fail', fail],
+                            ['unknown', unknown],
+                            ['build progress', (100 / (good + bad + fail + unknown) * (good + bad + fail)).toFixed(2) + '%'],
+                            ['jobs running', running],
+                            ['jobs available', available],
+                        ]);
+                    });
+            }
+
+            setInterval(fetchStats, 60 * 1000);
+            fetchStats();
+        });
+        </script>
+    </head>
+    <body>
+        <h1>
+		<a href="https://reproduce.debian.net">reproduce</a>.debian.net/<a href="https://loong64.reproduce.debian.net">loong64</a>
+	</h1>
+        <a href="stats/unstable/rb.png"><img src="stats/unstable/rb.png" align="right"></a>
+        <h3>
+	<a href="https://loong64.reproduce.debian.net/experimental.html">experimental</a>,
+	unstable,
+	<a href="https://loong64.reproduce.debian.net/forky.html">forky</a>
+        </h3>
+        <code>
+		unstable (arch:loong64) main+non-free-firmware
+        </code>
+
+        <div id="stats">Loading stats...</div>
+
+        <div>
+            <h3>Binary package search</h3>
+            <form id="search">
+                <input type="text" id="search-query" placeholder="2ping">
+                <input type="submit" value="Search">
+            </form>
+        </div>
+        <div id="search-results">
+        </div>
+
+	<footer>
+	    <br>
+	    <a href="stats/unstable">Statistics about BAD packages</a> on loong64/unstable.
+	    <br>
+	<hr>
+            pew pew, <a href="https://github.com/kpcyrd/rebuilderd">rebuilderd</a> using <a href="https://tracker.debian.org/pkg/devscripts">debrebuild</a> to reproduce what Debian distributes via <code><a href="https://ftp.debian.org/debian/dists/">ftp.debian.org</a></code>. ♥️
+	<br>
+	    <small>
+		This setup is work in progress, URLs might not be stable here.
+		<br>In case you are wondering why we are doing this, then hopefully the <a href="https://reproducible-builds.org">Reproducible Builds website</a> will explain why this is useful.
+		<br>
+		contact: IRC preferred: #debian-reproducible on OFTC or mail to holger at d.o
+	    </small>
+        </footer>
+    </body>
+</html>


=====================================
hosts/osuosl5-amd64/var/www/html/rebuilderd-setup.html
=====================================
@@ -156,12 +156,15 @@ while true ; do env REBUILDERD_COOKIE_PATH=~/.local/share/rebuilderd-auth-cookie
 cd ; mkdir -p i386 ; cd i386 ; /opt/usr/bin/rebuilderd -c /opt/etc/rebuilderd-i386.conf 
 while true ; do env REBUILDERD_COOKIE_PATH=~/.local/share/rebuilderd-auth-cookie rebuildctl -H http://127.0.0.1:8485 pkgs sync-profile --sync-config /opt/etc/rebuilderd-sync-i386.conf debian-main --print-json | jq '.[] | select(.architecture != "all")' | jq -s | env REBUILDERD_COOKIE_PATH=~/.local/share/rebuilderd-auth-cookie rebuildctl -H http://127.0.0.1:8485 pkgs sync-stdin debian main ; ST=$(shuf -i 150-210 -n 1) ; echo sleeping ${ST}m now ; sleep ${ST}m ; done
 
-cd ; mkdir -p riscv64 ; cd riscv64 ; /opt/usr/bin/rebuilderd -c /opt/etc/rebuilderd-riscv64.conf
-while true ; do env REBUILDERD_COOKIE_PATH=~/.local/share/rebuilderd-auth-cookie rebuildctl -H http://127.0.0.1:8488 pkgs sync-profile --sync-config /opt/etc/rebuilderd-sync-riscv64.conf debian-main --print-json | jq '.[] | select(.architecture != "all")' | jq -s | env REBUILDERD_COOKIE_PATH=~/.local/share/rebuilderd-auth-cookie rebuildctl -H http://127.0.0.1:8488 pkgs sync-stdin debian main ; ST=$(shuf -i 150-210 -n 1) ; echo sleeping ${ST}m now ; sleep ${ST}m ; done
+cd ; mkdir -p loong64 ; cd loong64 ; /opt/usr/bin/rebuilderd -c /opt/etc/rebuilderd-loong64.conf
+while true ; do env REBUILDERD_COOKIE_PATH=~/.local/share/rebuilderd-auth-cookie rebuildctl -H http://127.0.0.1:8492 pkgs sync-profile --sync-config /opt/etc/rebuilderd-sync-loong64.conf debian-main --print-json | jq '.[] | select(.architecture != "all")' | jq -s | env REBUILDERD_COOKIE_PATH=~/.local/share/rebuilderd-auth-cookie rebuildctl -H http://127.0.0.1:8492 pkgs sync-stdin debian main ; ST=$(shuf -i 150-210 -n 1) ; echo sleeping ${ST}m now ; sleep ${ST}m ; done
 
 cd ; mkdir -p ppc64el ; cd ppc64el ; /opt/usr/bin/rebuilderd -c /opt/etc/rebuilderd-ppc64el.conf
 while true ; do env REBUILDERD_COOKIE_PATH=~/.local/share/rebuilderd-auth-cookie rebuildctl -H http://127.0.0.1:8490 pkgs sync-profile --sync-config /opt/etc/rebuilderd-sync-ppc64el.conf debian-main --print-json | jq '.[] | select(.architecture != "all")' | jq -s | env REBUILDERD_COOKIE_PATH=~/.local/share/rebuilderd-auth-cookie rebuildctl -H http://127.0.0.1:8490 pkgs sync-stdin debian main ; ST=$(shuf -i 150-210 -n 1) ; echo sleeping ${ST}m now ; sleep ${ST}m ; done
 
+cd ; mkdir -p riscv64 ; cd riscv64 ; /opt/usr/bin/rebuilderd -c /opt/etc/rebuilderd-riscv64.conf
+while true ; do env REBUILDERD_COOKIE_PATH=~/.local/share/rebuilderd-auth-cookie rebuildctl -H http://127.0.0.1:8488 pkgs sync-profile --sync-config /opt/etc/rebuilderd-sync-riscv64.conf debian-main --print-json | jq '.[] | select(.architecture != "all")' | jq -s | env REBUILDERD_COOKIE_PATH=~/.local/share/rebuilderd-auth-cookie rebuildctl -H http://127.0.0.1:8488 pkgs sync-stdin debian main ; ST=$(shuf -i 150-210 -n 1) ; echo sleeping ${ST}m now ; sleep ${ST}m ; done
+
 # with rebuilderd-worker from trixie:
 rebuilderd-worker -c /opt/etc/rebuilderd-worker.conf connect
 


=====================================
hosts/osuosl5-amd64/var/www/html/trixie-backports.html
=====================================
@@ -28,11 +28,11 @@
             display: inline;
         }
 
-        #stats-all, #stats-amd64, #stats-arm64, #stats-armel, #stats-armhf, #stats-i386, #stats-riscv64, #stats-ppc64el{
+        #stats-all, #stats-amd64, #stats-arm64, #stats-armhf, #stats-i386, #stats-riscv64, #stats-ppc64el{
             text-align: left;
 	}
 
-        #worker, #progress-all, #progress-amd64, #progress-arm64, #progress-armel, #progress-armhf, #progress-i386, #progress-riscv64, #progress-ppc64el{
+        #worker, #progress-all, #progress-amd64, #progress-arm64, #progress-armhf, #progress-i386, #progress-riscv64, #progress-ppc64el{
             font-size: 10pt;
 	}
 
@@ -95,8 +95,8 @@
                 fetchArchStats("armel", "trixie-backports");
                 fetchArchStats("armhf", "trixie-backports");
                 fetchArchStats("i386", "trixie-backports");
-                fetchArchStats("riscv64", "trixie-backports");
                 fetchArchStats("ppc64el", "trixie-backports");
+                fetchArchStats("riscv64", "trixie-backports");
             }
 
             function fetchArchStats(arch, release) {


=====================================
hosts/osuosl5-amd64/var/www/html/trixie.html
=====================================
@@ -28,11 +28,11 @@
             display: inline;
         }
 
-        #stats-all, #stats-amd64, #stats-arm64, #stats-armel, #stats-armhf, #stats-i386, #stats-riscv64, #stats-ppc64el{
+        #stats-all, #stats-amd64, #stats-arm64, #stats-armhf, #stats-i386, #stats-riscv64, #stats-ppc64el{
             text-align: left;
 	}
 
-        #worker, #progress-all, #progress-amd64, #progress-arm64, #progress-armel, #progress-armhf, #progress-i386, #progress-riscv64, #progress-ppc64el{
+        #worker, #progress-all, #progress-amd64, #progress-arm64, #progress-armhf, #progress-i386, #progress-riscv64, #progress-ppc64el{
             font-size: 10pt;
 	}
 
@@ -95,8 +95,8 @@
                 fetchArchStats("armel", "trixie");
                 fetchArchStats("armhf", "trixie");
                 fetchArchStats("i386", "trixie");
-                fetchArchStats("riscv64", "trixie");
                 fetchArchStats("ppc64el", "trixie");
+                fetchArchStats("riscv64", "trixie");
             }
 
             function fetchArchStats(arch, release) {


=====================================
hosts/osuosl5-amd64/var/www/html/unstable.html
=====================================
@@ -28,11 +28,11 @@
             display: inline;
         }
 
-        #stats-all, #stats-amd64, #stats-arm64, #stats-armhf, #stats-i386, #stats-riscv64, #stats-ppc64el{
+        #stats-all, #stats-amd64, #stats-arm64, #stats-armhf, #stats-i386, #stats-loong64, #stats-riscv64, #stats-ppc64el{
             text-align: left;
 	}
 
-        #worker, #progress-all, #progress-amd64, #progress-arm64, #progress-armhf, #progress-i386, #progress-riscv64, #progress-ppc64el{
+        #worker, #progress-all, #progress-amd64, #progress-arm64, #progress-armhf, #progress-i386, #progress-loong64, #progress-riscv64, #progress-ppc64el{
             font-size: 10pt;
 	}
 
@@ -94,8 +94,9 @@
                 fetchArchStats("arm64", "unstable");
                 fetchArchStats("armhf", "unstable");
                 fetchArchStats("i386", "unstable");
-                fetchArchStats("riscv64", "unstable");
+                fetchArchStats("loong64", "unstable");
                 fetchArchStats("ppc64el", "unstable");
+                fetchArchStats("riscv64", "unstable");
             }
 
             function fetchArchStats(arch, release) {
@@ -239,6 +240,22 @@
 	        <span id="worker">
 			infomaniak0(7|8)-amd64
 	        </span>
+	</td></tr><tr><td>
+		<a href="https://reproduce.debian.net/loong64/unstable.html">
+			loong64
+		</a>
+	</td><td>
+		<div id="stats-loong64">Loading stats...</div>
+	</td><td>
+		<a href="https://reproduce.debian.net/loong64/unstable.html">
+			<img src="https://reproduce.debian.net/loong64/stats/unstable/rb.png">
+		</a>
+		<a href="https://reproduce.debian.net/loong64/stats/unstable/rb.png">📈</a>
+	</td><td>
+		<div id="progress-loong64">Loading progress...</div>
+	        <span id="worker">
+			loong64-(01|02)
+	        </span>
 	</td></tr><tr><td>
 		<a href="https://reproduce.debian.net/ppc64el/unstable.html">
 			ppc64el



View it on GitLab: https://salsa.debian.org/qa/jenkins.debian.net/-/commit/f6fc2739141c09b299c4023d63da898d1048919d

-- 
View it on GitLab: https://salsa.debian.org/qa/jenkins.debian.net/-/commit/f6fc2739141c09b299c4023d63da898d1048919d
You're receiving this email because of your account on salsa.debian.org. Manage all notifications: https://salsa.debian.org/-/profile/notifications | Help: https://salsa.debian.org/help


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/qa-jenkins-scm/attachments/20260528/a3d5e441/attachment-0001.htm>


More information about the Qa-jenkins-scm mailing list