개발 환경을 최신 상태로 유지하기 위한 시도는 한 번뿐

제가 여기에서 하소연했듯이, 코드를 작성하는 시간보다 개발 환경을 최신 상태로 유지하려고 하는 데 더 많은 시간을 보내는 것 같다는 느낌을 자주 받습니다.

저는 Discourse를 다양한 ENV 설정과 함께 시작하는 데 사용하는 스크립트가 있는데, 이 스크립트는 그 외에도 여러 가지 작업을 수행합니다. 오늘은 올바른 버전의 nodejs를 가져오는 데 실패해서 이 부분을 업데이트하는 데 더 많은 시간을 보냈습니다. asdf 등에서 나오는 노이즈 있는 출력을 grep으로 제거하는 것과 같은 작업도 했습니다. 여기에는 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 "MISSING THE PLUGINS"
    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 "\nUpdating the plugins\n "
    ./reset-all-repos
  fi

  if ! [[ -d $ALL_THE_THEMES ]]; then
    echo "MISSING THE THEMES!!!"
    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 "\nUpdating themes. . . \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 "Got 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 "Got 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 "GOT NODEJS version: $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----------> Running pnpm update. . .\n"
  pnpm update
  echo -e "\n----------> Running pnpm dedupe. . .\n"
  pnpm dedupe
  echo -e "\n----------> Migrating the databases. . .\n"
  LOAD_PLUGINS=1 ./bin/rake db:migrate
  LOAD_PLUGINS=1 RAILS_ENV=test ./bin/rake db:migrate
  exit
fi

이것은 Docker를 사용하는 로컬 개발 환경을 위한 것이죠, 맞나요?

아니요. Docker 없이도 가능합니다. Docker를 사용 중이라면 이 모든 작업은 Docker 컨테이너에서 처리됩니다.

Jay, 여러 개의 :chefs_kiss: 이모지로 반응할 수 있으면 좋겠네요.

WSL에서 Ubuntu를 비루트(non-root) 사용자로 테스트해 보았는데, 성공적으로 실행하기 전에 몇 가지 문제와 사전에 처리해야 할 사항에 부딪혔습니다.

저는 다음과 같이 조치했습니다:

  • 가이드에 명시된 대로 스크립트를 실행하기 전에 asdf[1]와 nodejs[2]를 설치했습니다.

  • 스크립트가 pnpm dedupe를 실행할 때 권한 문제[3]가 발생했기 때문에 sudo chown -R $(whoami):$(whoami) ~/discourse를 실행해야 했습니다. 저는 리눅스에 완전히 능숙하지 않아서 더 적절한 해결책이 있을 수도 있습니다.

이 가이드를 더 깔끔하게 만들 작은 제안이 하나 있습니다. 코드 블록의 시작 부분에 있는 경로 변수를 플레이스홀더로 대체해 보는 건 어떨까요? 그렇게 해서 특별히 더 편해지지는 않겠지만, 좋은 마무리가 될 것 같습니다. :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' ↩︎

음. 그래요. 아마 nodejs가 설치되어 있는지 확인하는 것이 좋을 것 같아요. 새 컴퓨터에서 nodejs를 어떻게 설치하는지 잘 모르겠거든요.

감사합니다.