The provider-matrix and reliability release: Bitbucket joins GitHub, GitLab and Gitea end-to-end (repos, branches, webhooks, PR preview environments), and a batch of quietly-broken reliability paths — hook quoting, agent op timeouts, database size/restore ordering — is fixed and pinned with tests.
Added
- Bitbucket support, end-to-end. Sources gain the
bitbuckettype (Bitbucket Cloud API tokens, Bearer auth): the repos/branches pickers, the connection test, and the web UI dropdown with deploy-key instructions. Webhooks handlerepo:pushandpullrequest:*— verified by theX-Hub-Signaturesha256 HMAC, deduplicated byX-Request-UUID, with push hashes parsed frompush.changes[].new.targetand PRs mapped to opened/synchronize/closed(+merged). Private repos: the deploy-key (SSH) path is the recommended flow. PR preview environments work for Bitbucket pull requests like every other provider.
Fixed
- Lifecycle hook commands are tokenized quote-aware. The old
whitespace split left quote bytes in argv, so the documented compound
form
sh -c "a && b"failed with command-not-found. Single quotes are literal, double-quote backslash escapes work, empty quoted args survive, unterminated quotes run to end of input. - Agent operations can no longer run orphaned. Each agent op gets a
595 s child-side timeout (just under the 600 s master request
window) with a process-group kill — a stalled
git fetchused to hold the workspace's.gitlocks and fail the NEXT op with "cannot lock ref". Children killed by a signal now report the signal instead of a nonsense "code null". - Redis/Valkey restores stop the container before copying
dump.rdb. A graceful shutdown SAVEs memory to disk, so the old copy-then-restart order let the dying process overwrite the staged backup — the "restored" server reloaded its own old data. - Postgres restores run
psqlwithON_ERROR_STOP. A bare-fcontinues past statement errors and exits 0, reporting partially-applied dumps as successful restores. - Managed Mongo sizes report real numbers (the stats call now
authenticates with the root credentials — unauthenticated
dbStatswas rejected and sizes silently read 0). localhost/team/appimage references resolve against the local registry (Docker's own first-segment rule) instead of a Docker Hub namespace.- The installer self-checks its environment. Every bare-metal
install/upgrade verifies the rendered unit exports
DOCKER_CONFIGandPM2_HOME(missing either re-creates the "read-only file system" build failures on hardened hosts) and runs a five-second scratchdocker buildpreflight; CI gained an installer syntax +set -usmoke gate so an installer regression cannot merge again.