bootstrap.yml prepares a host as an admin via -u; new-deploy-key.sh makes the
key pair and refuses to write inside the repo. CI deploys refuse the bootstrap
playbook, since the dispatch API ignores the dropdown.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
-e start=false (mode sync in CI) lands the payload and starts nothing, for
migrations. A check run on a never-deployed stack now skips Compose with a note
instead of failing on the missing directory.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
README for humans, AGENTS.md for agents and contributors, and the docs that
outlive any one platform: architecture, secrets, connectivity, triggering a
deploy from another repository. CLAUDE.md, GEMINI.md and .claude/skills/ are
pointers rather than copies, so every agent and every human reads the same
text.
Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
The third port of the same two things. Gitea walks WORKFLOW_DIRS and stops
at the first directory that exists, so .gitea/workflows/ replaces
.github/workflows/ outright on a Gitea instance — which is the point, since
deploy.yml there is built on repository_dispatch and an environment: and
Gitea has neither.
Four differences shape the files:
- No environment:, so no scoped secret and no required reviewers. The file
does not write the key at all rather than claim a protection that Gitea
parses and ignores; what gates a deploy is write access to the repository.
- No repository_dispatch. External callers post to the workflow dispatch
API, which fills in the same form — and can return a run id, so unlike
repository_dispatch the caller may follow the deploy it asked for.
- runs-on takes a literal label only, so GitHub's vars.DEPLOY_RUNNER
expression becomes one documented line to edit.
- A job is itself a container with no Docker socket, so the secret scan runs
the pinned gitleaks binary instead of the upstream image.
Input validation carries over unchanged and matters more here: type: choice
constrains the dispatch form, not the API.
Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
The same two things as the GitHub workflows, in GitLab's shape: one lint
job, and a per-stack check/deploy button pair. Branch pipelines only, since
a bare `when: manual` would otherwise make GitLab build a merge request
pipeline that drops every job without rules — which looks exactly like the
deploy buttons having vanished.
Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
A lint gate on every push, a manual deploy form, and a connectivity
workflow for when a deploy hangs instead of failing. Nothing deploys on a
push: merging changes what would be deployed, a person still decides when.
The stack name and pull policy reach a shell command, so they are validated
through env: rather than interpolated into a run: block.
Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>