前置き
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
ローカルでの実行結果
ログに rspec
や dotenv
がいるのを確認
$ 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上での動作確認結果
コンソールから関数を実行
出力されたログにはdotenvやrspecがいないので bundle install --without development test
が実行されてることが分かります。
あくまでドキュメント化されていない*1仕様なので今後この挙動は変わる可能性はあります。
*1:僕が見つけられなかったところに載ってる可能性はあります