保持开发环境更新的一次尝试

正如我在此抱怨的那样,我经常觉得我花在保持开发环境最新上的时间比写代码的时间还多。

我有一个脚本,用于启动 Discourse,并设置一堆环境变量,同时还执行其他一些操作。今天,它未能获取正确的 nodejs 版本,我又花了更多时间来更新它。我甚至还做了诸如 grep asdf 的嘈杂输出之类的事情。这是更新 Discourse 的部分。

它的作用是:

  • 检索和/或更新 all-the-plugins 和 all-the-themes 存储库。这些对于查找如何做事的示例非常有用。如果它们在过去 100 分钟内已被下载,则跳过此步骤。
  • docker pull 最新的基础版本(缺少此关键步骤是我今天花费大量时间的原因——不知何故,我以为在 discourse_docker 中执行 git pull 就可以做到 :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
2 个赞

这是用于带有 Docker 的本地开发环境的,对吗?

不。不使用 Docker。如果您使用 Docker,那么所有这些都将在 Docker 容器中处理。

1 个赞

杰,我希望我能用多个 :chefs_kiss: 来回应。

在 WSL 的 Ubuntu 上以非 root 用户进行了测试,遇到了一些小麻烦,在成功运行它之前需要做一些事情。

我只需要:

  • 按照你的指南安装 asdf[1]nodejs[2],然后再运行脚本

  • 运行 sudo chown -R $(whoami):$(whoami) ~/discourse,因为在脚本运行 pnpm dedupe 时我遇到了权限问题[3]。我不是 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' ↩︎

1 个赞

嗯。是的。也许它应该检查一下是否安装了 nodejs。我不确定如何在新机器上安装 nodejs。

谢谢

1 个赞