Если настройка локальной среды разработки занимает больше 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 в репозиторий, рассмотрим детали, и разберём его конфиг. Вопросы, комментарии, предложения приветствуются.

Репозиторий runohttps://github.com/frwl404/runo

Комментарии (2)


  1. abyrvalg
    10.10.2025 13:30

    В чём преимущество перед стандартным Makefile?


  1. petrov_engineer
    10.10.2025 13:30

    Чем-то напоминает
    Чем-то напоминает