くりにっき

フルスタックキュアエンジニアです

Cloud FunctionsでRubyを使う時はdevelopmentやtestのgemはインストールされない

前置き

Cloud Functionsにデプロイする時には gcloud functions deploy を使います。

そこで bundle install も自動で実行されるのだけど、その時に --without development test 的なことをやってくれるのか調べてみました。(調べた範囲では公式ドキュメントには記載はなかった)

検証コード

個人アプリから適当に抜粋

Gemfile

# frozen_string_literal: true

source "https://rubygems.org"

ruby "~> 2.7.0"

git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }

gem "functions_framework"
gem "google-cloud-firestore"
gem "google-cloud-secret_manager"
gem "moji"
gem "parallel"
gem "sentry-ruby"
gem "slack-notifier"
gem "tweet_sanitizer"
gem "twitter"
gem "twitter_retry", ">= 0.2.1"

group :development do
  gem "dotenv"
end

group :test do
  gem "rspec"
end

app.rb

HTTPのリクエストがきた時に bundle list の結果を標準出力に出すだけのシンプルなコード。

GCP公式の Functions Framework を使っている以外は見慣れたRubyのコードです。

require "functions_framework"

begin
  require "dotenv/load"
rescue LoadError
end

FunctionsFramework.http("test") do |request|
  puts `bundle list`
  "test\n"
end

ローカルでの実行結果

ログに rspecdotenv がいるのを確認

$ bundle exec functions-framework-ruby --verbose --target test
I, [2021-01-23T23:32:08.699683 #4427]  INFO -- : FunctionsFramework v0.7.0
I, [2021-01-23T23:32:08.699761 #4427]  INFO -- : FunctionsFramework: Loading functions from "./app.rb"...
I, [2021-01-23T23:32:10.147408 #4427]  INFO -- : FunctionsFramework: Looking for function name "test"...
I, [2021-01-23T23:32:10.147486 #4427]  INFO -- : FunctionsFramework: Starting server...
I, [2021-01-23T23:32:10.201662 #4427]  INFO -- : FunctionsFramework: Serving function "sentry_test" on port 8080...
I, [2021-01-23T23:32:16.165209 #4427]  INFO -- : FunctionsFramework: Handling HTTP GET request
Gems included by the bundle:
  * addressable (2.7.0)
  * buftok (0.2.0)
  * cloud_events (0.1.2)
  * concurrent-ruby (1.1.8)
  * diff-lcs (1.4.4)
  * domain_name (0.5.20190701)
  * dotenv (2.7.6)
  * equalizer (0.0.11)
  * faraday (1.3.0)
  * faraday-net_http (1.0.1)
  * ffi (1.14.2)
  * ffi-compiler (1.0.1)
  * functions_framework (0.7.0)
  * gapic-common (0.3.4)
  * google-cloud-core (1.5.0)
  * google-cloud-env (1.4.0)
  * google-cloud-errors (1.0.1)
  * google-cloud-firestore (2.4.1)
  * google-cloud-firestore-v1 (0.2.3)
  * google-cloud-secret_manager (1.0.1)
  * google-cloud-secret_manager-v1 (0.5.1)
  * google-cloud-secret_manager-v1beta1 (0.6.6)
  * google-protobuf (3.14.0)
  * googleapis-common-protos (1.3.10)
  * googleapis-common-protos-types (1.0.5)
  * googleauth (0.14.0)
  * grpc (1.35.0)
  * grpc-google-iam-v1 (0.6.10)
  * http (4.4.1)
  * http-cookie (1.0.3)
  * http-form_data (2.3.0)
  * http-parser (1.2.3)
  * http_parser.rb (0.6.0)
  * jwt (2.2.2)
  * memoist (0.16.2)
  * memoizable (0.4.2)
  * moji (1.6)
  * multi_json (1.15.0)
  * multipart-post (2.1.1)
  * naught (1.1.0)
  * nio4r (2.5.4)
  * os (1.1.1)
  * parallel (1.20.1)
  * public_suffix (4.0.6)
  * puma (4.3.7)
  * rack (2.2.3)
  * rake (13.0.3)
  * rbtree (0.4.4)
  * rspec (3.10.0)
  * rspec-core (3.10.1)
  * rspec-expectations (3.10.1)
  * rspec-mocks (3.10.1)
  * rspec-support (3.10.1)
  * ruby2_keywords (0.0.4)
  * sentry-ruby (4.1.4)
  * signet (0.14.0)
  * simple_oauth (0.3.1)
  * slack-notifier (2.3.2)
  * thread_safe (0.3.6)
  * tweet_sanitizer (0.2.0)
  * twitter (7.0.0)
  * twitter_retry (0.2.1)
  * unf (0.1.4)
  * unf_ext (0.0.7.7)
Use `bundle info` to print more detailed information about a gem

Cloud Functions上での動作確認結果

コンソールから関数を実行

f:id:sue445:20210124000003p:plain

出力されたログにはdotenvやrspecがいないので bundle install --without development test が実行されてることが分かります。

f:id:sue445:20210123235704p:plain

f:id:sue445:20210123235626p:plain

あくまでドキュメント化されていない*1仕様なので今後この挙動は変わる可能性はあります。

*1:僕が見つけられなかったところに載ってる可能性はあります