Тестируем Rust-проекты с помощью Docker и Makefile

Когда проект становится частью CI/CD-пайплайна или работает в гетерогенной среде, удобно использовать контейнеризированную среду для тестирования, чтобы избежать различий в версиях Rust и зависимостях. Ниже — пример того, как это можно сделать с помощью Docker и Makefile.


📁 Структура проекта

project-root/
├── Makefile          # Makefile на верхнем уровне
└── ehatrom/          # Исходный код Rust-проекта
    ├── Cargo.toml
    └── src/
        └── lib.rs

🐋 Dockerfile

В папке ehatrom/ создаём Dockerfile для окружения с nightly Rust и необходимыми компонентами:

FROM rustlang/rust:nightly

WORKDIR /ehatrom

RUN rustup component add rustfmt clippy

Создаём образ:

docker build -t ehatrom-ci ./ehatrom

🛠️ Makefile

На уровень выше (в project-root/) создаём Makefile, чтобы упростить сборку и тестирование:

build:
	docker build -t ehatrom-ci ./ehatrom

ci:
	docker run --rm -it \
		-v "$(PWD)/ehatrom":/ehatrom \
		-w /ehatrom \
		ehatrom-ci \
		bash -c "cargo +nightly clippy --workspace --all-targets -- -D warnings && \
		         cargo build --workspace --all-targets --verbose && \
		         cargo test --workspace --all-targets --verbose"

🚀 Использование

Теперь мы можем:

  • Построить Docker-образ:

    make build
    
  • Проверить и протестировать проект:

    make ci
    

✅ Что делает make ci

Контейнер запускает следующую цепочку команд:

cargo +nightly clippy --workspace --all-targets -- -D warnings
cargo build --workspace --all-targets --verbose
cargo test --workspace --all-targets --verbose

Это гарантирует:

  • соответствие стилю кода (через clippy);
  • успешную сборку всех целей;
  • прохождение всех тестов.

🧪 Вывод

Такой подход полезен, если:

  • команда работает на разных ОС;
  • вы хотите зафиксировать конкретную версию toolchain;
  • нужно легко запускать CI-джобы локально.

Также он хорошо масштабируется в более сложные пайплайны и может быть использован в GitHub Actions, GitLab CI или Drone CI.