BFT名古屋 TECH BLOG

日々の業務で得た知識を所属するエンジニアたちがアウトプットしていきます。

【VSCode・docker】VSCodeからのrakeコマンド実行で「LoadError: cannot load such file -- rspec/core/rake_task」が発生する

はじめに


こんにちは!
株式会社BFT名古屋支店・インフラ女子(?)のやまぐちです。

DockerfileでAnsibleとServerspecを実行できるイメージを作成しました。しかしVSCodeからコンテナに接続して「rake -T」コマンドを実行するとエラーが発しました。

今回はその対応について解決方法を残しておきます!

VSCodeからのrakeコマンド実行で「LoadError: cannot load such file -- rspec/core/rake_task」が発生する


前提条件

この現象は以下の環境で確認しています。

  • ホストOS
    • WIndows 11 Pro 22H2, OSビルド22621.1265
  • Docker Desktop for WSL2 backend
    • 4.16.3
  • コンテナ
    • RHEL9 UBI(Release 9.1)
  • VSCode
    • 1.75.1

また、AnsibleやServerspecの開発資材をローカルのフォルダに配置し、コンテナを起動する際にそのフォルダをマウントしています。
図にすると以下の通りです。

事象の詳細

コンテナの起動後にVSCodeからコンテナに接続、「rake -T」コマンドを実行すると以下のエラーが表示されました。

$ rake -T
rake aborted!
LoadError: cannot load such file -- rspec/core/rake_task
<internal:/home/ansibleuser/.rbenv/versions/3.1.3/lib/ruby/3.1.0/rubygems/core_ext/kernel_require.rb>:85:in `require'
<internal:/home/ansibleuser/.rbenv/versions/3.1.3/lib/ruby/3.1.0/rubygems/core_ext/kernel_require.rb>:85:in `require'
/home/ansibleuser/work/ansible/src/rakefile:2:in `<top (required)>'
(See full trace by running task with --trace)
[ansibleuser@c93fe7e16837 src]$ 

しかし、コンテナを起動した側のコマンドプロンプトで同じ「rake -T」コマンドを実行すると正常に表示されます。

$ rake -T
rake all                                 # Run serverspec to all test
rake serverspec:Apache_set_OS            # Run serverspec for Apache_set_OS
rake serverspec:Apache_set_httpdconf     # Run serverspec for Apache_set_httpdconf
rake serverspec:OS_Add_packages          # Run serverspec for OS_Add_packages
rake serverspec:OS_Check_runlevel        # Run serverspec for OS_Check_runlevel
rake serverspec:OS_Copy_functions        # Run serverspec for OS_Copy_functions
rake serverspec:OS_Set_hostname          # Run serverspec for OS_Set_hostname
rake serverspec:OS_Set_selinux           # Run serverspec for OS_Set_selinux
rake serverspec:OS_set_userlimit_all     # Run serverspec for OS_set_userlimit_all
rake serverspec:OS_set_userlimit_apache  # Run serverspec for OS_set_userlimit_apache

まったく仕様が理解できないですが、とりあえずVSCodeから実行するとエラーになる、ということがわかりました。

解決方法

解決するためにはrspecとansible_spec(この環境はansible_specも必要なため)パッケージをインストールします。

$ gem install rspec
Fetching diff-lcs-1.5.0.gem
Fetching rspec-expectations-3.12.2.gem
~中略~
Parsing documentation for rspec-3.12.0
Installing ri documentation for rspec-3.12.0
Done installing documentation for rspec-support, diff-lcs, rspec-mocks, rspec-expectations, rspec-core, rspec after 4 seconds
6 gems installed

ここでもう一度「rake -T」コマンドを実行すると今度は以下のエラーが表示されます。

$ rake -T
rake aborted!
LoadError: cannot load such file -- ansible_spec
<internal:/home/ansibleuser/.rbenv/versions/3.1.3/lib/ruby/3.1.0/rubygems/core_ext/kernel_require.rb>:85:in `require'
<internal:/home/ansibleuser/.rbenv/versions/3.1.3/lib/ruby/3.1.0/rubygems/core_ext/kernel_require.rb>:85:in `require'
/home/ansibleuser/work/ansible/src/rakefile:4:in `<top (required)>'
(See full trace by running task with --trace)

LoadErrorの対象がrspec/core/rake_task」から「ansible_spec」に変わっています。一つ一つインストールが必要なパッケージを確認していくとよさそうです。

$ gem install ansible_spec
Fetching little-plugger-1.1.4.gem
Fetching httpclient-2.8.3.gem
~中略~
Installing ri documentation for ansible_spec-0.3.2
Done installing documentation for rubyntlm, nori, multi_json, little-plugger, logging, httpclient, builder, gyoku, ffi, gssapi, erubi, winrm, sfl, net-telnet, net-ssh, net-scp, specinfra, rspec-its, serverspec, oj, inifile, hostlist_expression, oroku_saki, ansible-vault, ansible_spec after 13 seconds
25 gems installed

「ansible_spec」をインストール後に「rake -T」コマンドを実行します。コマンドプロンプトで実行したのと同じ実行結果を得られるようになりました。

$ rake -T
rake all                                 # Run serverspec to all test
rake serverspec:Apache_set_OS            # Run serverspec for Apache_set_OS
rake serverspec:Apache_set_httpdconf     # Run serverspec for Apache_set_httpdconf
rake serverspec:OS_Add_packages          # Run serverspec for OS_Add_packages
rake serverspec:OS_Check_runlevel        # Run serverspec for OS_Check_runlevel
rake serverspec:OS_Copy_functions        # Run serverspec for OS_Copy_functions
rake serverspec:OS_Set_hostname          # Run serverspec for OS_Set_hostname
rake serverspec:OS_Set_selinux           # Run serverspec for OS_Set_selinux
rake serverspec:OS_set_userlimit_all     # Run serverspec for OS_set_userlimit_all
rake serverspec:OS_set_userlimit_apache  # Run serverspec for OS_set_userlimit_apache

rspecもansible_specもインストール済みなのでコマンドプロンプトでは実行できます。なぜかVSCodeで接続したときには実行できません。うーん…

終わりに


もしかしたらRspec系の拡張機能をインストールすれば解決するのかもしれませんが、未確認です。Dockerイメージを作ったのにみんなに配ったらServerspec実行できない環境になってるじゃん!(泣)という問題のワークアラウンドが見つかってよかったです!

以上、ここまで読んでいただきありがとうございました~ ^ ^