Если настройка локальной среды разработки занимает больше 5 минут, или требует каких-то "врождённых" знаний, это налог на каждого разработчика. Я хочу просто клонировать репозиторий, запустить пару команд и получить работающую среду разработки...
Mark Allen
Думаю, что многие из вас за свою карьеру успели повидать много разных репозиториев. Среди них наверняка были хорошие и не очень; большие и маленькие; с Python, Go, Java, C++ и много чем ещё. Все они были очень разными, но первые вопросы скорее всего были одинаковыми:
- что тут вообще можно/нужно делать (запустить тесты, линтеры, билд, песочницу, что-то ещё), 
- как это делать. 
В хороших репозиториях можно рассчитывать на README и Docker. В плохих... ну вы сами знаете - скорее всего README нет, если есть, то не актуальный и написано там что-то вроде:
установите вот это и это, настройте вот то, спросите у Васи куда добавить вот это, удалите вот это, присядьте 6 раз, подождите неделю и может быть что-то запустится".
Но даже если вам повезло иметь дело только с хорошими проектами, переключаться между ними всё-равно может быть болезненно - README организованы по-разному, искать нужные команды нужно в разных местах, сами команды отличаются друг от друга, опций в них может быть миллион, алиасы на всё не посоздаёшь, запомнить столько всего разного тоже сложно.

Аналогия, которая всё расставит по своим местам
Давайте на минутку отвлечёмся на аналогию с реальной жизнью, например с автомобилем. От всех автомобилей вы ожидаете некого базового набора функций:
- попасть в автомобиль, 
- добраться из точки А в точку Б, 
- выйти из автомобиля, 
Кажется просто? А теперь представим, что вам нужно часто пересаживаться с одного автомобиля на другой. Внезапно даже эти простые действия могут превратиться в проблему:
Попасть в автомобиль? Ну...
- в одних автомобилях доступ бесключевой, в других нет 
- кнопки на ключах расположены по-разному 
- видов автомобильных ручек можно насчитать минимум десяток. 
- двери бывают сдвижные, распашные, бывают с открытием вверх, с электроприводом, или без. 

Добраться из точки А в точку Б?
Проблем становится больше. Всё настолько сложно, что нужно этому несколько месяцев учиться и сдавать экзамены. Прежде чем куда-то поехать, нужно завести автомобиль:
- где-то нужно просто нажать кнопку старта, 
- где-то требуется повернуть ключ (где-то нужно сначала нажать сцепление, где-то нет), 
- где-то нужно ещё подтвердить, что ты не пьян, 
- а бывали ещё и варианты с кик-стартером. 
А когда мы всё-же трогаемся, начинаются настоящие проблемы:
- в одних автомобилях, чтобы ехать, вам нужно просто жать на газ 
- в других надо научиться пользоваться педалью сцепления и рычагом МКПП; 
- где-то рычаг МКПП слева, а где-то справа, 
- где-то, чтобы включить заднюю скорость надо просто поставить рычаг в нужное положение, где-то предварительно надавить на него, где-то потянуть на себя какое-то колечко. 
- с АКПП не легче - они могут быть под рулём, могут быть в виде шайбы, кнопок, или обычного рычага 
Не так-то просто, согласитесь? Особенно если вы неопытный водитель, или впервые садитесь на автомобиль новой конструкции.
А теперь представьте альтернативу: производитель машины встроил в неё ассистента, который понимает обычный язык. Вы просто говорите:
- поехали домой, 
- поехали в магазин, 
- поехали по координатам <требуется добавить адрес>, 
а всю остальную работу ассистент берет на себя: сам заводит машину, трогается, переключает передачи, включает поворотники и т.д. Так как интерфейс взаимодейставия с этим ассистентом - обычный человеческий язык (а на самом деле небольшая часть языка), то им могут пользоваться большинство людей старше 3-летнего возраста. Больше не нужно ждать 16 лет, проходить медкомиссию, учиться водить, сдавать экзамены, достаточно просто уметь произносить пару простых фраз на своём языке и ты можешь перемещаться на любом автомобиле, оборудованном таким ассистентом.
Вернемся к репозиториям - встречайте runo
runo это именно такой ассистент, но не для автомобилей, а для репозиториев. С ним вам больше не нужно будет искать в документации (если она есть :)) нужные команды, что-то настраивать, чтобы просто запустить тесты, или песочницу. Вам достаточно обратиться к ассистенту, он уже знает всё, что нужно об этом репозитории:
> ./runo
Following commands are available:
  * sandbox - runs server (API + UI) and DB locally
  * test - runs unit tests (pytest)
  * build - builds the project
  * pre-commit - quick checks/fixes of code formatting (ruff/mypy)
  * update-deps - updates dependencies
  * shell - debug container by running shell in interactive modeКажется, выглядит неплохо? Вы сразу знаете что тут положено делать и кажется теперь интуитивно понятно КАК нужно это делать - просто попросите ассистента:
