Commit Graph
14682 Commits
Author SHA1 Message Date
kevinveenbirkenbach f90d3e69c7 Merge remote-tracking branch 'origin/main' into fix/web-app-mobilizon/postgres-18-migrations/779 2026-10-04 22:10:35 +02:00
kevinveenbirkenbach 83ebe9067b Merge remote-tracking branch 'origin/main' into chore/remove-mcp-audit-report 2026-10-04 22:09:47 +02:00
kevinveenbirkenbach 9efa10d524 Merge pull request #786 from infinito-nexus/update/galaxy-pins-20261004-91c98f2
update(galaxy): bump pinned Ansible collections
2026-10-04 22:06:15 +02:00
kevinveenbirkenbach 9e2fa3ac3f Merge remote-tracking branch 'origin/main' into chore/remove-mcp-audit-report
# Conflicts:
#	docs/contributing/design/role/services/mcp/audit.md
2026-10-04 21:14:12 +02:00
kevinveenbirkenbach b7d84b2f0a Merge remote-tracking branch 'origin/main' into update/docker-image-versions-web-app-nextcloud-20261002-798c076 2026-10-04 21:13:45 +02:00
kevinveenbirkenbach fa8f556cac Merge remote-tracking branch 'origin/main' into fix/ci-fork-image-wait/784 2026-10-04 21:13:30 +02:00
kevinveenbirkenbach c756ead84d Merge remote-tracking branch 'origin/main' into update/docker-image-versions-web-svc-collabora-20261002-09740fb 2026-10-04 21:13:23 +02:00
kevinveenbirkenbach 40da248036 Merge remote-tracking branch 'origin/main' into fix/web-app-mobilizon/postgres-18-migrations/779 2026-10-04 21:13:12 +02:00
evangelostsak b5b0a94c3a docs(037): say which suite the pre-drill pass holds back
The browser suite, not both: the CLI suite declares required_by and the
deploy refuses to finish without it.
2026-10-04 21:11:00 +02:00
evangelostsak 33ffabc4d3 fix(stages): keep the CLI suite in the pass the drill tears down
The suite declares required_by for every web deploy, and the deploy
verifies afterwards that each such role actually executed. Holding it back
for the pre-drill pass therefore failed that pass outright:

  [ERROR] required role(s) did not execute for deploy [...]:
            - test-e2e-cli

Eleven meshed rounds died there, and every one of them was an application
that drills -- the only rounds that run a pass with the flag set. The lone
drilling round that survived was a database rather than a web application,
so the requirement never applied to it.

Only the browser suite stays behind the flag now. It is the expensive half
anyway: measured over one meshed round, Playwright is 13% of deploy task
time against 3.3% for the CLI suite, so holding the CLI suite back bought
almost nothing and cost the deploy its own completeness check.
2026-10-04 21:11:00 +02:00
kevinveenbirkenbach e73dfd79fb Merge pull request #770 from infinito-nexus/update/docker-image-versions-web-app-hermes-20261002-a0605c9
update(images): update Docker image versions (web-app-hermes)
2026-10-04 21:04:26 +02:00
kevinveenbirkenbach 5f80bc8361 Merge remote-tracking branch 'origin/main' into update/docker-image-versions-web-app-nextcloud-20261002-798c076 2026-10-04 20:59:44 +02:00
kevinveenbirkenbachandClaude Opus 5.5 3ab0153856 fix(ci): find the privileged run of a fork PR by its head commit
The wait for fork CI images never found the privileged workflow run it
watches. It selected a run only when the run's pull_requests array held
the PR number, and for a run whose head repository is a fork the API
returns that array empty. The job only runs for fork PRs, so the lookup
matched in no case it exists for.

The early exit for a failed privileged run was therefore unreachable.
When that run failed, the job kept polling until its timeout of 1980
attempts and held a runner for about five and a half hours.

The lookup now asks the API for the runs of the PR head commit and
selects by head_sha. That also replaces a paginated listing of every run
of the workflow with one small request per attempt. Without a known head
commit the match by PR number stays.

Refs #784

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-04 20:55:54 +02:00
kevinveenbirkenbachandClaude Opus 5.5 53f71d85c8 fix(ci): keep waiting for fork images when a run lookup fails
The job that waits for the CI images of a fork PR ended on the first
failed GitHub API call. The lookup of the privileged workflow run is
assigned with run_json="$(find_matching_run)" under set -e, so a failing
gh ended the script, although the loop is built for 1980 attempts. PR #782
went red that way: GitHub answered one request with HTTP 504 in attempt
31, while the privileged run was still queued.

