-
Notifications
You must be signed in to change notification settings - Fork 543
Rewrite section on executing Docker tests #2235
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 1 commit
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,36 +1,44 @@ | ||
# Testing with Docker | ||
|
||
The Rust tree includes [Docker] image definitions for the platforms used on | ||
GitHub Actions in [`src/ci/docker`]. | ||
The script [`src/ci/docker/run.sh`] is used to build the Docker image, run it, | ||
build Rust within the image, and run the tests. | ||
|
||
You can run these images on your local development machine. This can be | ||
helpful to test environments different from your local system. First you will | ||
The [`src/ci/docker`] directory includes [Docker] image definitions for Linux-based jobs executed on GitHub Actions (non-Linux jobs run outside Docker). You can run these jobs on your local development machine, which can be | ||
helpful to test environments different from your local system. You will | ||
need to install Docker on a Linux, Windows, or macOS system (typically Linux | ||
will be much faster than Windows or macOS because the latter use virtual | ||
machines to emulate a Linux environment). To enter interactive mode which will | ||
start a bash shell in the container, run `src/ci/docker/run.sh --dev <IMAGE>` | ||
where `<IMAGE>` is one of the directory names in `src/ci/docker` (for example | ||
`x86_64-gnu` is a fairly standard Ubuntu environment). | ||
|
||
The docker script will mount your local Rust source tree in read-only mode, | ||
and an `obj` directory in read-write mode. All of the compiler artifacts will | ||
be stored in the `obj` directory. The shell will start out in the `obj` | ||
directory. From there, you can run `../src/ci/run.sh` which will run the build | ||
as defined by the image. | ||
|
||
Alternatively, you can run individual commands to do specific tasks. For | ||
example, you can run `../x test tests/ui` to just run UI tests. | ||
Note that there is some configuration in the [`src/ci/run.sh`] script that you | ||
may need to recreate. Particularly, set `submodules = false` in your | ||
`config.toml` so that it doesn't attempt to modify the read-only directory. | ||
machines to emulate a Linux environment). | ||
|
||
Jobs running in CI are configured through a set of bash scripts, and it is not always trivial to reproduce their behavior locally. If you want to run a CI job locally in the simplest way possible, you can use a provided helper Python script that tries to replicate what happens on CI as closely as possible: | ||
|
||
```bash | ||
python3 src/ci/github-actions/ci.py run-local <job-name> | ||
# For example: | ||
python3 src/ci/github-actions/ci.py run-local dist-x86_64-linux-alt | ||
``` | ||
|
||
Some additional notes about using the Docker images: | ||
If the above script does not work for you, you would like to have more control of the Docker image execution, or you want to understand what exactly happens during Docker job execution, then continue reading below. | ||
|
||
## The `run.sh` script | ||
The [`src/ci/docker/run.sh`] script is used to build a specific Docker image, run it, | ||
build Rust within the image, and either run tests or prepare a set of archives designed for distribution. The script will mount your local Rust source tree in read-only mode, and an `obj` directory in read-write mode. All the compiler artifacts will be stored in the `obj` directory. The shell will start out in the `obj`directory. From there, it will execute `../src/ci/run.sh` which starts the build as defined by the Docker image. | ||
|
||
You can run `src/ci/docker/run.sh <image-name>` directly. A few important notes regarding the `run.sh` script: | ||
- There is some configuration used on CI that you may need to recreate. In particular, set `submodules = false` in your `config.toml` so that it doesn't attempt to modify the read-only directory. | ||
- `<image-name>` corresponds to a single directory located in one of the `src/ci/docker/host-*` directories. Note that image name does not necessarily correspond to a job name, as some jobs execute the same image, but with different environment variables or Docker build arguments (this is a part of the complexity that makes it difficult to run CI jobs locally). | ||
- If you are executing a "dist" job (job beginning with `dist-`), you should set the `DEPLOY=1` environment variable. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If this is mandatory, why aren't we doing it automatically? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Well, we are doing it automatically, on CI with a bash script executed in GitHub actions, and locally through the |
||
- If you are executing an "alternative dist" job (job beginning with `dist-` and ending with `-alt`), you should set the `DEPLOY_ALT=1` environment variable. | ||
- Some of the std tests require IPv6 support. Docker on Linux seems to have it | ||
disabled by default. Run the commands in [`enable-docker-ipv6.sh`] to enable | ||
IPv6 before creating the container. This only needs to be done once. | ||
|
||
### Interactive mode | ||
|
||
Sometimes, it can be useful to build a specific Docker image, and then run custom commands inside it, so that you can experiment with how the given system behaves. You can do that using an interactive mode, which will | ||
start a bash shell in the container, using `src/ci/docker/run.sh --dev <image-name>`. | ||
|
||
When inside the Docker container, you can run individual commands to do specific tasks. For | ||
example, you can run `../x test tests/ui` to just run UI tests. | ||
|
||
Some additional notes about using the interactive mode: | ||
|
||
- The container will be deleted automatically when you exit the shell, however | ||
the build artifacts persist in the `obj` directory. If you are switching | ||
between different Docker images, the artifacts from previous environments | ||
|
@@ -45,15 +53,6 @@ Some additional notes about using the Docker images: | |
containers. With the container name, run `docker exec -it <CONTAINER> | ||
/bin/bash` where `<CONTAINER>` is the container name like `4ba195e95cef`. | ||
|
||
The approach described above is a relatively low-level interface for running the Docker images | ||
directly. If you want to run a full CI Linux job locally with Docker, in a way that is as close to CI as possible, you can use the following command: | ||
|
||
```bash | ||
python3 src/ci/github-actions/ci.py run-local <job-name> | ||
# For example: | ||
python3 src/ci/github-actions/ci.py run-local dist-x86_64-linux-alt | ||
``` | ||
|
||
[Docker]: https://www.docker.com/ | ||
[`src/ci/docker`]: https://github.com/rust-lang/rust/tree/master/src/ci/docker | ||
[`src/ci/docker/run.sh`]: https://github.com/rust-lang/rust/blob/master/src/ci/docker/run.sh | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
If I am not mistaken, if we are running a docker image, it already sets
submodules = false
and our config.toml is not used from the container environment.We should instead say "make sure submodules are fetched with
git ...
" I think.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This always confuses me, I could swear that the Docker build sometimes took data from my root config.toml :) But it seems like it doesn't happen, and yeah, the build expects submodules to be downloaded, because that's what happens on CI.
I reworded the paragraph, let me know what you think.