> ./runo testА заботу о деталях ассистент берет на себя. Он знает, что тесты нужно запускать в Docker контейнере, знает в каком, с какими параметрами, ну и в конце концов он знает, что это pytest:
> ./runo test
[+] Building 6.4s (13/13) FINISHED
 => [internal] load build definition from Dockerfile
...
======================================== test session starts ============================================
platform linux -- Python 3.13.7, pytest-8.3.5, pluggy-1.6.0
...
Required test coverage of 90% reached. Total coverage: 98.94%
======================================== 564 passed in 6.14s ============================================
В другом проекте/репозитории для запуска тестов может быть нужен совсем другой контейнер; там может быть не, Python, a Go, но об этих деталях вам не придётся беспокоиться. Если разработчики того репозитория тоже интегрировали runo, вы просто снова запускаете ./runo test:
> ./runo test
[+] Building 3.1s (7/7) FINISHED                                                                                                   docker:default
 => [internal] load build definition from Dockerfile                                                                                         0.0s
[+] Creating 2/2
 ✔ Network goapp-run-tests-674b3b2e-80bd-42be-8664-239414eda120_default       Created                                                    0.1s 
 ✔ Container goapp-run-tests-674b3b2e-80bd-42be-8664-239414eda120-postgres-1  Created                                                    0.5s 
[+] Running 1/1
 ✔ Container goapp-run-tests-674b3b2e-80bd-42be-8664-239414eda120-postgres-1  Started                                                    0.2s 
Waiting for postgres:5432 to become available...................
go test -p 1 -race -cover -coverprofile=coverage.out ./...
?       git.github.com/frwl/goapp          [no test files]
ok      git.github.com/frwl/goapp/server   4.385s  coverage: 69.7% of statements
ok      git.github.com/frwl/goapp/client   1.023s  coverage: 83.1% of statements
...
go tool cover -html=coverage.out -o coverage.html
[+] Running 2/2
 ✔ Container goapp-run-tests-674b3b2e-80bd-42be-8664-239414eda120-postgres-1  Removed                                                    0.9s 
 ✔ Network goapp-run-tests-674b3b2e-80bd-42be-8664-239414eda120_default       Removed                                                    0.2s  
Требуется мульти-платформенность? Не вопрос. Спросите у runo какие варианты разработчики данного репозитория решили поддерживать:
> ./runo --containers
Following containers are available:
  * Debian
  * Centos
  * RockyLinux
