The self-hosting check cannot run on this runner

The job I added failed with `env: can't execute bash`, and the reason is worse
than a missing package. This project's runner is a docker executor with
`privileged = false` and `volumes = ["/cache"]`, so the job gets an alpine
container with no bash, no docker CLI, and no path to a daemon. I wrote and
tested the script against the host shell over ssh, which is not what CI is.

Wiring it up needs a runner change — privileged, a socket mount, or a shell
executor — on a machine that also serves production. That is not a change to
make on the way past, so the job is removed rather than left failing or, worse,
made to skip. A job that always skips is the pattern I spent this afternoon
removing from the Android suite; adding one here would be indefensible.

The script stays, and says plainly where it has to run and why it is not
automatic. It has earned that much: on its first two runs it found the missing
`docker network create web` and a documented password that broke the relay
about three times in four.

⚠️ So this closes #4 only in the sense that the check now exists and works.
"Nothing boots the quick start in CI" is still true, and now has a named
blocker rather than an absence.
This commit is contained in:
Paul Hitt
2026-08-31 14:47:26 -04:00
parent 250a3bb63f
commit 1fc5f8d1d2
2 changed files with 17 additions and 17 deletions
-17
View File
@@ -170,23 +170,6 @@ conformance:
timeout: 40 minutes
# What gets a package wrong is missing files, not failing logic.
# 🔴 Nothing in this repository ran the instructions it publishes, so when the
# quick start broke it stayed broken — three faults at once, and the last one
# survived a day of nobody noticing. The people it fails are self-hosters, at
# the moment they are deciding whether this project works.
#
# ⚠️ It BOOTS rather than validating YAML. `docker compose config` renders that
# file happily with no `web` network in existence — the external-network check
# happens at `up`, and so does the database URL the password goes into. A job
# that only linted would have passed throughout both outages it exists to catch.
selfhost:
<<: *rules
stage: test
tags: [vps]
script:
- Scripts/selfhost-smoke.sh
timeout: 15m
# 🔴 The generated pages are what people actually read. A source can be fixed
# and the page left stale, and nothing says so — /self-hosting was served for a
# day telling self-hosters to run `docker compose up -d` without the
+17
View File
@@ -16,6 +16,23 @@
# Scripts/selfhost-smoke.sh # published image, the documented path
# Scripts/selfhost-smoke.sh --build # build from source, the ARM path
#
# 🔴 **Not wired into CI, and not for want of trying.** This project's runner is
# a docker executor with `privileged = false` and no socket mounted, so a job
# here gets an alpine container with no bash, no docker CLI and no way to reach
# a daemon — `env: can't execute bash` is as far as it got. Running it in CI
# needs a runner change (privileged, a socket mount, or a shell executor), which
# is a decision about a machine that also serves production.
#
# ⚠️ Until then this is a RELEASE-TIME check somebody has to run, on any machine
# with docker:
#
# ssh <box> "cd /srv/prod/messenger/src && ./Scripts/selfhost-smoke.sh"
#
# A check that only runs when remembered is weaker than one that cannot be
# forgotten. It is still worth having: on its first two runs it found the
# missing `docker network create web` AND a documented password that broke the
# relay three times in four.
#
# Leaves nothing behind: a scratch directory, its own compose project name, and
# a trap that tears down volumes as well as containers.
set -euo pipefail