Une tentative de maintenir un environnement Dev à jour

Comme je l’ai déploré ici, j’ai souvent l’impression de passer plus de temps à essayer de maintenir mon environnement de développement à jour qu’à écrire du code.

J’ai un script que j’utilise pour démarrer Discourse avec un tas de paramètres ENV qui fait également d’autres choses. Aujourd’hui, il n’arrivait pas à obtenir la bonne version de nodejs et j’ai passé encore plus de temps à le mettre à jour. J’ai même fait des choses comme grep pour supprimer les sorties bruyantes de asdf et autres. Voici la section qui met à jour Discourse.

Voici ce qu’il fait :

  • Récupère et/ou met à jour les dépôts all-the-plugins et all-the-themes. Ceux-ci sont très utiles pour trouver des exemples sur la façon de faire les choses. S’ils ont été téléchargés au cours des 100 dernières minutes, cette étape est ignorée.
  • docker pull la dernière version de base (l’omission de cette étape cruciale est la raison pour laquelle j’ai passé beaucoup de temps sur cela aujourd’hui - j’ai cru que faire un git pull dans discourse_docker suffirait :person_shrugging: )
  • docker run l’image de base pour obtenir les versions de Ruby, Imagemagick et node ; puis utilise asdf pour installer et appliquer globalement ces versions. (Il suppose que vous avez asdf - je gère cela dans mon script newmachine).
  • Dans le répertoire discourse, checkout main, git pull, exécute pnpm update et dedupe
  • Migre la base de données et la base de données de test

Je ne l’ai testé que sous Linux (Pop!OS, qui est principalement 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
  # NOTE: if bundler is broken, try `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 « J'aime »

C’est pour les environnements de développement locaux avec Docker, n’est-ce pas ?

Non. Sans docker. Si vous utilisez docker, tout cela est géré dans le conteneur docker.

1 « J'aime »

Jay, j’aimerais pouvoir réagir avec plusieurs :chefs_kiss:.

Testé sur Ubuntu sous WSL en tant qu’utilisateur non root, j’ai rencontré quelques problèmes et des choses à faire avant de pouvoir l’exécuter avec succès.

J’ai juste eu à :

  • Installer asdf[1] comme précisé dans votre guide et nodejs[2] avant d’exécuter le script

  • Exécuter sudo chown -R $(whoami):$(whoami) ~/discourse car j’avais des problèmes de permissions[3] lorsque le script exécutait pnpm dedupe. Je ne suis pas très à l’aise avec Linux, il y a peut-être une solution plus appropriée.

Une petite suggestion pour rendre ce guide encore plus clair, peut-être utiliser des placeholders pour remplacer les variables de chemin au début de votre bloc de code. Cela ne le rendrait pas beaucoup plus pratique, mais ce serait une belle touche. :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 « J'aime »

Hmm. Oui. Peut-être qu’il devrait vérifier que nodejs est installé. Je ne suis pas sûr de la façon dont j’installe nodejs sur une nouvelle machine.

Merci

1 « J'aime »