The build steps for Traffic Control components are all pretty much the same, despite that they are written in a variety of different languages and frameworks. This is accomplished by using Docker.
Note
Currently, both listed methods of building Traffic Control components will produce *.rpm
files, meaning that the support of these components is limited to RedHat-based distributions - and none of them are currently tested (or guaranteed to work) outside of Rocky Linux 8 and CentOS 7, specifically.
If any local work on Traffic Monitor, Traffic Router Golang, Grove or Traffic Ops is to be done, it is highly recommended that the Traffic Control repository be downloaded inside the $GOPATH
directory. Specifically, the best location is $GOPATH/src/github.com/apache/trafficcontrol
. Cloning the repository outside of this location will require either linking the actual directory to that point, or moving/copying it there.
The Golang project's GOPATH
wiki page
This is the easiest way to build all the components of Traffic Control; all requirements are automatically loaded into the image used to build each component. The pkg
command can be found at the root of the Traffic Control repository.
./pkg [options] [projects]
-7
Build RPMs targeting CentOS 7.
ATCv6.0.0
Previously, -7
was implicit if not given. As of ATC version 6.0.0, this is no longer the case, and -8
is implicit instead.
-8
Build RPMs targeting Rocky Linux 8 (default).
ATCv6.0.0
Previously, -7
was implicit if not given. As of ATC version 6.0.0, this is no longer the case, and -8
is implicit instead.
-a
Build all projects, including optional ones.
-b
Build builder Docker images before building projects.
-d
Disable compiler optimizations for debugging.
-f FILE
Use FILE
instead of the default Docker-Compose file (./infrastructure/docker/build/docker-compose.yml
).
-h
Print help message and exit.
ATCv6.1.0
-l
List available projects.
Caution
This lists only the projects that are built by default if none are specified, not all projects that can be built. See 6272
.
-L
Don't write logs to files - respects output levels on STDERR/STDOUT as set by -q
/-v
.
-o
Build from the optional list. Same as passing -f
with the option-argument ./infrastructure/docker/build/docker-compose-opt.yml
.
-p
Pull builder Docker images, do not build them (default).
-q
Quiet mode. Suppresses output (default).
-s
Simple output filenames - e.g. traffic_ops.rpm
instead of traffic_ops-6.1.0-11637.ec9ff6a6.el8.x86_64.rpm
.
ATCv6.1.0
-S
Skip building "source RPMs".
ATCv6.1.0
-v
Verbose mode. Lists all build output.
ATCv6.1.0
If present, projects
should be one or more project names. When no specific project or project list is given the default projects will be built. Valid projects:
- ats2
- docs3
- fakeorigin_build4
- grove_build5
- grovetccfg_build6
- source7
- traffic_monitor_build8
- traffic_ops_build9
- cache-config_build10
- traffic_portal_build11
- traffic_router_build12
- traffic_stats_build13
- weasel14
Output {component}-{version}.rpm
files, build logs and source tarballs will be output to the dist/
directory at the root of the Traffic Control repository directory.
If the pkg
script fails, docker-compose
can still be used to build the projects directly. The compose file can be found at infrastructure/docker/build/docker-compose.yml
under the repository's root directory. It can be passed directly to docker-compose
, either from the infrastructure/docker/build/
directory or by explicitly passing a path to the infrastructure/docker/build/docker-compose.yml
file via -f
. It is recommended that between builds docker-compose down -v
is run to prevent caching of old build steps. The service names are the same as the project names described above in Usage, and similar to the pkg
script, the build results, logs and source tarballs may all be found in the dist
directory after completion.
Note
Calling docker-compose
in the way described above will build _all projects, not just the default projects.
A developer may end up building the RPMs several times to test or debug <dev-debugging-ciab>
code changes, so it can be desirable to build the RPMs quickly for this purpose. Natively building the RPMs has the lowest build time of any building method.
OS/Package Manager | Common dependencies | dev-traffic-monitor |
dev-traffic-ops |
dev-traffic-portal |
dev-traffic-router |
dev-traffic-stats |
Grove | Grove TC Config (grovetccfg) | Docs <docs-guide> |
---|---|---|---|---|---|---|---|---|---|
macOS15 (homebrew) |
|
|
|
|
|
|
|
|
|
RockyLinux16, Red Hat, Fedora, CentOS (yum) |
|
|
|
|
|||||
Arch Linux, Manjaro (pacman) |
|
|
|
|
|
|
|
|
|
Windows (cygwin)17 |
|
|
|||||||
Windows (chocolatey)18 |
|
|
|
|
|
|
|
|
After installing the packages using your platform's package manager,
- Install the
global NPM packages <dev-tp-global-npm>
to build Traffic Portal. - Install the Python 3 modules used to
build the documentation <docs-build>
.
In a terminal, navigate to the root directory of the repository. You can run build/clean_build.sh
with no arguments to build all components.
build/clean_build.sh
This is the equivalent of running
build/clean_build.sh tarball traffic_monitor traffic_ops traffic_portal traffic_router traffic_stats grove grove/grovetccfg docs
If any component fails to build, no further component builds will be attempted.
By default, the RPMs will be built targeting Rocky Linux 8. CentOS 7 is also a supported build target. You can choose which RHEL version to build for (8, 7, etc.) by setting the RHEL_VERSION
environment variable:
export RHEL_VERSION=7
Warning
Although there are no known issues with natively-built RPMs, the official, supported method of building the RPMs is by using pkg <pkg>
or docker-compose <build-with-dc>
. Use natively-built RPMs at your own risk.
Each Traffic Control component can be individually built, and the instructions for doing so may be found in their respective component's development documentation.
See instructions for building the documentation <docs-build>
.
This is optional, but recommended. If a
docker-compose
executable is not available thepkg
script will automatically download and run it using a container. This is noticeably slower than running it natively.↩This project is "optional", which means that it cannot be built unless
-o
is given.↩This is a default project, which will be built if
pkg
is run with noprojects
argument↩This project is "optional", which means that it cannot be built unless
-o
is given.↩This is a default project, which will be built if
pkg
is run with noprojects
argument↩This is a default project, which will be built if
pkg
is run with noprojects
argument↩This is a default project, which will be built if
pkg
is run with noprojects
argument↩This is a default project, which will be built if
pkg
is run with noprojects
argument↩This is a default project, which will be built if
pkg
is run with noprojects
argument↩This is a default project, which will be built if
pkg
is run with noprojects
argument↩This is a default project, which will be built if
pkg
is run with noprojects
argument↩This is a default project, which will be built if
pkg
is run with noprojects
argument↩This is a default project, which will be built if
pkg
is run with noprojects
argument↩This is a default project, which will be built if
pkg
is run with noprojects
argument↩If you are on macOS, you additionally need to
dev-tr-mac-jdk
.↩If you are on Rocky Linux, you need to download Go directly instead of using a package manager in order to get the latest Go version. For most users, the desired architecture is AMD64/x86_64.↩
If you are on Windows, you need to install both the Cygwin packages and the Chocolatey packages in order to build the Apache Traffic Control RPMs natively.↩
If you are on Windows, you need to install both the Cygwin packages and the Chocolatey packages in order to build the Apache Traffic Control RPMs natively.↩