Un intento de mantener un entorno de desarrollo actualizado

Como lamenté aquí, a menudo siento que paso más tiempo intentando mantener mi entorno de desarrollo actualizado que escribiendo código.

Tengo un script que uso para iniciar Discourse con una serie de configuraciones de ENV que también hace un montón de otras cosas. Hoy falló al obtener la versión correcta de nodejs y pasé mucho más tiempo actualizándolo. Incluso hice cosas como grep para eliminar la salida ruidosa de asdf y similares. Aquí está la sección que actualiza Discourse.

Esto es lo que hace:

  • Recupera y/o actualiza los repositorios all-the-plugins y all-the-themes. Estos son muy útiles para encontrar ejemplos de cómo hacer las cosas. Si se han descargado en los últimos 100 minutos, omite este paso.
  • docker pull la última versión base (perder este paso crucial es la razón por la que pasé mucho tiempo en esto hoy; de alguna manera pensé que hacer un git pull en discourse_docker lo haría :person_shrugging: )
  • docker run la imagen base para obtener las versiones de Ruby, Imagemagick y node; luego usa asdf para instalar y aplicar globalmente esas versiones. (Asume que tienes asdf; yo me encargo de eso en mi script newmachine).
  • En el directorio de discourse, haz checkout a main, git pull, ejecuta pnpm update y dedupe.
  • Migra la base de datos y la base de datos de prueba.

No lo he probado en ningún otro lugar que no sea Linux (Pop!_OS, que es mayormente 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: si bundler está roto, intenta `gem install bundler -v 2.5.3`

  if ! [[ -d $ALL_THE_PLUGINS ]]; then
    echo "FALTAN LOS 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 "\nActualizando los plugins\n "
    ./reset-all-repos
  fi

  if ! [[ -d $ALL_THE_THEMES ]]; then
    echo "¡¡¡FALTAN LOS TEMAS!!!"
    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 "\nActualizando temas. . .\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 "Obtenida 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 "Obtenida 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 obtener la versión de node desde el contenedor base!
  NODE_VERSION=$(docker run discourse/base:release bash -c 'node --version'|cut -d'v' -f2)
  echo "OBTENIDA versión de NODEJS: $NODE_VERSION"
  asdf install nodejs $NODE_VERSION|grep -v "already"
  asdf global nodejs $NODE_VERSION|grep -v "already"
  npm install -g pnpm

  # fin de las actualizaciones de versión
  cd $DISCOURSE_SRC
  git checkout main
  git pull
  bundle install
  echo -e "\n-----------> Ejecutando pnpm update. . .\n"
  pnpm update
  echo -e "\n-----------> Ejecutando pnpm dedupe. . .\n"
  pnpm dedupe
  echo -e "\n-----------> Migrando las bases de datos. . .\n"
  LOAD_PLUGINS=1 ./bin/rake db:migrate
  LOAD_PLUGINS=1 RAILS_ENV=test ./bin/rake db:migrate
  exit
fi
2 Me gusta

¿Esto es para entornos de desarrollo locales con Docker, correcto?

No. Sin docker. Si estás usando docker, todo esto se maneja en el contenedor de docker.

1 me gusta

Jay, ojalá pudiera reaccionar con múltiples :chefs_kiss:.

Probado en Ubuntu en WSL como no root, encontré algunos inconvenientes y cosas que hacer antes de ejecutarlo con éxito.

Solo tuve que:

  • Instalar asdf[1] como se indica en tu guía y nodejs[2] antes de ejecutar el script

  • Ejecutar sudo chown -R $(whoami):$(whoami) ~/discourse porque tuve problemas de permisos[3] cuando el script ejecutó pnpm dedupe. No hablo con fluidez Linux, así que tal vez haya una solución más adecuada.

Una pequeña sugerencia para hacer esta guía aún más pulcra, tal vez usar marcadores de posición para reemplazar las variables de ruta al principio de tu bloque de código. No es que eso lo haga mucho más conveniente, pero sería un buen detalle. :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 me gusta

Hmm. Sí. Quizás debería comprobar que nodejs está instalado. No estoy seguro de cómo instalo nodejs en una máquina nueva.

Gracias

1 me gusta