Discourseプラグインからgitベースのgemをインストールする

まず、私はRuby on RailsとDiscourseプラグイン開発の初心者なので、より良い方法があれば教えていただけると幸いです。

概要

内部でフォークしたDiscourseプラグイン(discourse-ldap-auth)があり、git cloneで取り込んでいます。このプラグインフォークはGemフォーク(omniauth-ldap)を必要とし、これをアプリのafter_bundle_execフックで内部git URL付きのgemステートメントを追記してGemfileから取り込んでいます。アプリは再構築中にGemが見つからないため起動に失敗しますが、Gemは再構築の早い段階で正常にインストールされているように見えます。

詳細

社内メールでサインアップする必要がある、長年稼働している社内Discourseインスタンスがあります。最近、他のイントラネットサイトと同じログインを使用するためにdiscourse-ldap-authプラグインを追加しました。この設定は機能しますが、ユーザーへのプロンプトが混乱を招きます。他のほとんどのイントラネットサイトではユーザー名が必要ですが、Discourseインスタンスでは既存のアカウントに関連付けるためにメールアドレスが必要です。フィールドを変更してメールアドレスをプロンプトするようにしたいと考えています。

omniauth-ldapは、フォームテキストのソース元と思われるものですが、他のDiscourseプラグインのようにフィールドをカスタマイズするサポートがありません。これを(そしてdiscourse-ldap-authを)内部でフォークし、i18n.tへの呼び出しを追加するつもりで、フィールドが地域固有になったためカスタマイズできることを願っています。フォークの名前はomniauth-ldap-i18nです。omniauth-ldapフォークをGemfileに取り込むために、これをapp.ymlに追加しました。

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'

discourse-ldap-authフォークのplugin.rb内:

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

アプリを再構築したときの出力:

Using omniauth-ldap-i18n 1.0.0 from https://internal-git-service/omniauth-ldap-i18n.git (at master@c3cb3ed)
Bundle complete! 127 Gemfile dependencies, 187 gems now installed.
Gems in the groups 'test' and 'development' were not installed.
Bundled gems are installed into './vendor/bundle'

起動に失敗する前のエラー出力:

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

これを plugin.rb ファイルで使用すると、ローカルにインストールされたバージョンではなく、常に Rubygems から gem を取得しようとします。選択肢は次のとおりです。

  1. カスタマイズした gem バージョンを rubygems にプッシュし、>> Gemfile ハックを削除して、plugin.rbgem API を使用してインストールします。

  2. >> Gemfile ハックを削除し、プライベート rubygems サーバーをセットアップして、次のようにインストールします。

    gem 'omniauth-ldap-i18n', '1.0.0', source: "https://mygemserver.example.com"
    
  3. 当社のプラグイン gem ローダー に Git サポートを追加します。既存の機能に影響を与えずに実装できる場合は、これは pr-welcome です。

  4. plugin.rb から gem メソッド呼び出しを削除します。>> Gemfile ハックがあるため、gem は Discourse 内で自動的に利用可能になるはずです。ただし、これはハックであることを強調しておきます。コアファイルをこのようにオーバーライドすることが永続的に完全に機能することを保証できません。

「いいね!」 5

ありがとうございます。これはまだ開発中なので、うまくいくことを証明できるまで、プライベートな rubygems サーバーから始めることにします。

>> Gemfile メソッドがハックである理由が気になります。これは、追加の設定が必要な gem の templates/import/*.yml のいくつかのファイルで使用されています。これは、通常の構成では使用できない方法と見なされていますか?

「いいね!」 2

実行時に Gemfile を変更すると、Gemfile.lock にも変更が追加/変更されることになります。これは、本番環境で使用している依存関係/バージョンが、Discourse のテスト対象と一致しないことを意味します。

興味深いですね。それは知りませんでした。サイト移行中の短い期間しか使用されないため、「import」テンプレートではリスクがはるかに低いと思います。それでも、「production」テンプレートでこの手法を使用することは推奨しません。他の 3 つのオプションの方がはるかにクリーンです。

「いいね!」 5

ああ、もう一つ:コアのGemfileを変更したときに、/admin/upgrade UI経由でのアップデートが>> Gemfileのトリックで壊れると確信しています。(ローカルの変更は、アップデートをプルしようとするときにgitのコンフリクトを引き起こします)

「いいね!」 3