1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201
|
# Docker Integration #
Due to the large number of languages supported by Apache Thrift,
docker containers are used to build and test the project on a
variety of platforms to provide maximum test coverage.
## Appveyor Integration ##
At this time the Appveyor scripts do not use docker containers.
Once Microsoft supports Visual Studio Build Tools running inside
nano containers (instead of Core, which is huge) then we will
consider using containers for the Windows builds as well.
## Travis CI Integration ##
The Travis CI scripts use the following environment variables and
logic to determine their behavior:
### Environment Variables ###
| Variable | Default | Usage |
| -------- | ----- | ------- |
| `DISTRO` | `ubuntu-focal` | Set by various build jobs in `.travis.yml` to run builds in different containers. Not intended to be set externally.|
| `DOCKER_REPO` | `thrift/thrift-build` | The name of the Docker Hub repository to obtain and store docker images. |
| `DOCKER_USER` | `<none>` | The Docker Hub account name containing the repository. |
| `DOCKER_PASS` | `<none>` | The Docker Hub account password to use when pushing new tags. |
For example, the default docker image that is used in builds if no overrides are specified would be: `thrift/thrift-build:ubuntu-focal`
### Forks ###
If you have forked the Apache Thrift repository and you would like
to use your own Docker Hub account to store thrift build images,
you can use the Travis CI web interface to set the `DOCKER_USER`,
`DOCKER_PASS`, and `DOCKER_REPO` variables in a secure manner.
Your fork builds will then pull, push, and tag the docker images
in your account.
### Logic ###
The Travis CI build runs in two phases - first the docker images are rebuilt
for each of the supported containers if they do not match the Dockerfile that
was used to build the most recent tag. If a `DOCKER_PASS` environment
variable is specified, the docker stage builds will attempt to log into
Docker Hub and push the resulting tags.
## Supported Containers ##
The Travis CI (continuous integration) builds use the Ubuntu Jammy
(22.04 LTS) and Focal (20.04 LTS) images to maximize language level
coverage.
### Ubuntu ###
* focal (stable, current)
* jammy (next stable, WIP)
## Unsupported Containers ##
These containers may be in various states, and may not build everything.
They can be found in the `old/` subdirectory.
### CentOS ###
* 7.3
* make check in lib/py may hang in test_sslsocket - root cause unknown
### Debian ###
* jessie
* stretch
* make check in lib/cpp fails due to https://svn.boost.org/trac10/ticket/12507
## Building like Travis CI does, locally ##
We recommend you build locally the same way Travis CI does, so that when you
submit your pull request you will run into fewer surprises. To make it a
little easier, put the following into your `~/.bash_aliases` file:
# Kill all running containers.
alias dockerkillall='docker kill $(docker ps -q)'
# Delete all stopped containers.
alias dockercleanc='printf "\n>>> Deleting stopped containers\n\n" && docker rm $(docker ps -a -q)'
# Delete all untagged images.
alias dockercleani='printf "\n>>> Deleting untagged images\n\n" && docker rmi $(docker images -q -f dangling=true)'
# Delete all stopped containers and untagged images.
alias dockerclean='dockercleanc || true && dockercleani'
# Build a thrift docker image (run from top level of git repo): argument #1 is image type (ubuntu, centos, etc).
function dockerbuild
{
docker build -t $1 build/docker/$1
}
# Run a thrift docker image: argument #1 is image type (ubuntu, centos, etc).
function dockerrun
{
docker run -v $(pwd):/thrift/src -it $1 /bin/bash
}
Then, to pull down the current image being used to build (the same way
Travis CI does it) - if it is out of date in any way it will build a
new one for you:
thrift$ DOCKER_REPO=thrift/thrift-build DISTRO=ubuntu-focal build/docker/refresh.sh
To run all unit tests (just like Travis CI does):
thrift$ dockerrun thrift/thrift-build:ubuntu-focal
root@8caf56b0ce7b:/thrift/src# build/docker/scripts/autotools.sh
To run the cross tests (just like Travis CI does):
thrift$ dockerrun thrift/thrift-build:ubuntu-focal
root@8caf56b0ce7b:/thrift/src# build/docker/scripts/cross-test.sh
When you are done, you want to clean up occasionally so that docker isn't using lots of extra disk space:
thrift$ dockerclean
You need to run the docker commands from the root of the local clone of the
thrift git repository for them to work.
When you are done in the root docker shell you can `exit` to go back to
your user host shell. Once the unit tests and cross test passes locally,
submit the changes, and if desired squash the pull request to one commit
to make it easier to merge (the committers can squash at commit time now
that GitHub is the master repository). Now you are building like Travis CI does!
## Raw Commands for Building with Docker ##
If you do not want to use the same scripts Travis CI does, you can do it manually:
Build the image:
Linux:
thrift$ docker build --build-arg uid=$(id -u) --build-arg gid=$(id -g) -t thrift build/docker/ubuntu-jammy
Windows/Mac:
thrift$ docker build -t thrift build/docker/ubuntu-jammy
Open a command prompt in the image:
thrift$ docker run -v $(pwd):/thrift/src -it thrift /bin/bash
## Core Tool Versions per Dockerfile ##
Last updated: March 5, 2024
| Tool | ubuntu-focal | ubuntu-jammy | Notes |
| :-------- | :------------ | :------------ | :---- |
| ant | 1.10.7 | 1.10.12 | |
| autoconf | 2.69 | 2.71 | |
| automake | 1.16.1 | 1.16.5 | |
| bison | 3.5.1 | 3.8.2 | |
| boost | 1.71.0 | 1.74.0 | |
| cmake | 3.16.3 | 3.22.1 | |
| cppcheck | 1.90 | 2.7 | |
| flex | 2.6.4 | 2.6.4 | |
| libc6 | 2.31 | 2.35 | glibc |
| libevent | 2.0.16 | 2.0.16 | |
| libstdc++ | 10.5.0 | 10.5.0 | |
| make | 4.2.1 | 4.3 | |
| openssl | 1.1.1f | 3.0.2 | |
| qt5 | 5.12.8 | 5.15.3 | |
## Compiler/Language Versions per Dockerfile ##
| Language | ubuntu-focal | ubuntu-jammy | Notes |
| :-------- | :------------ | :------------ | :---- |
| as of | Mar 06, 2018 | Jul 1, 2019 | |
| as3 | 4.6.0 | 4.6.0 | |
| C++ gcc | 9.4.0 | 11.4.0 | |
| C++ clang | 13.0.0 | 13.0.0 | |
| c\_glib | 3.2.12 | 3.2.12 | |
| cl (sbcl) | | 1.5.3 | |
| d | 2.087.0 | 2.087.0 | |
| dart | 2.7.2-1 | 2.7.2-1 | |
| delphi | | | Not in CI |
| erlang | OTP-25.3.2.9 | OTP-25.3.2.9 | |
| go | 1.21.7 | 1.21.7 | |
| haxe | 4.2.1 | 4.2.1 | |
| java | 17 | 17 | |
| js | Node.js 16.20.2, npm 8.19.4 | Node.js 16.20.2, npm 8.19.4 | |
| lua | 5.2.4 | 5.2.4 | Lua 5.3: see THRIFT-4386 |
| netstd | 9.0 | 9.0 | |
| nodejs | 16.20.2 | 16.20.2 | |
| ocaml | 4.08.1 | 4.13.1 | |
| perl | 5.30.0 | 5.34.0 | |
| php | 7.4.3 | 8.1.2 | |
| python2 | 2.7.18 | | |
| python3 | 3.8.10 | 3.10.12 | |
| ruby | 2.7.0p0 | 3.0.2p107 | |
| rust | 1.83.0 | 1.83.0 | |
| smalltalk | | | Not in CI |
| swift | 5.7 | 5.7 | |
|