Build & test
There is no CI you push to and no test rig that runs your fork change for you.
Getting a change from your working tree onto a running box, and proving it
holds, is manual and box-shaped: you stage the change where the installer will
fetch it, let a disposable box pull it the way production would, and then run the
behaviour by hand. This topic covers the two halves — how a change actually
lands on a box (the prebuilt Aegir bundle vs the per-repo git clone the
_DL_MODE fork selects, and the versioned Drush 8 tarball, with the different
levers that make a box re-fetch each), and how you verify a security-sensitive
change once it is there, worked through end to end for the *.drush.inc
backend filter.
The lint gates that run before any of this — bash -n + ShellCheck for the
bash tree, phpNN -l and the PHP 5.6-through-8.5 span for the Aegir forks —
live on Code style & conventions and are
not repeated here; this topic starts where lint ends.
Delivery shapes and the _DL_MODE fork
Which mechanism carries your change onto a box decides how you make the box
pick it up — and the mechanism is not fixed: it is gated by _DL_MODE, which
ships BATCH (barracuda.sh.cnf:349, octopus.sh.cnf:210; the value is
persisted to a box's control file, default BATCH at
satellite.sh.inc:1185-1186). A default box therefore does not git-clone the
Aegir tree per repo — it pulls a single prebuilt bundle.
| Component | Default (_DL_MODE=BATCH) |
_DL_MODE=GIT opt-in |
Drush 8 fork (all modes) |
|---|---|---|---|
Hostmaster, Hosting, eldir, aegir_objects, hosting_civicrm, the rest of the hosting_* suite, and Provision |
prebuilt tarball make_local.tar.gz via _get_dev_ext from the mirror (master.sh.inc:560-568, satellite.sh.inc:3139-3147) |
per-repo git clone --branch (_gCb) at 5.x-${_tRee} from ${_gitHub} (https://github.com/omega8cc), Provision via _gCb ${_BRANCH_PRN} (master.sh.inc:576-588,688,793; satellite.sh.inc:3243-3244) |
— |
| Classic Drush 8 (the fork that carries the filter) | — | — | versioned tarball drush-${_DRUSH_VERSION}.tar.gz via _get_dev_ext from ${_urlDev}/${_tRee}/ (master.sh.inc:735, satellite.sh.inc:5542) |
Two levers follow from this, and they are different:
- The Aegir tree is bundle-borne on a default box.
_gCb ${_gitHub}/…runs only in theelse(non-BATCH) branch of_master_download_for_local_build(master.sh.inc:575-588) and its satellite twin — so pointing a default box at a branch that carries your Hostmaster/hosting/hosting_*/Provision commit and re-running the upgrade will not pick it up; the box rebuilds frommake_local.tar.gz, which is staged on the mirror, not cloned from the branch. To exercise a source change the branch way you must set_DL_MODE=GITon the test box (then the per-repo clone at5.x-${_tRee}fetches your branch;_BRANCH_PRNships the literalAUTO— set it to a real Provision branch such as5.x-${_tRee}for that path). Otherwise the branch change reaches boxes only once it is folded into the publishedmake_local.tar.gzbundle. - The Drush 8 fork is pin-borne in every mode.
_get_dev_extfetchesdrush-<VRN>.tar.gzand a box that already has that version skips it, so a re-run at the same pin never sees your change. Shipping a Drush-fork change is a version bump —_DRUSH_EIGHT_VRNinBARRACUDA.sh.txt:50,_DRUSH_VERSIONinOCTOPUS.sh.txt:56(8.5.4at HEAD) — plus staging the matching tarball. That is precisely how the drush-filter change moved from inert to shipped (effective and unconditional in8.5.3, then backend-identity-gated in8.5.4).
The tarball fetch is the same _get_dev_ext in every case — curl ${_crlGet} "${_urlDev}/${_tRee}/$1" (helper.sh.inc:264), a 10-attempt loop
(helper.sh.inc:261) — so a local test build lives at dev/<tree>/<name>.tar.gz
on whatever mirror the box resolves via _urlDev (barracuda.sh.cnf:1409).
How the whole box re-fetches BOA's own tool set on a tag — the _fetch_versioned
stamp/serial machinery — is the Release model & SKYNET pipeline
topic; this page is about the individual component your change lives in.
The disposable-VM test gate
The tree's own commit discipline states the standard plainly: changes land
unit-tested and ShellCheck-clean but explicitly "not yet VM-tested at commit
time", and operator docs for the riskier reapers advise "exercise in dry-run
and on a disposable VM before enabling on production." The gate is a real,
throwaway box because the things that break are environmental — a su without
- that changes HOME, a realpath that resolves differently under the real
Drupal-root cwd, an ICU/intl mismatch, a permission bit — none of which a lint
pass or a laptop php -l can see. The BOA 5.6 floor makes this sharper still:
there is no local php5.6, so a syntax-and-runtime claim about the 5.6 end of
the span is only ever confirmed on a box that actually runs the 5.6 CLI.
A minimal test loop for a fork change:
1. stage the change where the box will actually fetch it:
Aegir-tree change -> either fold it into the published make_local.tar.gz
bundle, OR set _DL_MODE=GIT on the box and push the
commit to a branch the box's _tRee clones (5.x-<tRee>)
Drush-8-fork change -> bump the pin + stage drush-<VRN>.tar.gz on the mirror
2. build a disposable box: full Barracuda install, then one Octopus instance
3. run the box's own upgrade path so it fetches your change the production way
(BATCH default: re-pulls the bundle/pin; _DL_MODE=GIT: re-clones the branch)
4. exercise the behaviour by hand — for a task-path change, run the real
Aegir task, not just the CLI it wraps
5. tear the box down
Step 4 is where the runbook below fits: for a change whose whole point is who is allowed to do something, you have to run it as each identity, on a real box, through the real discovery path — not reason about it from the diff.
Pages in this topic
- Building & testing BOA changes — the delivery
shapes end to end: how
_DL_MODEdecides whether the Aegir tree lands as the prebuiltmake_local.tar.gzbundle (defaultBATCH) or per-repo git clones (GIT), why the Drush 8 fork is always a versioned tarball needing a pin bump, the exact levers that make a box re-fetch each, how to point a disposable box at your change, and why the VM gate exists (environmental and cross-version-span failures a lint pass cannot catch). - Verifying the drush-filter — the
DRUSH-FILTER-TESTING.mdrunbook re-voiced for maintainers: the three tests that prove the*.drush.incbackend deny-filter holds both properties (backend identitiesaegir/oNdeny a tenant*.drush.inc;oN.ftplimited-shell sessions load their own contrib commands), keyed against theboa_extension_filter.incentry points, with the preconditions and pass-criteria that make a run definitive.
Reference
- Variables and
Commands — the consolidated
_VARand CLI tables, including the_DRUSH_*_VRN/_DRUSH_VERSIONpins,_tRee/_BRANCH_PRN/_gCb, and the upgrade verbs a test box drives. - Discontinued features — retired build/test mechanics land there; check it before documenting anything found only in old trees.