Меню консольных команд на python

Приветствую Вас, коллеги. Меня зовут Рустам, я работаю в небольшой компании, которая занимается web-разработкой и продвижением сайтов.

Очень часто во время работы над каким-либо проектом возникают задачи решение которых требует ввода в консоль нескольких команд, такие как, например, пересборка фронтенда, запуск/остановка нескольких docker-контейнеров, развертывание окружения на новом девелоперском компе и тому подобные вещи.

Это вообщем то не сложно, но зачастую подобные задачи возникают весьма регулярно, требуют повторения, превращаясь в рутину.

И вот, собственно, однажды возникла идея как сократить время на это вот все, максимально упростив процесс, реализовав небольшую утилиту, позволяющую обернуть наборы часто производимых действий в пункты удобного меню выводимого в консоль.

Реализовать решил на Python т.к. из коробки он установлен на большинстве дистрибутивах линукс, и для использования не потребуется установки дополнительных пакетов.

Получилось нечто весьма удобное доступное для клонирования c гитхаб.

Все настройки (а именно что по какому пункту должно выполняться) хранятся в файле menu.yml.
Файл настроек приведенный в качестве примера в репозитории снабжен всеми необходимыми коментариями, но для того, чтобы все стало еще понятней есть рабочий пример на гитхабе (https://github.com/hrustbb2/env-example).

В качестве примера приведено приложение состоящее из трех docker-контейнеров (php, mysql, nginx) с отдельными конфигами для девелоп и продакшен окружений и двумя отдельными сценариями деплоя в этих окружениях.

Итак, клонируем, запускаем ./env и видим меню из трех пунктов:

0. Exit
1. Develop
2. Production
Chose action: _

Развернем наше приложение в девелоп-режиме, для этого выбираем пункт 1, проваливаемся в подменю:

0. Exit
1. Build
2. Deploy and Up
3. Up
4. Stop
5. Remove
Chose action: _

Здесь вначале создадим наши контейнеры выбрав 1, после чего необходимо придумать и ввести имя приложения. Здесь хочу обратить Ваше внимание на то, что параметры необходимые для выполнения тех или иных команд требуются ввести лишь один раз, далее они сохраняются в env.ini файл и при повторном запуске вводить их не требуется. Затем, немного подождав пока завершится создание контейнеров, запустим скрипт для деплоя самого приложения, выбрав 2.

В данном примере скрипт клонирует в ./app стартовое приложение Laravel, установит необходимые composer-пакеты, накатит миграции и создаст файл конфигурации .env. Делается это только один раз в самом начале, в последствии окружение запускается выбором пункта 3. Пункт 5 служит для удаления созданных контейнеров после того как они стали больше не нужны, например когда работа над проектом окончена.

Вот пожалуй все, теперь открываем в браузере localhost и продолжаем работу.

Иногда на продакшене возникает необходимость запускать некоторые команды автоматически по крону, например обновление SSL сертификатов, backup и т.п. В этом случае запускаем, например ./env -e 1-2-3, где 1-2-3 путь до нужной команды в меню.

Мне и моим коллегам принес немало пользы, немного облегчив им труд, надеюсь инструмент будет полезен и вам.

Всем удачи.
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 18

    0

    shell команды прописаны в конфиге, который парсит и исполняет скрипт на Python? Не хватает electron'a ещё :)

      +2
      По идее, для всего этого можно использовать make.
        0

        И как запрашивать параметры у пользователя в мейк?

            0

            Я знаю, но это не то же самое.

              0
              Имеется ли у make возможность запросить у пользователя параметр, затем запомнить его для использования при запуске уже других команд в последствии? Как, например, параметр 'appName' при запуске '1. Build', затем '2. Deploy and Up', а затем и '4. Stop' в примере приведенном в статье.
                –1

                Make и переменные окружения, например. Ваш скрипт — самое неуниверсальное решение. Изучите хорошо shell, make, это обязательно окупится сторицей.

                  0

                  как будто в питон нету dotenv

                    0

                    Я просто не хотел вдаваться в критику. Понятно, что человек только начал изучать питон и ему хочется все написать на нем. Но скрипт написан откровенно плохо, в совершенно не питонячем стиле (например, кто использует названия переменных и методов, начинающиеся с __? ни в одном из python проектов вы не увидите такого, за очень редким исключением).


                    Да собственно, вопрос не в этом, а в том, что человек изобрел велосипед, сделанный из пластиковых соломинок и изоленты, тогда как можно было немного почитать и узнать, что уже существует 100500 настоящих велосипедов — дорожных, горных, электрических, скутеров, мотоциклов, каждый из которых справится с задачей лучше, а главное — известен и понятен каждому.


                    Если хочется написать статью на Хабр, то можно было бы хотя бы попытаться произвести сравнение своего велосипеда с существующими. Правда, тогда и статью писать было бы не о чем, потому что сразу же стало бы очевидно, что сравнение не в пользу автора.

                      +1

                      Критика скрипта это один разговор. Но мейк это другая альтернатива со своими минусами. Использовать питон вместо шелла и sed/grep/awk вполне здравый подход имхо.

                        0

                        Дело не в этом, а в том, что задача сборки проектов — типичная задача, с которой сталкиваются почти 100% программистов. Поэтому она неоднократно решена и продолжает решаться, можно найти решение на любой вкус. Make был одним из первых, и до сих пор остается весьма мощным и удобным средством. Но кроме него существует еще газиллион других, в т.ч., написанных на Python. Например, на Python был написан SCons.

                          0

                          А у автора тут нету никакой сборки. make в первую очередь ориентирован на рецепты получения файлов из других файлов. Система же сборки для конкретных языков у каждого своя. Тут обсуждается как сделать шорткаты на отдельные команды вместе с пошаговым выбором их из списка.

                            0

                            В make необязательно генерировать файлы из файлов. На самом деле, существует масса проектов, которые используют Makefile, например, для вызова npm.


                            Для обычного человека намного проще использовать стандартный инструмент, известный практически всем. И вызывать шорткаты простым вызовом make build, make autotests, etc.


                            1. Это просто.
                            2. Это понятно любому разработчику из любой точки мира (make повсеместно распространен).
                            3. Эти вызовы можно объединять в цепочки: make build && make tests && make deploy-staging.
                            4. Эти вызовы можно легко привязать к почти любой IDE.
                              0
                              1. Но зачем если в npm уже есть команды package.json.
                              2. Как узнать список команд в make? как узнать их аргументы?
                              3. это фича баша а не мейк
                              4. В любой IDE можно сделать любой список команд не обязательно мейк
          0
            0
            Как вариант, очень любопытно, но не всегда необходимо.
            0
            А почему бы для этой цели не использовать обычные Makefile? Вот навскидку пара релевантных примеров:
            www.inanzzz.com/index.php/post/wqfy/a-makefile-example-with-docker-compose-commands
            blog.bottlepy.org/2012/07/16/virtualenv-and-makefiles.html
              0
              Большинство задач может иметь минимум два решения :)

            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

            Самое читаемое