開発環境を最新に保つための試み

私がこちらで嘆いたように、コードを書く時間よりも開発環境を最新の状態に保つのに時間を費やしているように感じることがよくあります。

Discourseを起動するためのスクリプトがあり、多くの環境設定とその他の処理を行っています。今日はnodejsの正しいバージョンを取得するのに失敗し、さらに多くの時間をそれに費やしました。asdfからのノイズの多い出力をgrepで除外するなどの作業も行いました。以下はDiscourseを更新するセクションです。

これは以下のことを行います。

  • all-the-pluginsおよびall-the-themesリポジトリを取得または更新します。これらは、物事を行う方法の例を見つけるのに非常に役立ちます。過去100分以内にダウンロードされた場合は、この手順をスキップします。
  • 最新のベースリリースをdocker pullします(この重要な手順を省略したことが、今日私が多くの時間を費やした理由です。discourse_dockergit 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:でリアクションできたらいいのに。\n\nWSL上のUbuntuで非rootユーザーとしてテストしたところ、いくつか問題に遭遇し、正常に実行する前にいくつか作業を行う必要がありました。\n\n実行したのは以下の通りです。\n\n- ガイドに記載されている通り、スクリプトを実行する前にasdf[^asdf]とnodejs[^njs]をインストールしました。\n\n- スクリプトがpnpm dedupeを実行した際に権限の問題[^pi]が発生したため、sudo chown -R $(whoami):$(whoami) ~/discourseを実行しました。Linuxにはそれほど詳しくないので、もっと適切な解決策があるかもしれません。\n\n[^asdf]: https://asdf-vm.com/guide/getting-started.html\n[^njs]: asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git\n[^pi]: EACCES: permission denied, unlink '/home/coco/discourse/app/assets/javascripts/discourse-plugins/node_modules/ember-this-fallback'\n\nこのガイドをさらに見やすくするための小さな提案ですが、コードブロックの先頭にあるパス変数を置き換えるためにプレースホルダーを使用してみてはいかがでしょうか。それほど便利になるわけではありませんが、良いタッチになると思います。 :smile:

「いいね!」 1

うーん。そうですね。nodejsがインストールされているか確認した方がいいかもしれません。新しいマシンでnodejsをどのようにインストールするかよくわかりません。

ありがとうございます

「いいね!」 1