Классный способ запуска dev env

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

Он подтягивает все последние изменения, обновляет установленные плагины и выполняет все миграции, а также устанавливает необходимые gems и пакеты pnpm.

Минус скрипта в том, что он также подтягивает плагины, встроенные в ядро, что технически ничего не даст, так как они обновятся при первом git pull. Ну ладно.

Примечание: chatgpt.com помог мне написать логику для оператора if (мои первые эксперименты не увенчались успехом).
~/rundiscourse.sh:

#!/bin/bash

cd ~/discourse
git pull
cd plugins
PLUGIN_DIR=~/discourse/plugins

for folder in "$PLUGIN_DIR"/*; do
  if [ -d "$folder/.git" ]; then
    output=$(git -C "$folder" pull)
    if ! echo "$output" | grep -q "Already up to date."; then
      echo "[$(basename "$folder")] $output"
    fi
  fi
done
cd ~/discourse
bundle install
pnpm install
bin/rails db:migrate
DISCOURSE_HOSTNAME=localhost UNICORN_LISTENER=localhost:3000 bin/ember-cli -u

Затем выполните:

chmod +x rundiscourse.sh

Далее откройте файл ~/.bashrc (используя nano или любой другой редактор) и добавьте этот блок, если его там ещё нет (он находится ближе к концу файла):

# Определения алиасов.
# Вы можете поместить все свои дополнения в отдельный файл, например
# ~/.bash_aliases, вместо того чтобы добавлять их сюда напрямую.
# См. /usr/share/doc/bash-doc/examples в пакете bash-doc.

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

Затем добавьте следующее в файл ~/.bash_aliases:

alias discourse="~/rundiscourse.sh"

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


Надеюсь, это помогло! Также дайте знать, если я делаю что-то не так или если есть возможность улучшить скрипт. Спасибо!

1 лайк

Отлично. Несколько предложений.

Шебанг должен быть #!/usr/bin/env sh, так как это наиболее переносимый вариант. Скрипт не использует специфичные для bash конструкции, поэтому он должен работать в любой оболочке, совместимой с Bourne shell, а не только в bash.

После шебанга добавьте set -e. Это заставит скрипт завершиться, если любая из команд завершится ошибкой. В противном случае он будет продолжать выполнение команд и может завершиться ошибкой позже, например, из-за сбоя bundle install, при этом сообщение об ошибке уже не будет отображаться на экране пользователя.

Теперь касательно git pull для плагинов: это немного более проблематично, так как ошибки, записанные в STDERR, и неудачное выполнение git не будут обработаны должным образом. Поэтому я перенаправил STDERR в STDOUT и отслеживал код выхода.

Нет необходимости в множестве команд cd или в установке переменной PLUGIN_DIR.

#!/usr/bin/env sh
set -e

cd ~/discourse
git pull

for folder in plugins/*; do
  if [ -d "$folder/.git" ]; then
    exitcode=0
    output=$(git -C "$folder" pull 2>&1) || exitcode=$?
    if echo "$output" | grep -q -v "Already up to date."; then
      echo "[$(basename "$folder")]"
      echo "$output"
      [ "$exitcode" -ne 0 ] && exit "$exitcode"
    fi
  fi
done

bundle install
pnpm install
bin/rails db:migrate
DISCOURSE_HOSTNAME=localhost UNICORN_LISTENER=localhost:3000 bin/ember-cli -u

У меня уже был похожий скрипт, за исключением части с git pull, так как я не хочу, чтобы это происходило каждый раз.

1 лайк

Спасибо за совет! Попробую.