Buena forma de ejecutar un entorno de desarrollo

Hola a todos, solo comparto un script útil que he preparado y que me ayuda a ejecutar mi instancia de desarrollo de Discourse.

Extrae todos los últimos cambios, extrae las actualizaciones de los plugins instalados y ejecuta todas las migraciones, además de instalar los gems y paquetes de pnpm necesarios.

La desventaja del script es que también extrae los plugins incluidos en el núcleo, lo que técnicamente no haría nada ya que se actualizarían con el primer git pull. Bueno.

Nota: chatgpt.com me ayudó a escribir la lógica de la declaración if (mis experimentos iniciales fallaron).
~/rundiscourse.sh:

#!/bin/bash

cd ~/discourse
git pull
cd plugins
PLUGIN_DIR=~/discourse/plugins

for folder in "$PLUGIN_DIR"/*; do
  if [ -d "$folder/.git" ]; then
    output=$(git -C "$folder" pull)
    if ! echo "$output" | grep -q "Already up to date."; then
      echo "[$(basename "$folder")] $output"
    fi
  fi
done
cd ~/discourse
bundle install
pnpm install
bin/rails db:migrate
DISCOURSE_HOSTNAME=localhost UNICORN_LISTENER=localhost:3000 bin/ember-cli -u

Luego, ejecuta:

chmod +x rundiscourse.sh

Luego, ve al archivo ~/.bashrc (usando nano, o lo que sea), y agrega este fragmento si aún no lo tienes (está más cerca del final)

# Alias definitions.
# You may want to put all your additions into a separate file like
# ~/.bash_aliases, instead of adding them here directly.
# See /usr/share/doc/bash-doc/examples in the bash-doc package.

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

Luego, agrega lo siguiente al archivo ~/.bash_aliases:

alias discourse="~/rundiscourse.sh"

Cierra tu terminal y vuelve a abrirla.
¡Ahora, cuando ejecutes discourse en la terminal, tu entorno de desarrollo debería iniciarse!


¡Espero que esto haya ayudado! Además, háganme saber si estoy haciendo algo mal o si se puede mejorar. ¡Gracias!

1 me gusta

Nice. Un par de sugerencias.

El shebang debería ser #!/usr/bin/env sh, que es el más portable. El script no usa ningún bashismo, por lo que debería funcionar en cualquier shell compatible con Bourne shell, no solo bash.

Después del shebang, añade set -e. Esto hará que el script salga si alguno de los comandos falla. De lo contrario, continuará ejecutando comandos y fallará más tarde porque algo como bundle install falló, y la salida de error ya no está en la pantalla del usuario.

Ahora, el git pull del plugin es un poco más problemático, ya que los errores escritos en STDERR y una ejecución fallida de git no se manejarán correctamente. Así que he enviado STDERR también a STDOUT y he hecho un seguimiento del código de salida.

No hay necesidad de un montón de comandos cd, ni de establecer la variable PLUGIN_DIR.

#!/usr/bin/env sh
set -e

cd ~/discourse
git pull

for folder in plugins/*; do
  if [ -d "$folder/.git" ]; then
    exitcode=0
    output=$(git -C "$folder" pull 2>&1) || exitcode=$?
    if echo "$output" | grep -q -v "Already up to date."; then
      echo "[$(basename "$folder")]"
      echo "$output"
      [ "$exitcode" -ne 0 ] && exit "$exitcode"
    fi
  fi
done

bundle install
pnpm install
bin/rails db:migrate
DISCOURSE_HOSTNAME=localhost UNICORN_LISTENER=localhost:3000 bin/ember-cli -u

Ya tenía un script similar, excepto por el git pulling, ya que no quiero que eso suceda cada vez.

1 me gusta

¡Gracias por la información! ¡Lo intentaré!