A failed lookup now counts as "no information in this attempt" and the
loop goes on waiting for the images, which are its success criterion.
Thirty failed lookups in a row end the job with a message that names the
cause, so a broken token does not hold a runner until the timeout.

The test runs the script against a gh that fails every lookup. The
previous script fails both cases at the first lookup.

Closes #784

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-04 20:55:54 +02:00
kevinveenbirkenbach d17304746c Merge remote-tracking branch 'origin/main' into chore/remove-mcp-audit-report
# Conflicts:
#	docs/contributing/design/role/services/mcp/audit.md
2026-10-04 20:24:42 +02:00
kevinveenbirkenbach 65e8a3dd9a Merge remote-tracking branch 'origin/main' into update/docker-image-versions-web-svc-collabora-20261002-09740fb 2026-10-04 20:23:31 +02:00
kevinveenbirkenbach 76a0078ced Merge remote-tracking branch 'origin/main' into fix/web-app-mobilizon/postgres-18-migrations/779 2026-10-04 20:22:55 +02:00
kevinveenbirkenbach e01eac72a1 Merge pull request #772 from infinito-nexus/update/docker-image-versions-web-app-openbao-20261002-0539f15
update(images): update Docker image versions (web-app-openbao)
2026-10-04 20:18:22 +02:00
kevinveenbirkenbach b1e94e96f1 Merge pull request #771 from infinito-nexus/update/docker-image-versions-web-app-jenkins-20261002-49ea518
update(images): update Docker image versions (web-app-jenkins)
2026-10-04 20:17:07 +02:00
kevinveenbirkenbach b4c65d04fc Merge pull request #773 from infinito-nexus/update/docker-image-versions-web-app-prometheus-20261002-e2015e1
update(images): update Docker image versions (web-app-prometheus)
2026-10-04 20:16:34 +02:00
kevinveenbirkenbach c0e4b2c6e4 Merge remote-tracking branch 'origin/main' into chore/remove-mcp-audit-report
# Conflicts:
#	docs/contributing/design/role/services/mcp/audit.md
2026-10-04 20:15:56 +02:00
kevinveenbirkenbach ed22e5b9fd Merge remote-tracking branch 'origin/main' into fix/web-app-mobilizon/postgres-18-migrations/779 2026-10-04 20:14:59 +02:00
infinito-nexus-updater[bot] 28e189a0c5 update(galaxy): bump pinned Ansible collections 2026-10-04 16:02:30 +00:00
kevinveenbirkenbach 43f5f86abb Merge pull request #767 from infinito-nexus/update/docker-image-versions-web-app-wordpress-20261002-c780623
update(images): update Docker image versions (web-app-wordpress)
2026-10-04 17:31:20 +02:00
kevinveenbirkenbachandClaude Opus 5.5 7595d150a7 fix(web-app-mobilizon): patch four migrations for PostgreSQL 18
Every fresh Mobilizon deploy on PostgreSQL 18 died in migration
20190806131306. Four migrations drop the integer id column, add a uuid id
without NOT NULL and declare it the primary key in the same ALTER TABLE.
PostgreSQL 18 rejects that with 42P16 "primary key column "id" is not
marked NOT NULL", PostgreSQL 17 accepted it. The container exited 1 and
restarted in a loop, in compose and in swarm.

Upstream fixed it for 5.3.0 by adding null: false to that line in the four
migrations. No published image carries the fix yet, so the role builds its
own image on top of the pinned upstream one and applies the same one-line
change to the same four files.

The build fails once a base image no longer contains the unfixed line and
names the migration, so the patch cannot outlive its reason unnoticed.
TODO.md lists what to delete then.

Closes #779

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-04 16:57:26 +02:00
kevinveenbirkenbach 930e774fb9 Merge remote-tracking branch 'origin/main' into update/docker-image-versions-web-app-openbao-20261002-0539f15 2026-10-04 14:37:21 +02:00
kevinveenbirkenbach 7c56380d44 Merge remote-tracking branch 'origin/main' into update/docker-image-versions-web-app-prometheus-20261002-e2015e1 2026-10-04 14:37:16 +02:00
kevinveenbirkenbach ff2602a9c0 Merge remote-tracking branch 'origin/main' into update/docker-image-versions-web-app-jenkins-20261002-49ea518 2026-10-04 14:37:11 +02:00
kevinveenbirkenbach b3ca5d49b6 Merge remote-tracking branch 'origin/main' into update/docker-image-versions-web-app-hermes-20261002-a0605c9 2026-10-04 14:37:06 +02:00
kevinveenbirkenbach 94d6795d99 Merge remote-tracking branch 'origin/main' into update/docker-image-versions-web-app-wordpress-20261002-c780623 2026-10-04 14:37:02 +02:00
kevinveenbirkenbachandClaude Opus 5.5 9bdf33b89d fix(ci): treat an edited update branch as a duplicate of its own bump
The update bot recognised an open PR as a duplicate by hashing the blobs
of the files its commit changed, read at the PR head. A follow-up commit
that edits one of those files changes the hash, so the next run opened a
second PR with the identical bump: PR #778 next to PR #775 for
web-svc-collabora, after a fix had edited the bumped services.yml.

