// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

The files in this directory constitute the continuous builder:

app/:     an AppEngine server. The code that runs http://build.golang.org/
buildlet/: HTTP server that runs on a VM and is told what to write to disk
           and what command to run. This is cross-compiled to all architectures
           and is the first program run when a builder VM comes up. It then
           is contacted by the coordinator to do a build.
builder/: gobuilder, a Go continuous build client
coordinator/: daemon that runs on CoreOS on Google Compute Engine and manages
          builds (using the builder in single-shot mode) in Docker containers.
env/:     configuration files describing the environment of builders and related binaries.
          Many builders are still configured ad-hoc.
watcher/: a daemon that watches for new commits to the Go repository and
          its sub-repositories, and notifies the dashboard of those commits.

If you wish to run a Go builder, please email golang-dev@googlegroups.com

To run a builder:

* Write the key ~gobuild/.gobuildkey 
  You need to get it from someone who knows the key.
  You may also use a filename of the form .gobuildkey-$BUILDER if you
  wish to run builders for multiple targets.

* Append your username and password googlecode.com credentials from
    https://code.google.com/hosting/settings
  to the buildkey file in the format "Username\nPassword\n".
  (This is for uploading tarballs to the project downloads section,
   and is an optional step.)

* Build and run gobuilder (see its documentation for command-line options).

