[Git][qa/jenkins.debian.net][master] rdn: add armel.reproduce.debian.net - with many thanks to codethink.co.uk

Holger Levsen (@holger) gitlab at salsa.debian.org
Tue Apr 22 20:10:58 BST 2025



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


Commits:
260230bd by Holger Levsen at 2025-04-22T21:10:39+02:00
rdn: add armel.reproduce.debian.net - with many thanks to codethink.co.uk

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

- - - - -


10 changed files:

- bin/rebuilderd_manual_scheduler.sh
- bin/rebuilderd_pkgsync.sh
- hosts/osuosl5-amd64/etc/cron.d/rebuilderd
- hosts/osuosl5-amd64/etc/dehydrated/domains.txt
- hosts/osuosl5-amd64/etc/nginx/nginx.conf
- + hosts/osuosl5-amd64/opt/etc/rebuilderd-armel.conf
- + hosts/osuosl5-amd64/opt/etc/rebuilderd-sync-armel.conf
- + hosts/osuosl5-amd64/var/www/html/armel/index.html
- hosts/osuosl5-amd64/var/www/html/index.html
- job-cfg/reproducible.yaml


Changes:

=====================================
bin/rebuilderd_manual_scheduler.sh
=====================================
@@ -15,6 +15,8 @@ case $1 in
 			;;
 	arm64)		PORT=8486
 			;;
+	armel)		PORT=8491
+			;;
 	armhf)		PORT=8487
 			;;
 	i386)		PORT=8485


=====================================
bin/rebuilderd_pkgsync.sh
=====================================
@@ -19,6 +19,8 @@ case $ARCH in
 			;;
 	arm64)		PORT=8486
 			;;
+	armel)		PORT=8491
+			;;
 	armhf)		PORT=8487
 			;;
 	i386)		PORT=8485


=====================================
hosts/osuosl5-amd64/etc/cron.d/rebuilderd
=====================================
@@ -1,3 +1,3 @@
 MAILTO=root
-42 */3 * * * rebuilderd for arch in all amd64 i386 arm64 armhf riscv64 ppc64el; do mkdir -p /srv/rebuilderd/$arch/stats/ && /srv/jenkins/bin/rebuilderd_stats.py $arch /srv/rebuilderd/$arch/rebuilderd.db > /srv/rebuilderd/$arch/stats/index.html.tmp && mv /srv/rebuilderd/$arch/stats/index.html.tmp /srv/rebuilderd/$arch/stats/index.html ; done
-23 0,6,12,18 * * * rebuilderd for arch in all amd64 i386 arm64 armhf riscv64 ppc64el ; do /srv/jenkins/bin/rebuilderd_graph.sh $arch ; done
+42 */3 * * * rebuilderd for arch in all amd64 i386 arm64 armel armhf riscv64 ppc64el; do mkdir -p /srv/rebuilderd/$arch/stats/ && /srv/jenkins/bin/rebuilderd_stats.py $arch /srv/rebuilderd/$arch/rebuilderd.db > /srv/rebuilderd/$arch/stats/index.html.tmp && mv /srv/rebuilderd/$arch/stats/index.html.tmp /srv/rebuilderd/$arch/stats/index.html ; done
+23 0,6,12,18 * * * rebuilderd for arch in all amd64 i386 arm64 armel armhf riscv64 ppc64el ; do /srv/jenkins/bin/rebuilderd_graph.sh $arch ; done


=====================================
hosts/osuosl5-amd64/etc/dehydrated/domains.txt
=====================================
@@ -3,6 +3,7 @@ amd64.reproduce.debian.net
 i386.reproduce.debian.net
 arm64.reproduce.debian.net
 armhf.reproduce.debian.net
+armel.reproduce.debian.net
 riscv64.reproduce.debian.net
 ppc64el.reproduce.debian.net
 all.reproduce.debian.net


