Stop baking the toolchain and dependencies into the build image.
Instead, run the install step each time, but use volume mounts or
CircleCI caching to keep the happy path fast.
Previously, some parts of the client (UI) directory were baked into the build
image, and some parts were mounted or copied into the build environment.
As a result, files baked into the build image require a two-step
update for changes to take effect in CI.
Now, for dockerised builds, we pre-install very little into the build
image and mount the whole directory into the build environment.
However, we do overlay a volume on the node_modules folder to allow the
standard build toolchain to be separate from the host build toolchain.
Non-dockerised builds (e.g. CI) are now more similar to the dockerised
versions.
Simplify deploy shell scripts;
Run yarn bundle as part of client-build step;
Install awscli as part of deploy step;
Don't run ui-upload in another container.
* Build 'runner' program in build job and save to workspace;
* Save build outputs - externalui, staticui, codecgen output;
* Install required tools in test VM;
* Call 'make deps' in integration-tests-job and touch 'runner' from
workspace so it doesn't rebuild.