In my case (an in-house designed/built/supported CB system), commits to the VCS in the tree targeted by a given CB config automatically queue a CB request (multiple requests arriving while a CB is running get collapsed into one, which will run as soon as the current CB process is done).
Each CB instance responds to a CB request by performing the build and test steps it's configured to do (farming them out in parallel to a "cloud" of distributed servers shared by all CB instrances), logging the build and test results, and occasionally (not more often than a configured frequency) launching "heavy tests" (which may run for a VERY long time and will NOT block oncoming CB requests -- heavy tests are forked off completely, though the logs make it very clear exactly against which build they ran).
"sync to head" (that "head" would be "trunk" in other VCS's;-), for dependencies that are not part of the tree tracked by a CB, may happen every time (these would be lightweight, non-production-critical, or experimental builds), or only on very explicit integration requests (that's the other extreme, for "release branches" for builds/projects that ARE production-critical), or with intermediate tolerance.
Not the apex of release engineering practice, I think, but in its range of options it works well for us, for a really wide variety of projects of very diverse criticality, dependency-heaviness, &c;-).