Techioz Blog

GitHub Actions がrubocop および httpparty gem を見つけられないのはなぜですか?

概要

次のような別のディレクトリにある別の rb ファイルで httparty gem を使用するいくつかのクラスを使用して、いくつかの API 呼び出しを実行する Ruby スクリプトを開発しようとしています。

./script.rb
./lib
./lib/calls.rb

実際のコードはさらに広範ですが、簡単にするためにここでは最小限の説明に留めます。

スクリプト.rb

#!/usr/bin/env ruby
require_relative 'lib/calls'

service = Service.new
response = service.get
puts response

lib/calls.rb

require 'httparty'

class Service
  include HTTParty
  base_uri 'https://api.service.com/v1/endpoint'

  def get
    self.class.get('/')
  end
end

それは素晴らしいですね! GitHub Actions を使用して実行しようとすると、次のエラーが発生します。

<internal:/opt/hostedtoolcache/Ruby/3.2.2/x64/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:85:in `require': cannot load such file -- httparty (LoadError)
    from <internal:/opt/hostedtoolcache/Ruby/3.2.2/x64/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:85:in `require'
    from /home/runner/work/test/test/lib/calls.rb:1:in `<top (required)>'
    from ./script.rb:2:in `require_relative'
    from ./script.rb:2:in `<main>'

require ’HTTParty を大文字で使用するとこの問題が発生するという話をどこかで読みましたが、私はすべて小文字で使用しているので、そうではありません。

関連すると思われるもう 1 つの興味深い点は、GitHub Actions のコマンド ラインで直接rubocop を実行しようとすると、次の結果が得られることです。

Run rubocop --parallel
/home/runner/work/_temp/b235a1be-84fe-430b-91fb-4118542d46a3.sh: line 1: rubocop: command not found
Error: Process completed with exit code 127.

もちろんrubocopとhttppartyは両方ともインストールされており、bundle execrubocopを使用するとrubocopが実行されますが、ローカルではrubocopだけを使用して実行できます。

編集: GitHub Actions からの yaml ファイルと gem がインストールされたことの確認:

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3
      - name: Install Ruby and gems
        uses: ruby/setup-ruby@v1
        with:
          ruby-version: 3.2.2
          bundler-cache: true
      - name: Script
        run: ./script.rb
Run bundler install
...
Using httparty 0.21.0
...
Using rubocop 1.50.2
...
## 解決策
GitHub Actions でコマンドを実行する前に、bundle exec を使用することで問題を修正しました。
  • name: Script run: bundle exec script.rb

```