The branch name of a bot PR ends in the first seven characters of the
fingerprint of the change the bot proposed. An open PR whose branch ends
in the fingerprint of the fresh proposal now counts as a duplicate before
its head is compared. The head comparison stays as the second criterion.

The test runs pr.sh in a throwaway repository against a stubbed gh. It
fails on the previous script with exit 1, because that one goes on to
push.

Closes #780

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-04 14:36:57 +02:00
kevinveenbirkenbachandClaude Opus 5.5 5b002678df docs(mcp): remove the generated audit report
The report aggregated each role's meta/mcp.yml into one table, and its
freshness test failed on every image-version bump of an MCP-serving role,
because the updater edits services.yml and nothing regenerates the committed
report. The table added nothing the sources lack: scope and credential subject
were identical for every role, so it restated its inputs.

The generator, the report, its freshness test, make mcp-audit and the i8mcau
alias go, and make docs no longer calls the generator. The metadata stays in
each role's meta/mcp.yml, where test_mcp_schema.py enforces its shape, and
requirement 035 now says so. The classification and completeness lints stay,
because they check the lists in 035 against the roles, not the report.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-04 14:36:52 +02:00
kevinveenbirkenbach 188db392a5 Merge remote-tracking branch 'origin/main' into update/docker-image-versions-web-svc-collabora-20261002-09740fb 2026-10-04 14:29:11 +02:00
kevinveenbirkenbachandClaude Opus 5.5 c925150848 fix(web-app-openbao): ship the LDAP auth method as an external plugin
OpenBao 2.7 removed the builtin LDAP auth engine from the server binary
(openbao/openbao GH-3882). `bao auth enable ldap` answered
"plugin not found in the catalog: ldap" and the deploy stopped there.

The role now builds its own image. A multi-stage Dockerfile copies the
openbao-plugin-auth-ldap binary out of the image declared as the
`auth-ldap` service entry into /opt/openbao/plugins. A second server
config file, plugins.hcl, names that directory and registers the plugin
declaratively. It sets plugin_auto_register = true explicitly: the image
starts the server with a config directory, and on that path 2.7.1 does
not apply the documented default, so without the line the catalog stays
empty. The Dockerfile sets the file mode in a helper stage instead of
COPY --chmod, which only BuildKit accepts.

The mount is enabled with -plugin-version=latest, so it follows whichever
plugin version the image ships. A mount created by the former builtin
engine is tuned and reloaded onto the plugin, which needs `update` on
sys/plugins/reload/backend in the ansible-admin policy.

The LDAP tasks move into tasks/addons/auth-ldap.yml and the plugin is
declared under meta/addons as a required addon bridged to `ldap`. Its
Playwright spec logs in through the mount and asserts that sys/auth
reports an external running plugin version.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-04 13:25:17 +02:00
evangelostsak ae56878854 Merge remote-tracking branch 'upstream/main' into feature/svc-net-wireguard
No conflicts, and no file touched by both sides. Incoming is a run of
Docker image version bumps plus one CI change, which moves the diff
baseline from a force-pushed mirror of main to a fetch in each consumer --
entry-push-latest.yml and the resolve scripts, none of which this branch
touches.

Gates on the merged tree: unit 6199, lint 525, integration 330, external
19, ansible-lint clean, markdownlint clean, ruff clean.
2026-10-04 12:36:42 +02:00
evangelostsak 2a866719f9 docs(037): record the drill's exception to deploying once
Why a meshed round deploys twice when a drill is coming and once when it
is not, why the end-to-end suites belong to the pass after the drill, and
why the condition is asked of the drill rather than decided again.
2026-10-04 12:25:54 +02:00
evangelostsak 6b81e77dc0 fix(swarm-test): deploy twice only where the drill needs it
The drill tears the stack down and restores the data behind it, leaving
the bring-up to whatever deploys next. A meshed round deploys once, so after
a drill nothing brought the stack back onto the recovered export -- and the
round still reported green, because the marker is asserted against the
export rather than against a running stack.

That is observed, not predicted: a meshed BookWyrm round passed with

  backup + restore DR drill took 81s (rc=0)
  ==> DR drill PASSED: ... verified on the NFS export after the update pass

