Как я уже отмечал здесь, я часто чувствую, что трачу больше времени на поддержание моей среды разработки в актуальном состоянии, чем на написание кода.
У меня есть скрипт, который я использую для запуска Discourse с набором переменных окружения (ENV), и который также выполняет множество других задач. Сегодня он не смог получить правильную версию nodejs, и я потратил ещё больше времени на его обновление. Я даже делал такие вещи, как использование grep для фильтрации шумного вывода от asdf и подобных утилит. Вот часть скрипта, отвечающая за обновление Discourse.
Вот что он делает:
- Получает и/или обновляет репозитории all-the-plugins и all-the-themes. Они очень полезны для поиска примеров реализации различных задач. Если они были загружены в последние 100 минут, этот шаг пропускается.
- Выполняет
docker pullдля получения последнего базового релиза (именно пропуск этого критически важного шага стал причиной того, что я сегодня потратил столько времени — somehow я думал, что достаточно сделатьgit pullв директорииdiscourse_docker
). - Запускает базовый образ через
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