Skip to content

uber/tango

Repository files navigation

Tango OSS

Tango OSS (Target Analyzer in Go) provides APIs for fetching and comparing target graphs and services. It is a standalone library that can be used and executed independently of the monorepo.

Quick Start

Prerequisites

  • Bazel 8.4.1 (automatically managed via tools/bazel)
  • protoc (for proto generation only)
  • direnv (optional, for loading .envrc)

Build and Test

The project includes a Makefile for common tasks:

# Build all targets
make build

# Run all tests
make test

# Build and test
make build && make test

# Show all available commands
make help

Run Server & Client

# Run the Tango server (port 8081)
make run-server

# In another terminal, run client with custom parameters
make run-client-get-graph REMOTE=https://github.com/uber/tango.git  METHOD=get-target-graph BASE_SHA=HEAD
make run-client-changed-targets REMOTE=https://github.com/uber/tango.git BASE_SHA=872881fd~1 NEW_BASE_SHA=872881fd

For a complete list of available commands, run make help.

Installation

The project is self-contained and uses tools/bazel wrapper to automatically download and manage Bazel.

Optional: Set up direnv

# Install direnv (macOS)
brew install direnv

# Add to your shell (bash/zsh)
echo 'eval "$(direnv hook bash)"' >> ~/.bashrc  # or ~/.zshrc

# Allow .envrc in the project
direnv allow

Once set up, you can build the project:

make build
# or directly with the bazel wrapper
./tools/bazel build //...

Development

Setup IDE

You can either

  • use any IDE that support native golang toolchain
  • or use gopackagesdriver for bazel based IDE

Updating BUILD files

  • Add all direct GO dependencies explicitly to the MODULE.bazel.
  • Update BUILD files by running make gazelle (or bazel run //:gazelle)
  • If an external dependency is added, run bazel mod tidy to add the dependency to the repo

Generating Protobuf Files

Install protoc locally: https://github.com/protocolbuffers/protobuf?tab=readme-ov-file#protobuf-compiler-installation

Install required protoc plugins:

go install github.com/gogo/protobuf/protoc-gen-gogoslick@latest
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
go install go.uber.org/yarpc/encoding/protobuf/protoc-gen-yarpc-go@latest

Generate protobuf files (generates gogoslick, grpc, and yarpc):

make proto

# To regenerate from scratch
make clean-proto && make proto

This generates:

  • tangopb/tango.pb.go - Protocol buffer messages (gogoslick)
  • tangopb/tango_grpc.pb.go - gRPC service definitions
  • tangopb/tango.pb.yarpc.go - YARPC service definitions

Note: Generated proto files are checked into version control. The clean-proto command is normally not needed unless you want to regenerate from scratch.

Generating mocks with mockgen

To install mockgen, run go install go.uber.org/mock/mockgen@latest. To regenerate mocks for a package run

mockgen -destination=<source file> <package path> <Interface><Interface>
# Run in the current package
mockgen -destination=<source file> . <Interface><Interface>
# Example
mockgen -package=tangopbmock  -self_package=tangopbmock  -destination=tangopbmock/tangopbmock.go . TangoServiceGetChangedServicesYARPCServer,TangoServiceGetChangedTargetGraphYARPCServer,TangoServiceGetChangedTargetsYARPCServer,TangoServiceGetTargetGraphYARPCServer

Update new module version

Run

git tag <version>
git commit -m "release a new version"
git push origin <version>

Available Make Commands

Run make help to see all available commands:

Build & Test:

  • make build - Build all targets
  • make test - Run all tests
  • make gazelle - Update BUILD.bazel files
  • make clean - Clean generated files and binaries

Protobuf:

  • make proto - Generate protobuf files (gogoslick, grpc, yarpc)
  • make clean-proto - Clean generated proto files

Run Server & Client:

  • make run-server - Run the Tango server (port 8081)
  • make run-client-get-graph - Run get-target-graph via the Tango client
  • make run-client-changed-targets - Run get-changed-targets from Client

Other:

  • make version - Show Bazel version
  • make help - Show this help message

Client Parameters: You can customize the client behavior with various parameters

Example:

bazel run //example/client:client -- -h
bazel run //example/client:client -- -addr 127.0.0.1:8081 -method get-changed-targets -remote https://github.com/uber/tango.git -base-sha 47f5e72 -new-base-sha 47f5e72~

CI/CD

This project uses GitHub Actions for continuous integration. The workflow automatically:

  • Resolve dependencies
  • Builds all targets
  • Runs all tests
  • Reports test failures with detailed logs

The workflow runs on:

  • All pushes to the main branch
  • All pull requests (opened, reopened, or synchronized)

License

This project is licensed under the Apache 2.0 License.

About

Tango provides a way to compute the changed targets for a given base and head and conflict graph. Uber's SubmitQueue relies on it to get changed targets to speculate the requests.

Topics

Resources

License

Code of conduct

Contributing

Stars

4 stars

Watchers

0 watching

Forks

Packages

 
 
 

Contributors