and nothing after it. The cluster finished the round torn down.

A meshed round now deploys before the drill as well, and only when the drill
says it is coming. That first pass carries SWARM_DR_PREPASS, which skips the
end-to-end suites because its stack is about to be thrown away; the pass
after the drill is the full one, so the suites run once and against the
recovered stack. A round with nothing to restore still deploys exactly once.

The arguments every deploy of a round shares move into one mapping, and the
environment the drill reads into one helper, which is what keeps the file
inside the size gate after the addition.
2026-10-04 12:25:54 +02:00
evangelostsak 44e1bd8727 feat(stages): let a pass about to be torn down skip the CLI suite
The counterpart to the Playwright gate, so one flag silences both suites
rather than half of them.
2026-10-04 12:25:53 +02:00
evangelostsak 6c20ff01da feat(stages): let a pass about to be torn down skip Playwright
Nothing declares the flag and nothing sets it by default, so the runtime
check still decides whether the suites are meaningful and a deploy that does
not ask behaves exactly as before. Only the pass whose stack the recovery
drill is about to tear down sets it, on its own run.
2026-10-04 12:25:53 +02:00
evangelostsak 3be3e3c484 feat(swarm-test): let the drill answer whether it will run
A round that drills has to deploy twice, so the caller needs the answer
before it deploys anything. Answering here keeps the rule deciding which
applications have something to restore in the script that already owns it,
rather than restating it in the caller.

The verdict is printed rather than signalled by exit status: a probe that
dies on the way to the decision must not read as 'no drill' and leave the
caller skipping the deploy the drill depends on.
2026-10-04 12:25:53 +02:00
evangelostsak 468d420781 fix(ci): declare the vpn axis on the dispatch trigger too
The axis was only an input of the reusable trigger, so a dispatch run
dropped it and fell back to the default. On auto, index 0 of sweep 0 is the
half of the rotation that carries the mesh, which is why a throwaway cluster
asked for the wireguard service to be switched off and raised it anyway:

  service 'wireguard' is disabled, but provider role 'svc-net-wireguard'
  is still active

Declared beside the tor axis it mirrors, with the same shape and default, so
a run that passes vpn= now gets what it asked for on either trigger.
2026-10-04 12:25:53 +02:00
kevinveenbirkenbach 377a2faec9 Merge pull request #761 from infinito-nexus/update/docker-image-versions-web-app-mattermost-20261002-85cee58
update(images): update Docker image versions (web-app-mattermost)
2026-10-04 07:35:38 +02:00
kevinveenbirkenbach 85016e3ad8 Merge remote-tracking branch 'origin/main' into update/docker-image-versions-web-svc-collabora-20261002-09740fb 2026-10-04 06:46:52 +02:00
kevinveenbirkenbach cbe83b6174 Merge remote-tracking branch 'origin/main' into update/docker-image-versions-web-app-prometheus-20261002-e2015e1 2026-10-04 06:46:40 +02:00
kevinveenbirkenbach da62810ac8 Merge remote-tracking branch 'origin/main' into update/docker-image-versions-web-app-jenkins-20261002-49ea518 2026-10-04 06:46:30 +02:00
kevinveenbirkenbach 1817d66fff Merge remote-tracking branch 'origin/main' into update/docker-image-versions-web-app-hermes-20261002-a0605c9 2026-10-04 06:46:20 +02:00
kevinveenbirkenbach 6b53c345f0 Merge remote-tracking branch 'origin/main' into update/docker-image-versions-web-app-wordpress-20261002-c780623 2026-10-04 06:46:11 +02:00
kevinveenbirkenbachandClaude Opus 5.5 d8f96c7f70 Merge remote-tracking branch 'origin/main' into update/docker-image-versions-web-app-openbao-20261002-0539f15
The validation job asserts that main is fully merged into the PR head,
so the branch has to carry the current main before CI can pass.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-04 06:23:52 +02:00
kevinveenbirkenbachandClaude Opus 5.5 0eead47fd5 Merge remote-tracking branch 'origin/main' into update/docker-image-versions-web-app-openbao-20261002-0539f15
The validation job asserts that main is fully merged into the PR head,
so the branch has to carry the current main before CI can pass.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-04 06:23:36 +02:00
kevinveenbirkenbachandClaude Opus 5.5 4fbf4242c2 Merge remote-tracking branch 'origin/main' into update/docker-image-versions-web-svc-collabora-20261002-09740fb
The validation job asserts that main is fully merged into the PR head,
so the branch has to carry the current main before CI can pass.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-04 06:06:36 +02:00