Import changes for goma server

  - ea652f7ec375df95e58c0253031dcd295fb1e5b6 fix copybara for public release
  - e11c8c928207920ff15fec47124c56e70f4c69e8 force to load configs when retrying
  - 28fcc0c2a7701320ab35a0ce446720af14b0730f command: Next uses ctx, and return ErrWatcherClosed when ...
  - b7b4fe5f6962f4724994639d6de3f23346ef95bf mitigate missing compiler.
  - a655123a3a6f56f6a1382d5aaf8515835f0a76cb roll v1.15.0 -> v1.16.0
  - d2ab42543f983c2d1e2b54b92118279a77b0801c roll 1.5.0 -> 1.5.1
  - 33055aaba37c7e9309e84c3b435a8f9b526a7270 Use go 1.17
  - bef24828dd4e48c2e2886756463666a58872099c roll v1.4.9 -> v1.5.0
  - 5a98c02b6b320161d1b8d4f8d328bc52704b2f61 roll v0.91.1 -> v0.93.3
  - 6f1377417c1692d6045c02d6d4820c20c955b2a7 fix nsjail seccomp filter for cros glibc update.
  - c6bea44b2ead61f86d3c5afb642fa8bbd39c996e roll v1.39.1 -> v1.40.0
  - 1996177b91433409e15eb1903722c4f1bc758a65 roll v1.14.0 -> v1.15.0
  - 3bc5010f0175fb59e4b868814f451c2387898066 roll v0.90.0 -> v0.91.1
  - 3bb8d7760d2642c70b0a2fda074d9ab42a267481 roll v1.39.0 -> v1.39.1
  - 3bcfbd6d24ca3113209608bd62cfb49a7d267543 roll v1.18.1 -> v1.19.0
  - 88b038ddaa9d960e19f4001558a434aa03856f38 roll v1.13.0 -> v1.14.0
  - aac8393a118158a6064156a425b1d578f97ed63c roll v0.89.0 -> v0.90.0
  - 85bdd8faac81be7ffe926dfa4b99257ff37000d7 roll v0.51.0 -> v0.52.0
  - a65c6dad61423b5d064aee1a1f5ad5d6495d980e roll v0.88.0 -> v0.89.0

GitOrigin-RevId: ea652f7ec375df95e58c0253031dcd295fb1e5b6
Change-Id: I29d051072bb168d58edb0203655a97f9527c3f27
12 files changed
tree: 6d43d4eaf7abfb63cfb08a1ad7291cf860c98998
  1. auth/
  2. backend/
  3. bytestreamio/
  4. cache/
  5. cmd/
  6. command/
  7. exec/
  8. execlog/
  9. file/
  10. frontend/
  11. fswatch/
  12. hash/
  13. httprpc/
  14. infra/
  15. log/
  16. profiler/
  17. proto/
  18. remoteexec/
  19. rpc/
  20. server/
  21. .gitallowed
  22. .gitignore
  24. cipd_manifest.txt
  25. cipd_manifest.versions
  27. go.mod
  28. go.sum
  30. OWNERS

Goma server

Goma is a distributed compiler service for open-source project such as Chromium and Android. It's some kind of replacement of distcc+ccache.

This is reference implementation of server code to be used with Goma client.


The Goma server uses a backend service that implements the Remote Execution API to distribute compile requests across a collection of worker machines and to cache the results of compilations. The Remote Execution API is an open-source standard, with multiple service implementations. The Goma server has been tested with Google's internal Remote Build Execution service, but could use other service implementations with some minor tweaks to the service code.

How to build

Goma server can be built on Linux.

$ GO111MODULE=on go get

You will get the binary in $(go env GOPATH)/bin.

How to run

remoteexec_proxy is a single server that acts as proxy server between Goma client and Remote Execution API.

$ remoteexec_proxy --port $PORT \
   --platform-container-image "docker://...@sha256:..." \
   --remoteexec-addr $REMOTEEXEC_ADDR \
   --remote-instance-name $REMOTE_INSTANCE_NAME

for chromium, platform container image would be something like

ENV DEBIAN_FRONTEND noninteractive

RUN apt-get -y update \
  && \
  apt-get install -f -y build-essential lsb-release python \
  && \
  rm -rf /var/lib/apt/lists/*

If Remote Execution API requires service account, specify service account JSON file for Remote Execution API by --service-account-json.

Running user is granted by default. If you need to allow other users, you need to specify them by --allowed-users.

Log messages will be output to stderr.

How to use

Install goma client. We provide prebuilt binary with cipd, which is available in depot_tools.

$ cipd install infra/goma/client/linux-amd64 -root ${HOME}/goma

or follow the build instructions to build your own local version of Goma client before running the server code, and install it in $HOME/goma.

Need to authenticate Goma client before use.

$ $HOME/goma/ login

Specify hostname in $GOMA_SERVER_HOST and port in $GOMA_SERVER_PORT, along with a few other environment flags.

$ export GOMA_SERVER_HOST='host-of-remoteexec_proxy-running'
$ export GOMA_SERVER_PORT='port-of-remoteexec_proxy-running'
$ export GOMA_USE_SSL=false

For example, if you are running remoteexec_proxy locally with --port 5050, use:

$ export GOMA_SERVER_HOST=localhost
$ export GOMA_SERVER_PORT=5050

Finally, start Goma client:

$ $HOME/goma/ ensure_start

and in chromium tree.

$ rm -f out/Release/obj/base/base/base64.o
$ GOMA_USE_LOCAL=false autoninja -C out/Release obj/base/base/base64.o