Replay
0 likes | 8 Views
Analyzing dependency issues in Ruby libraries targeting Redmine, focusing on the challenges faced due to plugin dependencies. The study explores scenarios of dependency problems within Redmine and its plugins, and suggests solutions for developers to resolve such issues effectively.
E N D
Redmineを対象としたRubyライブラリの 依存関係問題解析手法 コンピュータサイエンス専攻 博士前期課程2年 豊永 民哉 2024年2月8日 ソフトウェア工学講座 肥後研究室 Department of Computer Science, Graduate School of Information Science and Technology, Osaka University. Software Engineering Laboratory. - https://sel.ist.osaka-u.ac.jp
プロジェクト管理ソフトウェアRedmine 1 [1] https://www.redmine.org/
プロジェクト管理ソフトウェアRedmine:チケットプロジェクト管理ソフトウェアRedmine:チケット チケット ソフトウェア開発で頻繁に 利用されるタスク管理機能 2 [1] https://www.redmine.org/
プロジェクト管理ソフトウェアRedmine:プラグインプロジェクト管理ソフトウェアRedmine:プラグイン プラグインにより 新たな機能の追加が可能 [2] https://github.com/alphanodes/additionals [3] https://github.com/HugoHasenbein/redmine_more_previews 3
Redmineプラグインとその問題点 •Redmineのプラグイン •RedmineとプラグインはどちらもRubyライブラリに依存 •複数のプラグインをインストールすることが可能 •しかし、依存関係問題により •ビルドエラー •実行エラー •想定外の動作 4
Redmine内の依存関係 •Redmineに複数のプラグインがインストールされていた場合 •ノード:名前とバージョン •エッジ:依存関係、バージョン指定 1.0以上 1.1のみ 1.5のみ 1.5のみ Redmine 4.0 pluginA 1.1 LibraryC 1.5 LibraryE 1.5 1.2のみ 1.1以上 1.0以上 pluginB 2.1 libraryD 1.2 5
Redmineの依存関係問題 1/4 •依存関係問題[4]発生シナリオ •1. Redmine4.0のインストール •2. redmine_hourglass1.1.0のインストール •3. faker1.7.3がインストールされる •4. i18nのバージョンが決定不可に Redmine4.0 6 [4]https://github.com/hicknhack-software/redmine_hourglass/issues/139
redmineの依存関係問題 2/4 •依存関係問題[4]発生シナリオ •1. Redmine4.0のインストール •2. redmine_hourglass1.1.0のインストール •3. faker1.7.3がインストールされる •4. i18nのバージョンが決定不可に Redmine4.0 redmine_hourglass1.1.0 7 [4]https://github.com/hicknhack-software/redmine_hourglass/issues/139
redmineの依存関係問題 3/4 •依存関係問題[4]発生シナリオ •1. Redmine4.0のインストール •2. redmine_hourglass1.1.0のインストール •3. faker1.7.3がインストールされる •4. i18nのバージョンが決定不可に Redmine4.0 1.7.3のみ faker1.7.3 redmine_hourglass1.1.0 8 [4]https://github.com/hicknhack-software/redmine_hourglass/issues/139
redmineの依存関係問題 4/4 •依存関係問題[4]発生シナリオ •1. Redmine4.0のインストール •2. redmine_hourglass1.1.0のインストール •3. faker1.7.3がインストールされる 決定不可 1.6.0のみ •4. i18nのバージョンが決定不可に i18n ??? Redmine4.0 0.5以上、0.6未満 1.7.3のみ faker1.7.3 redmine_hourglass1.1.0 9 [4]https://github.com/hicknhack-software/redmine_hourglass/issues/139
開発者の依存関係問題への対応 1/2 •開発者がredmine_hourglassから fakerへのバージョン指定のみを 変更することで、依存関係問題を解消 •redmine_hourglassからfakerへの指定 •開発者の対応前:1.7.3のみ 決定不可 1.6.0のみ •開発者の対応後:2.15.1以上、2.16未満 i18n ??? Redmine4.0 0.5以上、0.6未満 1.7.3のみ faker1.7.3 redmine_hourglass1.1.0 10 [5]https://github.com/hicknhack-software/redmine_hourglass/pull/140/commits/9d1f2b936ce64d194a7d5675d4c3b629e952a0b9
開発者の依存関係問題への対応 2/2 •開発者がredmine_hourglassから fakerへのバージョン指定のみを 変更することで、依存関係問題を解消 •redmine_hourglassからfakerへの指定 •開発者の対応前:1.7.3のみ 1.6.0のみ •開発者の対応後:2.15.1以上、2.16未満 i18n1.6.0 Redmine4.0 1.6以上、2.0未満 2.15.1以上、2.16未満 faker2.15.1 redmine_hourglass1.1.0 11 [5]https://github.com/hicknhack-software/redmine_hourglass/pull/140/commits/9d1f2b936ce64d194a7d5675d4c3b629e952a0b9
関連研究 •ソフトウェア依存関係問題を取り扱った既存研究 •C#(.NET)を対象とした依存関係解決(Nufix)[6] •対象:C#の実行環境とライブラリ •手法:C#開発者の依存関係問題解決プロセスの模倣 •Pythonを対象とした依存関係解決(PyCRE)[7] •対象:アプリケーションとライブラリ •手法:Python公式ルールを考慮したヒューリスティックアルゴリズム •これらはC#やPythonなど対象言語に依存した手法であるため、 RubyやRedmineに適した依存関係解析手法が必要 12 [6] Zhenming Li et.al.NuFix: escape from NuGet dependency maze (ICSE2022) [7] Wei Cheng et.al.Conflict-aware inference of python compatible runtime environments with domain knowledge graph (ICSE2022)
本研究の課題と方針 •課題 •Redmineに適した依存関係解析手法が必要 •Rubyを対象とした解析 •Redmineプラグインの存在を考慮 •ライブラリ間の依存関係を正しく把握する 方針 •静的解析を用いてプラグイン、ライブラリの依存解析結果をデータベース化 •論理ソルバーを用いて可能性の高い解を求める 13
手法の概要 本処理 前処理 :入力 Gem Gem 前処理1 プラグイン 互換性評価 :処理 Gem プラグインリスト 各プラグインGemfile Gem GemVer ソルバーによる バージョン探索 データベース 各ライブラリの 利用可能バージョン 前処理2 ライブラリ 互換性評価 0.XX ソフトウェア バージョンリスト 互換性評価値 平均 各ライブラリの ソースコード 14
前処理1 プラグイン互換性評価:概要 依存関係のあるプラグインとライブラリ間の各バージョンについて 総当たりでスコア(互換性評価値)を求めてDBに保存 Gem Gem Gem 前処理1 プラグイン 互換性判定 各プラグインGemfile Gem GemVer データベース 各ライブラリの 利用可能バージョン 15
前処理1 プラグイン互換性評価:Gemfile •Rubyのソフトウェアが依存するライブラリとバージョン制約が 書かれたファイル redmine_hourglass-1.1.0のGemfile •Gemfileを解析することで互換性評価値 を算出する source 'https://rubygems.org' gem 'uglifier' gem 'coffee-script', '~> 2.4.1' gem 'sass', '~> 3.5.1’ gem 'pundit', '~> 1.1.0' gem 'therubyracer', :platform => :ruby gem 'slim', '~> 3.0.8' gem 'js-routes', '~> 1.3' gem 'momentjs-rails', '>= 2.10.7' •以下の行は gem 'rswag', '<2.0' gem 'rspec-core' gem 'rqrcode', '~> 0.10.1' group :development, :test do gem 'rspec-rails', '~> 3.5', '>= 3.5.2' gem 'factory_bot_rails', '< 5.0' gem 'zonebie' gem 'timecop' gem 'faker', '1.7.3' gem 'database_cleaner' end if RUBY_VERSION < •依存するライブラリとしてcofee-script バージョン制約として 2.4.1以上、2.4.2未満が指定されている例 gem 'coffee-script’, '~> 2.4.1' 16
前処理1 プラグイン-プラグイン間互換性評価値 •プラグインとライブラリの互換性について評価した値 •取得方法 •プラグインのGemfileと利用可能なライブラリのバージョンを解析 •与えられる値 •互換性のあるバージョン組み合わせ:1 •互換性のないバージョン組み合わせ:0 17
前処理1 プラグイン互換性評価:入出力 •プラグインredmine_hourglass1.1.0とライブラリcoffee-script に対するプラグイン-ライブラリ互換性評価値の算出例 Gemfileから抜き出されたcoffee-scriptに関する記述 gem 'coffee-script’, '~> 2.4.1' 利用可能なcoffee-scriptのバージョン …, 2.2.0, 2.3.0, 2.4.0, 2.4.1 18
前処理1 プラグイン互換性評価:入出力 •プラグインredmine_hourglass1.1.0とライブラリcoffee-script に対するプラグイン-ライブラリ互換性評価値の算出例 Gemfileから抜き出されたcoffee-scriptに関する記述 gem 'coffee-script’, '~> 2.4.1' 2.4.1以上かつ2.4.2未満 利用可能なcoffee-scriptのバージョン …, 2.2.0, 2.3.0, 2.4.0, 2.4.1 19
前処理1 プラグイン互換性評価:入出力 •プラグインredmine_hourglass1.1.0とライブラリcoffee-script に対するプラグイン-ライブラリ互換性評価値の算出例 Gemfileから抜き出されたcoffee-scriptに関する記述 gem 'coffee-script’, '~> 2.4.1' 算出された互換性評価値 coffee-script redmine_ hourglass … … 2.2.0 0 2.3.0 0 2.4.0 0 2.4.1 1 1.1.0 利用可能なcoffee-scriptのバージョン …, 2.2.0, 2.3.0, 2.4.0, 2.4.1 20
前処理2 ライブラリ互換性評価:概要 依存関係にあるライブラリ同士の各バージョンについて総当たりで ソースコードを解析してスコア(互換性評価値)を求め、DBに保存 前処理2 ライブラリ 互換性判定 各ライブラリの ソースコード データベース 21
前処理2 ライブラリ-ライブラリ間互換性評価値 •依存関係にあるプラグインやライブラリの互換性を それぞれのバージョンについて総当たりで評価した値 •取り得る値 •最小0、最大1を取る小数 •小数をとる理由 •依存関係問題[4]のような場合においても可能な限り実行可能性が 高いと考えられるバージョン組み合わせを探索するため 22
前処理2 ライブラリ互換性評価:入出力例 依存元ライブラリAが呼び出すAPIを依存先ライブラリBが 何種類持っているか判定し、互換性評価値を算出する 出力:ライブラリAとライブラリBの互換性評価値 入力:ライブラリAとライブラリBの各バージョン A-1.0 A-1.1 A-2.0 ライブラリB 1.0 0.66 0.50 0.50 1.1 1.00 0.75 0.85 2.0 0.75 1.00 1.00 1.0 1.1 2.0 ライブラリA B-1.0 B-1.1 B-2.0 •依存元と依存先ライブラリの各バージョンについて総当たりで互換性評価値 を算出することで出力のような表を作成する 23
本処理 互換性評価値平均 互換性評価値平均:前処理で求めた互換性評価値の平均 バージョン組み合わせごとに算出可能 B 1.0 0.8 0.5 1.1 1.0 1.0 B 1.1 1.0 1.1 A A 1.1 C C 1.1 1.0 1.0 0.5 1.1 0.75 1.0 1.0 1.1 A 24
本処理 互換性評価値平均 互換性評価値平均が高いほど実行可能性が高いと評価する B 1.0 0.8 0.5 1.1 1.0 1.0 B 1.1 1.0 1.1 A A 1.1 C C 1.1 1.0 1.0 0.5 1.1 0.75 1.0 1.0 1.1 A 互換性評価値平均:1.0 互換性評価値平均が最大になるバージョンの組み合わせを求める 25
本処理 ソルバーによる探索:解析の流れ •1.依存するライブラリと互換性評価値の取得 •プラグインリストに基づいて依存関係のあるライブラリ を特定し、その互換性判定値をデータベースから取得する プラグインリスト •2.ソルバーによるバージョン組み合わせ探索 ソルバーによる バージョン探索 •互換性評価値をソルバーに入力し、互換性評価値平均 が最大になるバージョン組み合わせを得る •ソルバーを使う理由 データベース •解の候補はライブラリの増加とともに急速に 増えるため、ソルバーを用いて解を探索する 0.XX 互換性 評価値平均 26 ソフトウェア バージョンリスト
本処理 ソルバー探索例:入力から互換性評価値の取得 入力プラグインリスト プラグインA 依存関係 プラグインA ライブラリB ライブラリC 互換性評価値 ライブラリB ライブラリC 1.0 1.0 0.0 0.0 1.1 1.0 0.0 0.0 2.0 0.0 1.0 1.0 1.0 0.7 1.0 0.4 1.1 0.8 0.7 0.5 2.0 0.6 0.5 0.6 1.0 1.1 2.0 1.0 1.1 2.0 ライブラリB プラグインA 27
本処理 ソルバー探索例:互換性評価値と出力 互換性評価値 ライブラリB ライブラリC 1.0 1.0 0.0 0.0 1.1 1.0 0.0 0.0 2.0 0.0 1.0 1.0 1.0 0.7 1.0 0.4 1.1 0.8 0.7 0.5 2.0 0.6 0.5 0.6 1.0 1.1 2.0 1.0 1.1 2.0 ライブラリB プラグインA ソフトウェアバージョンリスト 互換性評価値平均 0.95 プラグインA1.0, ライブラリB1.0, ライブラリC1.1 28
手法の適応例 概要 •依存関係問題例[4]に対して提案手法を適応し、Redmineと プラグインの実行をテスト 利用データセット •Redmine4.0 •redmine_hourglass1.1.0 •依存関係のある計171のライブラリ 検証手順 1.手法による出力結果に基づいてライブラリをインストール 2.redmineとredmine_hourglassの実行をテスト • • 29
手法の適応例 出力結果 ソフトウェアバージョンリスト プラグインリスト redmine4.0, redmine_hourglass1.1.0 listen0.4.6, rb-inotify0.10.1, rb-fsevent0.11.2, deckar01-task_list3.0.alpha2, sanitize5.2.3, ・・・ i18n0.9.5, ・・・ faker0.9.5, ・・・ 互換性評価値平均 0.87 30
手法の適応例 適応結果 検証結果 Redmineの実行中にエラーが発生 エラー原因 railtiesライブラリが依存するactivesupportライブラリ中の transform_values API欠損 エラー原因分析 提案手法ではアプリケーションの実行経路を考慮せず、 満たされる依存先ライブラリAPIの総数のみで互換性を評価 31
まとめと今後の課題 まとめ •Redmine依存関係問題を解決する手法の考案 •実例を用いた手法の評価 •依存先ライブラリのAPI不足による実行エラーの発生 今後の課題 より適切な互換性評価を行うためのAPIへの重みづけ •メソッドへのページランクアルゴリズムの適応 32