Uma tentativa de manter um ambiente de Dev atualizado

Como lamentei aqui, muitas vezes sinto que passo mais tempo tentando manter meu ambiente de desenvolvimento atualizado do que escrevendo código.

Tenho um script que uso para iniciar o Discourse com várias configurações de ENV que também faz outras coisas. Hoje, ele falhou em obter a versão correta do nodejs e passei muito mais tempo atualizando-o. Cheguei a fazer coisas como grep para remover saídas barulhentas do asdf e assim por diante. Aqui está a seção que atualiza o Discourse.

Aqui está o que ele faz:

  • Recupera e/ou atualiza os repositórios all-the-plugins e all-the-themes. Eles são muito úteis para encontrar exemplos de como fazer as coisas. Se foram baixados nos últimos 100 minutos, ele pula esta etapa.
  • docker pull a última versão base (a falta desta etapa crucial é o motivo pelo qual passei muito tempo nisso hoje - de alguma forma pensei que fazer um git pull em discourse_docker faria isso :person_shrugging: )
  • docker run a imagem base para obter as versões do Ruby, Imagemagick e node; em seguida, usa asdf para instalar e aplicar globalmente essas versões. (Assume que você tem asdf - eu cuido disso no meu script newmachine).
  • No diretório discourse, faz checkout de main, git pull, executa pnpm update e dedupe
  • Migra o banco de dados e o banco de dados de teste

Não testei em nenhum outro lugar além do Linux (Pop!OS, que é majoritariamente 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 o bundler estiver quebrado, tente `gem install bundler -v 2.5.3`

  if ! [[ -d $ALL_THE_PLUGINS ]]; then
    echo "FALTANDO OS 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 "\nAtualizando os plugins\n "
    ./reset-all-repos
  fi

  if ! [[ -d $ALL_THE_THEMES ]]; then
    echo "FALTANDO OS 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 "\nAtualizando 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 "Obtido 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 "Obtido 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 obter a versão do node do container base!
  NODE_VERSION=$(docker run discourse/base:release bash -c 'node --version'|cut -d'v' -f2)
  echo "OBTIDO NODEJS version: $NODE_VERSION"
  asdf install nodejs $NODE_VERSION|grep -v "already"
  asdf global nodejs $NODE_VERSION|grep -v "already"
  npm install -g pnpm

  # fim das atualizações de versão
  cd $DISCOURSE_SRC
  git checkout main
  git pull
  bundle install
  echo -e "\n-----------> Executando pnpm update. . .\n"
  pnpm update
  echo -e "\n-----------> Executando pnpm dedupe. . .\n"
  pnpm dedupe
  echo -e "\n-----------> Migrando os bancos de dados. . .\n"
  LOAD_PLUGINS=1 ./bin/rake db:migrate
  LOAD_PLUGINS=1 RAILS_ENV=test ./bin/rake db:migrate
  exit
fi
2 curtidas

Isso é para ambientes de desenvolvimento locais com Docker, correto?

Não. Sem o Docker. Se você estiver usando o Docker, tudo isso é tratado no contêiner do Docker.

1 curtida

Jay, eu gostaria de poder reagir com múltiplos :chefs_kiss:.

Testei no Ubuntu no WSL como não-root, encontrei alguns soluços e coisas a fazer antes de executá-lo com sucesso.

Eu só precisei:

  • Instalar o asdf[1] como especificado no seu guia e o nodejs[2] antes de executar o script

  • Executar sudo chown -R $(whoami):$(whoami) ~/discourse porque tive problemas de permissão[3] quando o script executou pnpm dedupe. Eu não sou exatamente fluente em Linux, então talvez haja uma solução mais adequada.

Uma pequena sugestão para tornar este guia ainda mais organizado, talvez usar placeholders para substituir as variáveis de caminho no início do seu bloco de código. Não que isso tornaria as coisas muito mais convenientes, mas seria um toque agradável. :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 curtida

Hmm. Sim. Talvez devesse verificar se o nodejs está instalado. Não tenho certeza de como instalo o nodejs em uma nova máquina.

Obrigado

1 curtida