Одна попытка поддерживать Dev-окружение в актуальном состоянии

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

У меня есть скрипт, который я использую для запуска Discourse с набором переменных окружения (ENV), и который также выполняет множество других задач. Сегодня он не смог получить правильную версию nodejs, и я потратил ещё больше времени на его обновление. Я даже делал такие вещи, как использование grep для фильтрации шумного вывода от asdf и подобных утилит. Вот часть скрипта, отвечающая за обновление Discourse.

Вот что он делает:

  • Получает и/или обновляет репозитории all-the-plugins и all-the-themes. Они очень полезны для поиска примеров реализации различных задач. Если они были загружены в последние 100 минут, этот шаг пропускается.
  • Выполняет docker pull для получения последнего базового релиза (именно пропуск этого критически важного шага стал причиной того, что я сегодня потратил столько времени — somehow я думал, что достаточно сделать git pull в директории discourse_docker :person_shrugging:).
  • Запускает базовый образ через docker run, чтобы получить версии Ruby, ImageMagick и Node, а затем использует asdf для установки и глобального применения этих версий. (Скрипт предполагает, что у вас уже установлен asdf — я решаю этот вопрос в своём скрипте newmachine).
  • В директории Discourse переключается на ветку main, выполняет git pull, запускает pnpm update и dedupe.
  • Выполняет миграцию основной и тестовой баз данных.

Я тестировал этот скрипт только на Linux (Pop!OS, который в основном основан на Ubuntu).

SRC=~/src/discourse-repos
DISCOURSE_SRC=/home/pfaffman/src/discourse-repos/discourse
ALL_THE_PLUGINS=~/src/discourse-repos/all-the-plugins
ALL_THE_THEMES=~/src/discourse-repos/all-the-themes
ARG=$1
COMMAND=""

if [[ "$ARG" == "update" ]] || [[ "$ARG" == "upgrade" ]]
then
  # ПРИМЕЧАНИЕ: если bundler сломан, попробуйте выполнить `gem install bundler -v 2.5.3`

  if ! [[ -d $ALL_THE_PLUGINS ]]; then
    echo "ОТСУТСТВУЮТ ПЛАГИНЫ"
    cd $SRC
    git clone https://github.com/discourse/all-the-plugins
    cd $ALL_THE_PLUGINS
    ./reset-all-repos
  fi
  cd $ALL_THE_PLUGINS
  if [ -z "$(find official -mmin -100)" ]; then
    echo -e "\nОбновление плагинов\n "
    ./reset-all-repos
  fi

  if ! [[ -d $ALL_THE_THEMES ]]; then
    echo "ОТСУТСТВУЮТ ТЕМЫ!!!"
    sleep 5
    cd $SRC
    git clone https://github.com/discourse/all-the-themes
    cd $ALL_THE_THEMES
    ./reset-all-repos
  fi

  cd $ALL_THE_THEMES
  if [ -z "$(find official -mmin -100)" ]; then
    echo -e "\nОбновление тем. . . \n"
    ./reset-all-repos
  fi

  asdf plugin add ruby |grep -v "already"
  asdf plugin add imagemagick |grep -v "already"
  asdf plugin update --all > /dev/null

  docker pull discourse/base:release
  RUBY_VERSION=$(docker run discourse/base:release bash -c 'ruby --version'|cut -d' ' -f2)
  echo "Получена RUBY_VERSION $RUBY_VERSION"
  asdf install ruby $RUBY_VERSION|grep -v "already"
  asdf global ruby $RUBY_VERSION|grep -v "already"
  IMAGE_MAGICK_VERSION=$(docker run discourse/base:release bash -c 'convert --version'|head -1|cut -d' ' -f3)
  echo "Получена IMAGE_MAGICK_VERSION: $IMAGE_MAGICK_VERSION"
  asdf install imagemagick $IMAGE_MAGICK_VERSION|grep -v "already"
  asdf global imagemagick $IMAGE_MAGICK_VERSION|grep -v "already"

  # 2025-01-13 получение версии node из базового контейнера!
  NODE_VERSION=$(docker run discourse/base:release bash -c 'node --version'|cut -d'v' -f2)
  echo "Получена версия NODEJS: $NODE_VERSION"
  asdf install nodejs $NODE_VERSION|grep -v "already"
  asdf global nodejs $NODE_VERSION|grep -v "already"
  npm install -g pnpm

  # конец обновления версий
  cd $DISCOURSE_SRC
  git checkout main
  git pull
  bundle install
  echo -e "\n----------> Запуск pnpm update. . .\n"
  pnpm update
  echo -e "\n----------> Запуск pnpm dedupe. . .\n"
  pnpm dedupe
  echo -e "\n----------> Миграция баз данных. . .\n"
  LOAD_PLUGINS=1 ./bin/rake db:migrate
  LOAD_PLUGINS=1 RAILS_ENV=test ./bin/rake db:migrate
  exit
fi

Это для локальных сред разработки с Docker, верно?

Нет. Без Docker. Если вы используете Docker, то всё это обрабатывается внутри контейнера Docker.

Джей, я бы хотел реагировать несколькими :chefs_kiss:.

Протестировано на Ubuntu в WSL от имени обычного пользователя, столкнулся с несколькими проблемами и необходимыми действиями перед успешным запуском.

Мне пришлось сделать следующее:

  • Установить asdf[1], как указано в вашем руководстве, и nodejs[2] перед запуском скрипта

  • Выполнить sudo chown -R $(whoami):$(whoami) ~/discourse, так как у меня возникли проблемы с правами доступа[3], когда скрипт выполнял pnpm dedupe. Я не очень хорошо разбираюсь в Linux, возможно, существует более правильное решение.

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


  1. Getting Started | asdf ↩︎

  2. asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git ↩︎

  3. EACCES: permission denied, unlink '/home/coco/discourse/app/assets/javascripts/discourse-plugins/node_modules/ember-this-fallback' ↩︎

Хм. Да. Возможно, стоит проверить, установлен ли Node.js. Не уверен, как я отключил Node.js на новом компьютере.

Спасибо