Instalando uma gem baseada em git de um plugin do discourse

Antes de mais nada, sou novato em Ruby on Rails e no desenvolvimento de plugins do Discourse, então, se houver uma direção melhor, agradeceria.

Visão Geral

Tenho um fork interno de um plugin do Discourse (discourse-ldap-auth) que estou importando via git clone. Este fork de plugin requer um fork de Gem (omniauth-ldap) que estou importando via Gemfile, anexando a declaração gem com uma URL git interna no hook after_bundle_exec do aplicativo. O aplicativo falha ao iniciar durante a reconstrução porque não consegue encontrar a gem, mesmo que a gem pareça instalar com sucesso anteriormente na saída da reconstrução.

Detalhes

Temos uma instância interna de Discourse de longa data onde os usuários eram obrigados a se inscrever com seu e-mail corporativo. Recentemente, adicionamos o plugin discourse-ldap-auth para usar o mesmo login de outros sites da intranet. Essa configuração funciona, mas os prompts para os usuários são confusos. A maioria dos outros sites da intranet exige um nome de usuário, mas nossa instância do Discourse exige um endereço de e-mail para associá-lo a quaisquer contas existentes. Gostaria de alterar os campos para solicitar um endereço de e-mail.

O omniauth-ldap, que parece ser de onde vêm os textos do formulário, não tem suporte para personalizar campos como outros plugins do Discourse. Eu fiz um fork disso (e do discourse-ldap-auth) internamente para adicionar chamadas a i18n.t com a esperança de que eu possa personalizar os campos, já que agora eles são específicos da região. O fork é chamado omniauth-ldap-i18n. Adicionei isso ao meu app.yml para obter o fork omniauth-ldap no Gemfile:

hooks:
  after_bundle_exec:
    - exec:
        cd: $home
        cmd:
          - echo "gem 'omniauth-ldap-i18n', git:'https://internal-git-service/omniauth-ldap-i18n.git'" >> Gemfile
          - su discourse -c 'bundle config unset deployment'
          - su discourse -c 'bundle install --no-deployment --path vendor/bundle --jobs 4 --without test development'

Dentro do fork discourse-ldap-auth plugin.rb:

gem 'omniauth-ldap-i18n', '1.0.0'

A saída ao reconstruir o aplicativo:

Using omniauth-ldap-i18n 1.0.0 from https://internal-git-service/omniauth-ldap-i18n.git (at master@c3cb3ed)
Bundle complete! 127 dependências de Gemfile, 187 gems agora instaladas.
Gems nos grupos 'test' e 'development' não foram instaladas.
Gems empacotadas são instaladas em './vendor/bundle'

A saída de erro antes de falhar ao iniciar:

I, [2022-09-10T18:18:08.389538 #1]  INFO -- : > cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate'
ERROR:  Could not find a valid gem 'omniauth-ldap-i18n' (= 1.0.0) in any repository
ERROR:  Possible alternatives: omniauth-ldap-ifpe, omniauth-ldap, omniauth-ldap2, omniauth-aladin, omniauth-aliyun, omniauth-apihub, omniauth-learn, omniauth-lifen, omniauth-7digital, omniauth-aai
I, [2022-09-10T18:18:47.658658 #1]  INFO -- : gem install pyu-ruby-sasl -v 0.0.3.3 -i /var/www/discourse/plugins/discourse-ldap-auth/gems/2.7.6 --no-document --ignore-dependencies --no-user-install
Successfully installed pyu-ruby-sasl-0.0.3.3
1 gem installed
gem install rubyntlm -v 0.6.3 -i /var/www/discourse/plugins/discourse-ldap-auth/gems/2.7.6 --no-document --ignore-dependencies --no-user-install
Successfully installed rubyntlm-0.6.3
1 gem installed
gem install net-ldap -v 0.17.1 -i /var/www/discourse/plugins/discourse-ldap-auth/gems/2.7.6 --no-document --ignore-dependencies --no-user-install
Successfully installed net-ldap-0.17.1
1 gem installed
gem install omniauth-ldap-i18n -v 1.0.0 -i /var/www/discourse/plugins/discourse-ldap-auth/gems/2.7.6 --no-document --ignore-dependencies --no-user-install

You are specifying the gem omniauth-ldap-i18n in /var/www/discourse/plugins/discourse-ldap-auth/plugin.rb, however it does not exist!
Looked for: /var/www/discourse/plugins/discourse-ldap-auth/gems/2.7.6/specifications/omniauth-ldap-i18n-1.0.0.gemspec

2 curtidas

Usar isso no arquivo plugin.rb sempre tentará buscar o gem do Rubygems - ele não usará a versão instalada localmente. Acho que suas opções são:

  1. Envie sua versão personalizada do gem para o rubygems, remova o hack >> Gemfile e use a API gem do plugin.rb para instalá-lo.

  2. Remova o hack >> Gemfile, configure um servidor privado de rubygems e instale assim:

    gem 'omniauth-ldap-i18n', '1.0.0', source: "https://mygemserver.example.com"
    
  3. Adicione suporte Git ao nosso carregador de gems de plugin. Se você puder fazer isso sem afetar a funcionalidade existente, isso seria pr-welcome

  4. Remova a chamada do método gem de plugin.rb. Como você tem o hack >> Gemfile, o gem deve estar automaticamente disponível dentro do Discourse. Mas eu enfatizo que isso é um hack - não podemos garantir que substituir arquivos principais como este funcionará perfeitamente para sempre.

5 curtidas

Obrigado! Como isso ainda está em desenvolvimento, começarei com o servidor rubygems privado até que eu possa provar que vai funcionar.

Estou curioso sobre por que o método >> Gemfile é um hack. Ele é usado em vários dos arquivos em templates/import/*.yml para gems que exigem configuração extra. Essa forma de fazer as coisas é considerada proibida para configurações regulares como esta?

2 curtidas

Quando você modifica o Gemfile em tempo de execução, isso significa que ele também adicionará/alterará coisas no Gemfile.lock. Isso significa que as dependências/versões que você está usando em produção não correspondem às que testamos o Discourse.

Interessante - eu não estava ciente disso. Suponho que seja de risco muito menor para os templates de ‘importação’, já que eles são usados apenas por um curto período de tempo durante uma migração de site. Mesmo assim, eu ainda não recomendaria o uso dessa técnica em um template de ‘produção’ - qualquer uma das outras três opções seria muito mais limpa.

5 curtidas

Ah, mais uma coisa: tenho quase certeza de que o truque >> Gemfile quebrará as atualizações pela interface /admin/upgrade sempre que alterarmos o Gemfile do core. (As alterações locais causarão um conflito no git quando ele tentar puxar a atualização)

3 curtidas