2 Commits

Author SHA1 Message Date
Kit OC5
790d794900 bridge: drop eternitas ci/build from BRIDGE_NO_DAEMON (converted to ci/smoke, #179)
All checks were successful
check / gate (push) Successful in 10s
canary / probe (push) Successful in 6s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-23 19:51:26 -04:00
Kit OC5
1b8cebbfe1 branding: friendly invite-only page instead of Gitea's raw Registration is disabled
A Windy account with no forge account (registration CLOSED at launch, Grant
09-23) lands on /user/link_account. Override shows invite-only + signed-in name
+ link to the dashboard; other cases = Gitea 1.24.6 template verbatim. No change
to who can register. Orchestrator ask 09-23.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-23 19:49:34 -04:00
4 changed files with 67 additions and 4 deletions

View File

@@ -425,5 +425,6 @@ def test_named_no_daemon_job_is_not_posted_for_that_repo_only(fake, monkeypatch)
assert sorted(p["context"] for p in f2.posted) == ["windy-git/ci/build", "windy-git/ci/test"] assert sorted(p["context"] for p in f2.posted) == ["windy-git/ci/build", "windy-git/ci/test"]
def test_default_no_daemon_named_is_eternitas_build(): def test_default_no_daemon_named_is_empty():
assert bridge.NO_DAEMON_NAMED.get("eternitas") == {"ci/build"} """eternitas converted its ci/build to a no-Docker ci/smoke (#179); nothing left."""
assert bridge.NO_DAEMON_NAMED == {}

View File

@@ -0,0 +1,61 @@
{{/* Windy Git override of Gitea 1.24.6 templates/user/auth/link_account.tmpl.
Forge registration is CLOSED at launch (Grant, 09-23), so a Windy account
with no forge account used to land on Gitea's raw "Registration is disabled"
error. That case now gets a plain invite-only page; every other case is
Gitea's template unchanged (re-diff it on Gitea upgrades). No change to who
can register. */}}
{{if and .DisableRegistration (not .user_exists)}}
{{template "base/head" .}}
<div role="main" aria-label="Windy Git is invite-only" class="page-content user link-account">
<div class="ui middle very relaxed page grid">
<div class="column tw-my-5">
<div class="tw-flex tw-flex-col tw-gap-4 tw-max-w-2xl tw-m-auto">
<h4 class="ui top attached header center">Windy Git is invite-only while we launch</h4>
<div class="ui attached segment">
<p>You're signed in with your Windy account{{if or .user_name .email}} as <strong>{{or .user_name .email}}</strong>{{end}}. Nothing is wrong with it: Windy Git just isn't open to every account yet.</p>
<p>We'll let you know when it opens.</p>
<a class="ui primary button" href="https://app.windyword.ai/dashboard">Back to your dashboard</a>
</div>
</div>
</div>
</div>
</div>
{{template "base/footer" .}}
{{else}}
{{template "base/head" .}}
<div role="main" aria-label="{{.Title}}" class="page-content user link-account">
<overflow-menu class="ui secondary pointing tabular top attached borderless menu secondary-nav">
<div class="overflow-menu-items tw-justify-center">
<!-- TODO handle .ShowRegistrationButton once other login bugs are fixed -->
{{if not .AllowOnlyInternalRegistration}}
<a class="item {{if not .user_exists}}active{{end}}"
data-tab="auth-link-signup-tab">
{{ctx.Locale.Tr "auth.oauth_signup_tab"}}
</a>
{{end}}
<a class="item {{if .user_exists}}active{{end}}"
data-tab="auth-link-signin-tab">
{{ctx.Locale.Tr "auth.oauth_signin_tab"}}
</a>
</div>
</overflow-menu>
<div class="ui middle very relaxed page grid">
<div class="column tw-my-5">
{{/* these styles are quite tricky but it needs to be the same as the signin page */}}
<div class="ui tab {{if not .user_exists}}active{{end}}" data-tab="auth-link-signup-tab">
<div class="tw-flex tw-flex-col tw-gap-4 tw-max-w-2xl tw-m-auto">
{{if .AutoRegistrationFailedPrompt}}<div class="ui message">{{.AutoRegistrationFailedPrompt}}</div>{{end}}
{{template "user/auth/signup_inner" .}}
</div>
</div>
<div class="ui tab {{if .user_exists}}active{{end}}" data-tab="auth-link-signin-tab">
<div class="tw-flex tw-flex-col tw-gap-4 tw-max-w-2xl tw-m-auto">
{{template "user/auth/signin_inner" .}}
</div>
</div>
</div>
</div>
</div>
{{template "base/footer" .}}
{{end}}

View File

@@ -111,7 +111,7 @@ their CI permanently, not a stopgap:
have no Docker daemon by design (I-5), so they are red on every commit. A have no Docker daemon by design (I-5), so they are red on every commit. A
rootless builder (BuildKit rootless / buildx in the capped dind) is the open rootless builder (BuildKit rootless / buildx in the capped dind) is the open
decision that would bring them back. Jobs that need Docker but are named otherwise go in decision that would bring them back. Jobs that need Docker but are named otherwise go in
`BRIDGE_NO_DAEMON` (default `eternitas:ci/build`). DECIDED 09-23 (orchestrator, `BRIDGE_NO_DAEMON` (empty since eternitas converted to ci/smoke, #179). DECIDED 09-23 (orchestrator,
option A): lanes convert these jobs to no-Docker smoke tests (job `services:` + option A): lanes convert these jobs to no-Docker smoke tests (job `services:` +
start the app + curl /health); the real image build is the deploy step on the start the app + curl /health); the real image build is the deploy step on the
target host. ci-hygiene flags docker build/compose/run in workflows ("needs docker"). target host. ci-hygiene flags docker build/compose/run in workflows ("needs docker").

View File

@@ -79,7 +79,8 @@ NO_DAEMON_JOB = re.compile(r"docker", re.IGNORECASE)
# each lane converts the job to a no-Docker smoke test; until then it is not # each lane converts the job to a no-Docker smoke test; until then it is not
# posted). Format: "repo:workflow/job,...;repo2:...". # posted). Format: "repo:workflow/job,...;repo2:...".
NO_DAEMON_NAMED: dict[str, set[str]] = {} NO_DAEMON_NAMED: dict[str, set[str]] = {}
for _entry in os.environ.get("BRIDGE_NO_DAEMON", "eternitas:ci/build").split(";"): # eternitas:ci/build dropped 09-23: converted to a no-Docker ci/smoke (#179).
for _entry in os.environ.get("BRIDGE_NO_DAEMON", "").split(";"):
if ":" in _entry: if ":" in _entry:
_repo, _jobs = _entry.split(":", 1) _repo, _jobs = _entry.split(":", 1)
NO_DAEMON_NAMED[_repo.strip()] = {j.strip() for j in _jobs.split(",") if j.strip()} NO_DAEMON_NAMED[_repo.strip()] = {j.strip() for j in _jobs.split(",") if j.strip()}