И вы можете выполнить нужную вам задачу для интересующей вас платформы:
> ./runo -c Debian build
Buld for Debian is running
...
done
А можете сразу для всех платформ:
> ./runo -c "*" test
Running test for Debian
PASSED
Running test for Centos
PASSED
Running test for RockyLinux
PASSED
И всё это без дополнительных зависимостей и установки чего бы то ни было. runo это 1 файл, который встраивается непосредственно в репозиторий и работает сразу из коробки для любых новых пользователей. Для работы ему требуется только наличие Python, начиная с версии 3.6 (кажется, что сегодня почти 100% систем отвечают этому критерию). Благодаря runo настройка локального окружения может стать тривиальной задачей (или вообще не потребоваться), вам не придется что-то устанавливать или конфигурировать. Вы сможете просто взять абсолютно новый ноутбук, клонировать на него репозиторий и он будет готов к работе. Как?
Вторая часть на подходе...
Во второй части мы интегрируем runo в репозиторий, рассмотрим детали, и разберём его конфиг. Вопросы, комментарии, предложения приветствуются.
Репозиторий runo: https://github.com/frwl404/runo
Комментарии (10)
 - petrov_engineer10.10.2025 13:30 - Чем-то напоминает  - frwl404 Автор10.10.2025 13:30- Совершенно верно, но кажется именно так выглядит эволюция :) время идёт, сценарии использования меняются, приходится адаптироваться. Вечны только Linux и Git :) 
 
 - segoon10.10.2025 13:30- runo это именно такой ассистент, но не для автомобилей, а для репозиториев. С ним вам больше не нужно будет искать в документации (если она есть :)) нужные команды, что-то настраивать, чтобы просто запустить тесты, или песочницу. Вам достаточно обратиться к ассистенту, он уже знает всё, что нужно об этом репозитории: - А в документации: 
 At this moment most part of them are just a mocks, which prints something to console, because at this moment- ./runodoesn't know what- test/- build/- ...means for your project.- Т.е. проблема "нужно что-то искать и настраивать" не решена. 
 Обман, везде обман... - frwl404 Автор10.10.2025 13:30- Всё верно. В аналогии с автомобилем - на заводе ассистент всё-таки должны 1 раз настроить, чтобы он знал что конкретно нужно делать когда его просят "поехали домой". Так же работает и runo - достаточно один раз написать в конфиге что конкретно для данного репозитория означает test/build/... и дальше можно забыть об этом, ассистент будет брать эту информацию из конфига 
 
 
           
 
abyrvalg
В чём преимущество перед стандартным Makefile?
frwl404 Автор
Я бы говорил не о преимуществах, а скорее о фундаментальных различиях между
Makefileиruno, потому что они решают разные задачи.Makefileбыл разработан задолго до появленияDockerи главной его задачей было оптимизировать процесс компиляции больших проектов.runoне претендует на это.Своей основной задачей
runoставит упрощение работы с репозиториями и запуск любого действия одной простой командой, без предварительной установки, или настройки чего бы то ни было и для этогоrunoполагается на docker/compose.Например, если у вас есть проект с
Makefile, который должен билдится например на Debiad, вы не можете просто взять и запустить `make build" на вашей системе, если она не содержит всего, что нужно для этого таргета.Вам вероятно придётся оборачивать всё в докер и выполнять что-то вроде "docker run ... make build"
А runo можно настроить так, чтобы можно было запустить просто "./runo build". Под капотом там вполне может быть и make (мы используем такую связку в тех проектах, котрые полагаются на make для компиляции). В Rust репозиториях вместо make скорее всего будет
cargo, в Python -uv, или что-то похожее. Но с помощьюrunoможно будет в любом из этих репозиторив запустить просто "./runo build"Т.е.
runoэто более высокоуровневая абстракция, надстройка надMakefile,cargo,uv(для сценария с билдами), которая призвана упростить жизнь в усложняющемся мире, где появляется всё больше языков и технологий и где одному и тому же человеку приходиться взаимодействовать с несколькими разными проектами, которые используют разные стеки технологий.Надеюсь, что вторая часть статьи сможет более детально осветить эти моменты.
darkxanter
В makefile можно что угодно прописать, в том числе docker build/run и т.д.
segoon
Ага. А если пугает сложность и древность синтаксиса/логика мейкфайла, то можно использовать упрощенную альтернативу https://github.com/casey/just
Что нового реализует runo кроме своего формата toml-конфига, я честно не понял.
frwl404 Автор
Сравнение с
justгораздо более оправдано. Как видите, они оба существуют, just-ом пользуется довольно много людей, хотя есть мейкфайл.runoэто шаг в ту же сторону, но ещё чуть дальше - более простой и популярный формат конфига, который (я надеюсь) позволит быстрее настроить всё что нужно и забыть об этой части; отсутствие необходимости установки. Возможно, мне стоит на примере какого-то одного проекта попытаться показать как это будет выглядеть дляmakefile,justиruno, чтобы сравнение было более наглядным.frwl404 Автор
Возможно, мне стоит сделать на примере какого-то одного проекта сравнение того как будет выглядеть конфиг для makefile и для runo для разных типов проектов (Rust/Python/Go/...)