Un tentativo di mantenere un ambiente di sviluppo aggiornato

Come ho lamentato qui, spesso mi sembra di passare più tempo a cercare di mantenere aggiornato il mio ambiente di sviluppo che a scrivere codice.

Ho uno script che uso per avviare Discourse con una serie di impostazioni ENV che fa anche un sacco di altre cose. Oggi non riusciva a ottenere la versione corretta di nodejs e ho passato un sacco di tempo ad aggiornarla. Ho persino fatto cose come grep per eliminare l’output rumoroso da asdf e simili. Ecco la sezione che aggiorna Discourse.

Ecco cosa fa:

  • Recupera e/o aggiorna le repository all-the-plugins e all-the-themes. Queste sono molto utili per trovare esempi su come fare le cose. Se sono state scaricate negli ultimi 100 minuti, salta questo passaggio.
  • Esegue docker pull dell’ultima release base (la mancanza di questo passaggio cruciale è il motivo per cui oggi ho passato un sacco di tempo su questo: in qualche modo pensavo che fare un git pull in discourse_docker lo avrebbe fatto :person_shrugging: )
  • Esegue docker run dell’immagine base per ottenere le versioni di Ruby, Imagemagick e node; quindi utilizza asdf per installare e applicare globalmente quelle versioni. (Presuppone che tu abbia asdf, io me ne occupo nel mio script newmachine).
  • Nella directory di discourse, esegue checkout main, git pull, pnpm update e dedupe
  • Esegue la migrazione del database e del database di test

Non l’ho testato da nessuna parte se non su Linux (Pop!OS, che è per lo più 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
  # NOTA: se bundler è rotto, prova `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 get node version from the base container!
  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

  # end of version updates
  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
2 Mi Piace

Questo è per gli ambienti di sviluppo locali con Docker, corretto?

No. Senza docker. Se stai usando docker, tutto questo viene gestito nel container docker.

1 Mi Piace

Jay, vorrei poter reagire con più :chefs_kiss:.

Testato su Ubuntu su WSL come non root, ho riscontrato alcuni intoppi e cose da fare prima di eseguirlo con successo.

Ho solo dovuto:

  • Installare asdf[1] come precisato nella tua guida e nodejs[2] prima di eseguire lo script

  • Eseguire sudo chown -R $(whoami):$(whoami) ~/discourse perché ho avuto problemi di permessi[3] quando lo script ha eseguito pnpm dedupe. Non sono esattamente fluente in Linux, quindi forse c’è una soluzione più appropriata.

Un piccolo suggerimento per rendere questa guida ancora più ordinata, forse usare segnaposto per sostituire le variabili di percorso all’inizio del tuo blocco di codice. Non che questo renderebbe le cose molto più convenienti, ma sarebbe un bel tocco. :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 Mi Piace

Hmm. Sì. Forse dovrebbe verificare che nodejs sia installato. Non sono sicuro di come installare nodejs su una nuova macchina.

Grazie

1 Mi Piace