[Qa-jenkins-scm] [Git][qa/jenkins.debian.net][master] 8 commits: build_service: fix very long-standing typo in this command
Mattia Rizzolo (@mattia)
gitlab at salsa.debian.org
Sat Jun 10 21:26:54 BST 2023
Mattia Rizzolo pushed to branch master at Debian QA / jenkins.debian.net
Commits:
f28b5091 by Mattia Rizzolo at 2023-06-10T14:20:47+02:00
build_service: fix very long-standing typo in this command
Signed-off-by: Mattia Rizzolo <mattia at debian.org>
- - - - -
7b7c33b7 by Mattia Rizzolo at 2023-06-10T14:46:18+02:00
reproducible debian: create pbuilder/schroot jobs
also adjust the scheduling for bullseye and some bookworm now that's
(old)stable
Signed-off-by: Mattia Rizzolo <mattia at debian.org>
- - - - -
9eda33c7 by Mattia Rizzolo at 2023-06-10T14:46:41+02:00
reproducible debian: copy the bookworm results under trixie
Signed-off-by: Mattia Rizzolo <mattia at debian.org>
- - - - -
63eb9050 by Mattia Rizzolo at 2023-06-10T14:47:40+02:00
reproducible debian: start scheduling trixie builds too now \o/
Signed-off-by: Mattia Rizzolo <mattia at debian.org>
- - - - -
f9d5cb38 by Mattia Rizzolo at 2023-06-10T14:47:46+02:00
jenkins_node_wrapper: drop the schroot_*_diffoscope jobs from here, as we are not running them remotely
Signed-off-by: Mattia Rizzolo <mattia at debian.org>
- - - - -
40648f8a by Mattia Rizzolo at 2023-06-10T14:47:52+02:00
reproducible debian, maintenance: TESTING=bookworm→trixie
Signed-off-by: Mattia Rizzolo <mattia at debian.org>
- - - - -
1dc46284 by Mattia Rizzolo at 2023-06-10T14:48:08+02:00
update TODO
Signed-off-by: Mattia Rizzolo <mattia at debian.org>
- - - - -
f5686493 by Mattia Rizzolo at 2023-06-10T22:26:09+02:00
reproducible Debian: enable trixie
Signed-off-by: Mattia Rizzolo <mattia at debian.org>
- - - - -
9 changed files:
- TODO
- bin/jenkins_node_wrapper.sh
- bin/reproducible.ini
- bin/reproducible_build_service.sh
- bin/reproducible_common.sh
- bin/reproducible_db_maintenance.py
- bin/reproducible_maintenance.sh
- bin/reproducible_scheduler.py
- job-cfg/reproducible.yaml
Changes:
=====================================
TODO
=====================================
@@ -26,13 +26,17 @@ See link:https://jenkins.debian.net/userContent/about.html["about jenkins.debian
* things to do when bookworm has been released and trixie is open for development
** celebrate
-** pause building: shutdown build at service, cleanup_nodes.sh and shutdown jenkins
-** copy {rbuild,logs,dbd,dbdtxt,dbd|json|buildinfo}/{bookworm,trixie} (need to double check if there is are more dirs)
+** pause building: touch `NO-RB-BUILDERS-PLEASE`, shutdown build at service, reproducible_cleanup_nodes.sh and place jenkins in quiet-down.
+** `for d in buildinfo dbd dbdjson dbdtxt logdiffs logs rbuild ; do sudo -u jenkins cp -a "$d"/{bookworm,trixie} ; done`
** do a sql copy like the one we did for bookworm, see migration number 55
** create pbuilder setup jobs for trixie
** add trixie to the configuration (.py and .sh)
** adjust scheduler
-** restarts the builders
+** restart jenkins, run the trixie pbuilder and chroot jobs
+** run the maintenance jobs (to create the apt-venv)
+** once the above jobs are successful, restarts the builders
+** tweak reproducible_common.sh to start collect statistics on the daily builds for trixie too
+** tweak as needed for to properly graphs the just collected statistics
** adjust chroot jobs
** adjust orphaned/multiarch jobs
** upgrade amd64 nodes to bookworm (except jenkins)
=====================================
bin/jenkins_node_wrapper.sh
=====================================
@@ -148,6 +148,8 @@ elif [[ "$*" =~ ^reproducible_setup_pbuilder_bullseye_.*_.* ]] ; then
exec /srv/jenkins/bin/reproducible_setup_pbuilder.sh bullseye ; croak "Exec failed";
elif [[ "$*" =~ ^reproducible_setup_pbuilder_bookworm_.*_.* ]] ; then
exec /srv/jenkins/bin/reproducible_setup_pbuilder.sh bookworm ; croak "Exec failed";
+elif [[ "$*" =~ ^reproducible_setup_pbuilder_trixie_.*_.* ]] ; then
+ exec /srv/jenkins/bin/reproducible_setup_pbuilder.sh trixie ; croak "Exec failed";
elif [[ "$*" =~ ^reproducible_setup_pbuilder_unstable_.*_.* ]] ; then
exec /srv/jenkins/bin/reproducible_setup_pbuilder.sh unstable ; croak "Exec failed";
elif [[ "$*" =~ ^reproducible_setup_pbuilder_experimental_.*_.* ]] ; then
@@ -156,14 +158,6 @@ elif [[ "$*" =~ ^reproducible_maintenance_.*_.* ]] ; then
exec /srv/jenkins/bin/reproducible_maintenance.sh ; croak "Exec failed";
elif [[ "$*" =~ ^reproducible_node_health_check_.*_.* ]] ; then
exec /srv/jenkins/bin/reproducible_node_health_check.sh ; croak "Exec failed";
-elif [[ "$*" =~ ^reproducible_setup_schroot_buster_diffoscope_.*_.* ]] ; then
- exec /srv/jenkins/bin/schroot-create.sh reproducible reproducible-buster-diffoscope buster diffoscope locales-all ; croak "Exec failed";
-elif [[ "$*" =~ ^reproducible_setup_schroot_bullseye_diffoscope_.*_.* ]] ; then
- exec /srv/jenkins/bin/schroot-create.sh reproducible reproducible-bullseye-diffoscope bullseye diffoscope locales-all ; croak "Exec failed";
-elif [[ "$*" =~ ^reproducible_setup_schroot_bookworm_diffoscope_.*_.* ]] ; then
- exec /srv/jenkins/bin/schroot-create.sh reproducible reproducible-bookworm-diffoscope bookworm diffoscope locales-all ; croak "Exec failed";
-elif [[ "$*" =~ ^reproducible_setup_schroot_unstable_diffoscope_.*_.* ]] ; then
- exec /srv/jenkins/bin/schroot-create.sh reproducible reproducible-unstable-diffoscope unstable diffoscope locales-all openqa-client ; croak "Exec failed";
elif [[ "$*" =~ ^reproducible_coreboot ]] ; then
exec /srv/jenkins/bin/reproducible_coreboot.sh ; croak "Exec failed";
elif [[ "$*" =~ ^reproducible_openwrt ]] ; then
=====================================
bin/reproducible.ini
=====================================
@@ -24,7 +24,7 @@ buildinfo = buildinfo
[debian]
distro_root = debian
landing_page = reproducible.html
-suites = unstable bookworm bullseye buster experimental
+suites = unstable trixie bookworm bullseye buster experimental
archived_suites = stretch
archs = amd64 arm64 armhf i386
defaultsuite = unstable
=====================================
bin/reproducible_build_service.sh
=====================================
@@ -231,7 +231,7 @@ check_lock() {
if [ -f "$LOCKFILE" ]; then
echo "The lockfile $LOCKFILE is present, exiting the service..."
while : ; do
- children="$(pgre --list-full --parent $$)"
+ children="$(pgrep --list-full --parent $$)"
if [ -n "$children" ]; then
local SLEEPTIME=15m
echo "There are still some child processes, waiting $SLEEPTIME for them:"
=====================================
bin/reproducible_common.sh
=====================================
@@ -34,7 +34,7 @@ CHPATH=/srv/reproducible-results/chdist
mkdir -p "$CHPATH"
# Debian suites being tested
-SUITES="unstable bookworm bullseye buster experimental"
+SUITES="unstable trixie bookworm bullseye buster experimental"
ARCHIVED_SUITES="stretch"
# Debian architectures being tested
ARCHS="amd64 arm64 armhf i386"
=====================================
bin/reproducible_db_maintenance.py
=====================================
@@ -804,6 +804,26 @@ schema_updates = {
without_buildinfo INTEGER,
PRIMARY KEY (datum, suite, architecture))''',
],
+ 57: [ # copy bookworm packages (including results) in trixie
+ """INSERT INTO sources (name, version, suite, architecture, notify_maintainer, distribution)
+ SELECT name, version, 'trixie', architecture, notify_maintainer, distribution
+ FROM sources
+ WHERE suite = 'bookworm'""",
+ """WITH tr AS (
+ SELECT id, name, suite, architecture, version
+ FROM sources WHERE suite = 'trixie'),
+ sr AS (
+ SELECT s.name, s.architecture, r.version, r.status,
+ r.build_date, r.build_duration, r.node1, r.node2, r.job
+ FROM sources AS s JOIN results AS r ON s.id=r.package_id
+ WHERE s.suite = 'bookworm')
+ INSERT INTO results (package_id, version, status, build_date,
+ build_duration, node1, node2, job)
+ SELECT tr.id, sr.version, sr.status, sr.build_date,
+ sr.build_duration, sr.node1, sr.node2, sr.job
+ FROM tr JOIN sr ON tr.name=sr.name
+ AND tr.architecture=sr.architecture""",
+ ],
}
=====================================
bin/reproducible_maintenance.sh
=====================================
@@ -507,7 +507,7 @@ cleanup_old_schroots "schroots" 31 "/schroots/(reproducible-.+-[0-9]{1,5}|schroo
if [ -f /etc/debian_testing ] ; then
TESTING=$(cat /etc/debian_testing)
else
- TESTING=bookworm
+ TESTING=trixie
fi
cleanup_old_schroots "unstable and $TESTING schroots" 5 "/schroots/reproducible-(unstable|$TESTING)-diffoscope-.+-[0-9]{1,5}"
@@ -790,7 +790,7 @@ echo "$(date -u) - Checking for files with bad permissions."
# automatically fix rbuild files with wrong permissions...
# (we know it happens (very rarely) but... shrugs.)
[ ! -d $DEBIAN_BASE/rbuild ] || find $DEBIAN_BASE/rbuild ! -perm 644 -type f -exec chmod -v 644 {} \; 2>/dev/null|| true
-BADPERMS=$(find $DEBIAN_BASE/{buildinfo,dbd,artifacts,buster,bullseye,bookworm,unstable,experimental,rb-pkg} ! -perm 644 -type f 2>/dev/null|| true)
+BADPERMS=$(find $DEBIAN_BASE/{buildinfo,dbd,dbdtxt,dbdjson,logs,logdiffs,rbuild,artifacts,buster,bullseye,bookworm,trixie,unstable,experimental,rb-pkg} ! -perm 644 -type f 2>/dev/null|| true)
if [ -n "$BADPERMS" ] ; then
DIRTY=true
echo
=====================================
bin/reproducible_scheduler.py
=====================================
@@ -76,6 +76,7 @@ LIMITS = {
'buster': {'*': 255},
'bullseye': {'*': 255},
'bookworm': {'*': 255},
+ 'trixie': {'*': 255},
'unstable': {'*': 255},
'experimental': {'*': 255},
},
@@ -83,6 +84,7 @@ LIMITS = {
'buster': {'*': 255},
'bullseye': {'*': 255},
'bookworm': {'*': 255},
+ 'trixie': {'*': 255},
'unstable': {'*': 255},
'experimental': {'*': 255},
},
@@ -90,6 +92,7 @@ LIMITS = {
'buster': {'*': 255},
'bullseye': {'*': 255},
'bookworm': {'*': 255},
+ 'trixie': {'*': 255},
'unstable': {'*': 255},
'experimental': {'*': 255},
},
@@ -97,6 +100,7 @@ LIMITS = {
'buster': {'*': 255},
'bullseye': {'*': 255},
'bookworm': {'*': 255},
+ 'trixie': {'*': 255},
'unstable': {'*': 255},
'experimental': {'*': 255},
},
@@ -104,8 +108,9 @@ LIMITS = {
'new': {
'amd64': {
'buster': {1: (1000, 500), 2: (1500, 650), '*': 100},
- 'bullseye': {1: (1000, 500), 2: (1500, 750), '*': 150},
+ 'bullseye': {1: (1000, 500), 2: (1500, 650), '*': 150},
'bookworm': {1: (1000, 500), 2: (1500, 750), '*': 150},
+ 'trixie': {1: (1000, 500), 2: (1500, 750), '*': 150},
'unstable': {1: (1000, 500), 2: (1500, 750), '*': 250},
'experimental': {1: (1000, 500), 2: (1500, 750), '*': 50},
},
@@ -113,20 +118,23 @@ LIMITS = {
'buster': {1: (800, 400), 2: (1300, 650), '*': 100},
'bullseye': {1: (900, 400), 2: (1300, 650), '*': 100},
'bookworm': {1: (900, 400), 2: (1300, 650), '*': 100},
+ 'trixie': {1: (900, 400), 2: (1300, 650), '*': 100},
'unstable': {1: (1000, 600), 2: (1300, 750), '*': 250},
'experimental': {1: (800, 500), 2: (1300, 750), '*': 50},
},
'arm64': {
'buster': {1: (1000, 500), 2: (1500, 650), '*': 50},
- 'bullseye': {1: (1000, 500), 2: (1500, 750), '*': 150},
+ 'bullseye': {1: (1000, 500), 2: (1500, 650), '*': 50},
'bookworm': {1: (1000, 500), 2: (1500, 750), '*': 150},
+ 'trixie': {1: (1000, 500), 2: (1500, 750), '*': 150},
'unstable': {1: (1000, 500), 2: (1500, 750), '*': 125},
'experimental': {1: (1000, 500), 2: (1500, 750), '*': 25},
},
'armhf': {
'buster': {1: (900, 300), 2: (1400, 450), '*': 50},
- 'bullseye': {1: (900, 400), 2: (1400, 600), '*': 75},
+ 'bullseye': {1: (900, 300), 2: (1400, 450), '*': 75},
'bookworm': {1: (900, 400), 2: (1400, 600), '*': 75},
+ 'trixie': {1: (900, 400), 2: (1400, 600), '*': 75},
'unstable': {1: (900, 450), 2: (1400, 650), '*': 150},
'experimental': {1: (900, 400), 2: (1400, 600), '*': 25},
},
@@ -134,29 +142,33 @@ LIMITS = {
'ftbfs': {
'amd64': {
'buster': {1: (1000, 0), 2: (1500, 0), '*': 0},
- 'bullseye': {1: (1000, 20), 2: (1500, 10), '*': 5},
- 'bookworm': {1: (1000, 40), 2: (1500, 20), '*': 5},
+ 'bullseye': {1: (1000, 10), 2: (1500, 10), '*': 5},
+ 'bookworm': {1: (1000, 10), 2: (1500, 10), '*': 5},
+ 'trixie': {1: (1000, 40), 2: (1500, 20), '*': 5},
'unstable': {1: (1000, 40), 2: (1500, 20), '*': 5},
'experimental': {1: (1000, 40), 2: (1500, 20), '*': 2},
},
'i386': {
'buster': {1: (1000, 0), 2: (1300, 0), '*': 0},
'bullseye': {1: (1000, 20), 2: (1300, 10), '*': 5},
- 'bookworm': {1: (1000, 40), 2: (1300, 20), '*': 5},
+ 'bookworm': {1: (1000, 20), 2: (1300, 10), '*': 5},
+ 'trixie': {1: (1000, 40), 2: (1300, 20), '*': 5},
'unstable': {1: (1000, 40), 2: (1300, 20), '*': 5},
'experimental': {1: (1000, 40), 2: (1300, 20), '*': 2},
},
'arm64': {
'buster': {1: (1000, 0), 2: (1500, 0), '*': 0},
'bullseye': {1: (1000, 20), 2: (1500, 10), '*': 5},
- 'bookworm': {1: (1000, 40), 2: (1500, 20), '*': 5},
+ 'bookworm': {1: (1000, 20), 2: (1500, 10), '*': 5},
+ 'trixie': {1: (1000, 40), 2: (1500, 20), '*': 5},
'unstable': {1: (1000, 40), 2: (1500, 20), '*': 5},
'experimental': {1: (1000, 40), 2: (1500, 20), '*': 2},
},
'armhf': {
'buster': {1: (900, 0), 2: (1400, 0), '*': 0},
'bullseye': {1: (900, 10), 2: (1400, 5), '*': 5},
- 'bullseye': {1: (900, 20), 2: (1400, 10), '*': 5},
+ 'bookworm': {1: (900, 10), 2: (1400, 5), '*': 5},
+ 'trixie': {1: (900, 20), 2: (1400, 10), '*': 5},
'unstable': {1: (900, 20), 2: (1400, 10), '*': 5},
'experimental': {1: (900, 20), 2: (1400, 10), '*': 2},
}
@@ -165,28 +177,32 @@ LIMITS = {
'amd64': {
'buster': {1: (1000, 0), 2: (1500, 0), '*': 0},
'bullseye': {1: (1000, 200), 2: (1500, 100), '*': 50},
- 'bookworm': {1: (1000, 400), 2: (1500, 200), '*': 50},
+ 'bookworm': {1: (1000, 200), 2: (1500, 100), '*': 50},
+ 'trixie': {1: (1000, 400), 2: (1500, 200), '*': 50},
'unstable': {1: (1000, 400), 2: (1500, 200), '*': 50},
'experimental': {1: (1000, 400), 2: (1500, 200), '*': 20},
},
'i386': {
'buster': {1: (800, 0), 2: (1300, 0), '*': 0},
'bullseye': {1: (800, 200), 2: (1300, 100), '*': 50},
- 'bookworm': {1: (800, 400), 2: (1300, 200), '*': 50},
+ 'bookworm': {1: (800, 200), 2: (1300, 100), '*': 50},
+ 'trixie': {1: (800, 400), 2: (1300, 200), '*': 50},
'unstable': {1: (800, 400), 2: (1300, 200), '*': 50},
'experimental': {1: (800, 400), 2: (1300, 200), '*': 20},
},
'arm64': {
'buster': {1: (1000, 0), 2: (1500, 0), '*': 0},
'bullseye': {1: (1000, 200), 2: (1500, 100), '*': 50},
- 'bookworm': {1: (1000, 400), 2: (1500, 200), '*': 50},
+ 'bookworm': {1: (1000, 200), 2: (1500, 100), '*': 50},
+ 'trixie': {1: (1000, 400), 2: (1500, 200), '*': 50},
'unstable': {1: (1000, 400), 2: (1500, 200), '*': 50},
'experimental': {1: (1000, 400), 2: (1500, 200), '*': 20},
},
'armhf': {
'buster': {1: (900, 0), 2: (1400, 0), '*': 0},
'bullseye': {1: (900, 100), 2: (1400, 50), '*': 50},
- 'bookworm': {1: (900, 200), 2: (1400, 100), '*': 50},
+ 'bookworm': {1: (900, 100), 2: (1400, 50), '*': 50},
+ 'trixe': {1: (900, 200), 2: (1400, 100), '*': 50},
'unstable': {1: (900, 200), 2: (1400, 100), '*': 50},
'experimental': {1: (900, 200), 2: (1400, 100), '*': 20},
}
@@ -195,28 +211,32 @@ LIMITS = {
'amd64': {
'buster': {1: (1000, 0), 2: (1500, 0), '*': 0},
'bullseye': {1: (1000, 0), 2: (1500, 0), '*': 0},
- 'bookworm': {1: (1000, 1200), 2: (1500, 1000), '*': 0},
+ 'bookworm': {1: (1000, 10), 2: (1500, 10), '*': 0},
+ 'trixie': {1: (1000, 1200), 2: (1500, 1000), '*': 0},
'unstable': {1: (1000, 1350), 2: (1500, 1150), '*': 0},
'experimental': {1: (1000, 70), 2: (1500, 50), '*': 0},
},
'i386': {
'buster': {1: (800, 0), 2: (1300, 0), '*': 0},
'bullseye': {1: (800, 0), 2: (1300, 0), '*': 0},
- 'bookworm': {1: (1000, 1000), 2: (1500, 850), '*': 0},
+ 'bookworm': {1: (1000, 10), 2: (1500, 10), '*': 0},
+ 'trixie': {1: (1000, 1000), 2: (1500, 850), '*': 0},
'unstable': {1: (800, 1100), 2: (1300, 950), '*': 0},
'experimental': {1: (800, 70), 2: (1300, 50), '*': 0},
},
'arm64': {
'buster': {1: (1000, 0), 2: (1500, 0), '*': 0},
'bullseye': {1: (1000, 0), 2: (1500, 0), '*': 0},
- 'bookworm': {1: (1000, 1200), 2: (1500, 1000), '*': 0},
+ 'bookworm': {1: (1000, 10), 2: (1500, 10), '*': 0},
+ 'trixie': {1: (1000, 1200), 2: (1500, 1000), '*': 0},
'unstable': {1: (1000, 1300), 2: (1500, 1100), '*': 0},
'experimental': {1: (1000, 70), 2: (1500, 50), '*': 0},
},
'armhf': {
'buster': {1: (900, 0), 2: (1400, 0), '*': 0},
'bullseye': {1: (900, 0), 2: (1400, 0), '*': 0},
- 'bookworm': {1: (1000, 900), 2: (1500, 600), '*': 0},
+ 'bookworm': {1: (1000, 10), 2: (1500, 10), '*': 0},
+ 'trixie': {1: (1000, 900), 2: (1500, 600), '*': 0},
'unstable': {1: (900, 1200), 2: (1400, 800), '*': 0},
'experimental': {1: (900, 70), 2: (1400, 50), '*': 0},
}
=====================================
job-cfg/reproducible.yaml
=====================================
@@ -429,10 +429,13 @@
my_timed: '23 8 7 * *'
- 'setup_pbuilder_bullseye':
my_description: 'Setup pbuilder for reproducible builds of packages from bullseye'
- my_timed: '23 9 7,21 * *'
+ my_timed: '23 9 7 * *'
- 'setup_pbuilder_bookworm':
my_description: 'Setup pbuilder for reproducible builds of packages from bookworm'
- my_timed: '23 10 H/3 * *'
+ my_timed: '23 10 7 * *'
+ - 'setup_pbuilder_trixie':
+ my_description: 'Setup pbuilder for reproducible builds of packages from trixie'
+ my_timed: '23 11 H/3 * *'
- 'setup_pbuilder_unstable':
my_description: 'Setup pbuilder for reproducible builds of packages from unstable'
my_timed: '42 7 H/2 * *'
@@ -483,14 +486,19 @@
my_disabled: false
- 'bullseye_diffoscope':
my_description: 'Setup schroot for running diffoscope in a bullseye environment (this is needed to be able to correctly investigate haskell binaries...)'
- my_timed: '23 0 7,21 * *'
+ my_timed: '23 0 7 * *'
my_shell: '/srv/jenkins/bin/schroot-create.sh reproducible reproducible-bullseye-diffoscope bullseye diffoscope locales-all'
my_disabled: false
- 'bookworm_diffoscope':
my_description: 'Setup schroot for running diffoscope in a bookworm environment (this is needed to be able to correctly investigate haskell binaries...)'
- my_timed: '23 1 H/2 * *'
+ my_timed: '23 1 7,21 * *'
my_shell: '/srv/jenkins/bin/schroot-create.sh reproducible reproducible-bookworm-diffoscope bookworm diffoscope locales-all'
my_disabled: false
+ - 'trixie_diffoscope':
+ my_description: 'Setup schroot for running diffoscope in a trixie environment (this is needed to be able to correctly investigate haskell binaries...)'
+ my_timed: '23 1 H/2 * *'
+ my_shell: '/srv/jenkins/bin/schroot-create.sh reproducible reproducible-trixie-diffoscope trixie diffoscope locales-all'
+ my_disabled: false
- 'unstable_diffoscope':
my_description: 'Setup schroot for running diffoscope in a unstable environment (this is needed to be able to correctly investigate haskell binaries...)'
my_timed: '42 0 H/2 * *'
View it on GitLab: https://salsa.debian.org/qa/jenkins.debian.net/-/compare/9d2a5bce702ead3bcdcefa5466224d94aa632abb...f5686493fcf8d700d6795dcad91734d4b766f217
--
View it on GitLab: https://salsa.debian.org/qa/jenkins.debian.net/-/compare/9d2a5bce702ead3bcdcefa5466224d94aa632abb...f5686493fcf8d700d6795dcad91734d4b766f217
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/20230610/6dead03e/attachment-0001.htm>
More information about the Qa-jenkins-scm
mailing list