Store results to cloud storage by configuration, as well as by builder

The results, logs, and flakiness are stored separately
for each configuration, in addition to by builder.
For each configuration appearing in results.json,
the cloud storage files
gs://dart-test-results/configuration/[channel]/[configuration]/latest
gs://dart-test-results/configuration/[channel]/[configuration]/[build number]/results.json
gs://dart-test-results/configuration/[channel]/[configuration]/[build number]/logs.json
gs://dart-test-results/configuration/[channel]/[configuration]/[build number]/flaky.json
gs://dart-test-results/configuration/[channel]/[configuration]/[build number]/revision
are created.

These new uploads will be inconsistent if more than one builder per
channel runs the same configuration, so we are disallowing that.
We plan to deprecate the per-builder uploads, and eventually remove
them, using the per-configuration uploads everywhere.

For experimental runs triggered by led, the cloud storage files are
created in the subdirectory
gs://dart-test-results/experimental/

Fixes: https://github.com/dart-lang/dart_ci/issues/81
Change-Id: I95b0989a01ef8d2a11473fc37ffeada7d4abb10b
Reviewed-on: https://dart-review.googlesource.com/c/recipes/+/145060
Reviewed-by: Alexander Thomas <athom@google.com>
10 files changed