=====================================
hosts/osuosl5-amd64/etc/nginx/nginx.conf
=====================================
@@ -19,6 +19,7 @@ http {
         server_name     amd64.reproduce.debian.net;
         server_name     i386.reproduce.debian.net;
         server_name     arm64.reproduce.debian.net;
+        server_name     armel.reproduce.debian.net;
         server_name     armhf.reproduce.debian.net;
         server_name     riscv64.reproduce.debian.net;
         server_name     ppc64el.reproduce.debian.net;
@@ -98,6 +99,20 @@ http {
             alias /srv/rebuilderd/arm64/stats/ ;
             disable_symlinks off;
         }
+        # armel
+        location /armel/api/ {
+            proxy_set_header    X-Real-IP          $remote_addr;
+            proxy_pass http://127.0.0.1:8491/api/;
+        }
+        location = /armel/api/v0/build/report {
+            client_max_body_size 200M;
+            proxy_set_header    X-Real-IP          $remote_addr;
+            proxy_pass http://127.0.0.1:8491/api/v0/build/report;
+        }
+        location /armel/stats/ {
+            alias /srv/rebuilderd/armel/stats/ ;
+            disable_symlinks off;
+        }
         # armhf
         location /armhf/api/ {
             proxy_set_header    X-Real-IP          $remote_addr;
@@ -229,6 +244,31 @@ http {
         }
     }
 
+    server {
+        server_name     armel.reproduce.debian.net;
+        ssi on;
+        root /var/www/html;
+        listen 443 ssl;
+        ssl_certificate /var/lib/dehydrated/certs/armel.reproduce.debian.net/fullchain.pem;
+        ssl_certificate_key /var/lib/dehydrated/certs/armel.reproduce.debian.net/privkey.pem;
+
+        ssl_session_cache shared:le_nginx_SSL:10m;
+        ssl_session_timeout 1440m;
+        ssl_session_tickets off;
+        ssl_protocols TLSv1.2 TLSv1.3;
+        ssl_prefer_server_ciphers off;
+        ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-C
+        HACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384";
+        location /.well-known/acme-challenge/ {
+            alias /var/lib/dehydrated/acme-challenges/;
+            disable_symlinks off;
+            autoindex off;
+        }
+        location / {
+            return 301 https://reproduce.debian.net/armel$request_uri;
+        }
+    }
+
     server {
         server_name     armhf.reproduce.debian.net;
         ssi on;


=====================================
hosts/osuosl5-amd64/opt/etc/rebuilderd-armel.conf
=====================================
@@ -0,0 +1,40 @@
+## Configuration for http daemon
+[http]
+## The address to bind to. This is 127.0.0.1:8484 by default.
+bind_addr = "127.0.0.1:8491"
+## If you use a reverse proxy, use this header instead of the actual connecting ip.
+## Make sure the reverse proxy has filters in place to prevent spoofing issues.
+#real_ip_header = "X-Real-IP"
+## Set a default endpoint for rebuildctl. This is especially useful for the sync timer.
+#endpoint = "http://127.0.0.1:8484"
+
+## A random cookie for administration is generated at startup and written to /var/lib/rebuilderd/auth-cookie
+## You can set this to a fixed value here. Use `pwgen -1s 32` to generate one.
+## rebuildctl is searching for this cookie in ~/.config/rebuilderd.conf, /etc/rebuilderd.conf and
+## /var/lib/rebuilderd/auth-cookie in that order.
+#[auth]
+#cookie = "INSECURE"
+
+## The auth cookie above is only used for the default endpoint.
+## You can use different endpoints with `rebuildctl -H https://rebuilder.example.com status`,
+## In that case you need to configure a section below if you want to attach a cookie.
+#[endpoints."https://rebuilder.example.com"]
+#cookie = "INSECURE"
+
+## IMPORTANT: in production, make sure either `authorized_workers` or `signup_secret` is configured.
+[worker]
+## If we have a fixed set of workers we can allow-list the keys here.
+#authorized_workers = ["key1", "key2"]
+## If we want to spawn new workers dynamically we can configure a sign up secret below.
+## Use `pwgen -1s 32` to generate one.
+signup_secret = "INSECURE"
+
+#[schedule]
+## Configure the delay to automatically retry failed rebuilds in hours. The
+## default is 24h, this base is multiplied with the number of rebuilds, so the
+## first retry would happen after 24h, the second retry would happen 48h after the
+## first retry and the third retry would happen 72h after the second retry. There
+## is no upper limit of retries, if you can't afford frequent retries it's
+## recommended to set this to a high value like 168 (1 week) or higher.
+## Successful rebuilds are not retried.
+#retry_delay_base = 24


=====================================
hosts/osuosl5-amd64/opt/etc/rebuilderd-sync-armel.conf
=====================================
@@ -0,0 +1,9 @@
+[profile."debian-main"]
+distro = "debian"
+suite = "main"
+architectures = ["armel"]
+#releases = ["buster", "sid"]
+releases = ["trixie"]
+source = "http://deb.debian.org/debian"
+#excludes = ["tensorflow*"]
+#pkgs = ["anarchism"]


=====================================
hosts/osuosl5-amd64/var/www/html/armel/index.html
=====================================
@@ -0,0 +1,220 @@
+<!DOCTYPE html>
+<html lang="en">
+    <head>
+        <meta charset="utf-8">
+        <title>
+		reproduce.debian.net/armel - trixie (arch:armel)
+        </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;
+        }
+
+        .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 = '/armel/api/v0/pkgs/list?' + new URLSearchParams({
+                    name: query,
+                    distro: 'debian',
+                });
+                fetch(url)
+                    .then(response => response.json())
+                    .then(data => {
+                        // clear children
+                        div.innerHTML = '';
+
+                        data.map(pkg => {
+                            let build_id = pkg.build_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 == '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(`/armel/api/v0/builds/${build_id}/log`, 'log'));
+                                r.appendChild(spanWith(']'));
+                            }
+
+                            if (pkg.has_attestation) {
+                                r.appendChild(spanWith(' ['));
+                                r.appendChild(linkTo(`/armel/api/v0/builds/${build_id}/attestation`, 'attestation'));
+                                r.appendChild(spanWith(']'));
+                            }
+
+                            if (pkg.has_diffoscope) {
+                                r.appendChild(spanWith(' ['));
+                                r.appendChild(linkTo(`/armel/api/v0/builds/${build_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('/armel/api/v0/dashboard')
+                    .then(response => response.json())
+                    .then(data => {
+                        let div = document.getElementById('stats');
+                        let main = data['suites']['main'];
+
+                        let good = main['good'];
+                        let bad = main['bad'];
+                        let unknown = main['unknown'];
+
+                        let queue = data['queue_length'];
+                        let workers = data['active_builds'].length;
+
+                        updateStats([
+                            ['reproduced', (100 / (good + bad) * good).toFixed(2) + '%'],
+                            ['good', good],
+                            ['bad', bad],
+                            ['unknown (binary pkgs)', unknown],
+                            ['build progress', (100 / (good + unknown + bad) * (good + bad)).toFixed(2) + '%'],
+                            ['queue length (src pkgs)', queue],
+                            ['active workers', workers],
+                        ]);
+                    });
+            }
+
+            setInterval(fetchStats, 60 * 1000);
+            fetchStats();
+        });
+        </script>
+    </head>
+    <body>
+        <h1>
+		<a href="https://reproduce.debian.net">reproduce</a>.debian.net/armel
+        </h1>
+        <a href="stats/rb.png"><img src="stats/rb.png" align="right"></a>
+        <h3>
+		trixie (arch:armel)
+        </h3>
+
+        <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/">Statistics about BAD packages</a> on arm64.
+	    <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>
+		<a href="https://reproduce.debian.net/">This setup</a> is in it's infancy, even though by now everything is in trixie. Still, please don't consider any URLs as stable here, and more to the point, especially don't take any numbers here seriously, unless...!?!
+		<br/>Oh, and 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.
+		<!--#config timefmt="%Y-%m-%d" --><br/>Static content last modified: <!--#echo var="date_gmt" -->
+		</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/index.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-armel, #stats-armhf, #stats-i386, #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-armel, #progress-armhf, #progress-i386, #progress-riscv64, #progress-ppc64el{
             font-size: 10pt;
 	}
 
@@ -92,6 +92,7 @@
                 fetchArchStats("all");
                 fetchArchStats("amd64");
                 fetchArchStats("arm64");
+                fetchArchStats("armel");
                 fetchArchStats("armhf");
                 fetchArchStats("i386");
                 fetchArchStats("riscv64");
@@ -187,6 +188,21 @@
 		<div id="progress-arm64">Loading progress...</div>
 	</td><td id="worker">
 		codethink02
+	</td></tr><tr><td>
+		<a href="https://reproduce.debian.net/armel/">
+			trixie/armel
+		</a>
+	</td><td>
+		<div id="stats-armel">Loading stats...</div>
+	</td><td>
+		<a href="https://reproduce.debian.net/armel/">
+			<img src="https://reproduce.debian.net/armel/stats/rb.png">
+		</a>
+		<a href="https://reproduce.debian.net/armel/stats/rb.png">📈</a>
+	</td><td>
+		<div id="progress-armel">Loading progress...</div>
+	</td><td id="worker">
+		codethink05
 	</td></tr><tr><td>
 		<a href="https://reproduce.debian.net/armhf/">
 			trixie/armhf
@@ -250,7 +266,7 @@
 	</td></tr>
 	</table>
 	<br/>
-	Hopefully coming soon: armel, s390x, mips64el and <a href="https://github.com/kpcyrd/rebuilderd/issues/163">unstable/*</a>! 
+	Hopefully coming soon: s390x, mips64el and <a href="https://github.com/kpcyrd/rebuilderd/issues/163">unstable/*</a>! 
 	<br/>
 	<small>
 		(Though we currently have no idea how to get access to mips64el systems...)


=====================================
job-cfg/reproducible.yaml
=====================================
@@ -348,6 +348,7 @@
                 - 'codethink02':    { my_arch: 'arm64' }
                 - 'codethink03':    { my_arch: 'arm64' }
                 - 'codethink04':    { my_arch: 'arm64' }
+                - 'codethink05':    { my_arch: 'arm64' }
                 - 'riscv64-01':     { my_arch: 'riscv64' }
                 - 'riscv64-02':     { my_arch: 'riscv64' }
                 - 'riscv64-06':     { my_arch: 'riscv64' }
@@ -404,6 +405,7 @@
                 - 'codethink02':    { my_arch: 'arm64' }
                 - 'codethink03':    { my_arch: 'arm64' }
                 - 'codethink04':    { my_arch: 'arm64' }
+                - 'codethink05':    { my_arch: 'arm64' }
                 - 'riscv64-01':     { my_arch: 'riscv64' }
                 - 'riscv64-02':     { my_arch: 'riscv64' }
                 - 'riscv64-06':     { my_arch: 'riscv64' }



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

-- 
View it on GitLab: https://salsa.debian.org/qa/jenkins.debian.net/-/commit/260230bd683b375e3bddcf835c5e4cda7f5b35fe
You're receiving this email because of your account on salsa.debian.org.


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


More information about the Qa-jenkins-scm mailing list